@nasser-sw/fabric 7.0.1-beta1 → 7.0.1-beta3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/index.js +504 -102
  2. package/dist/index.js.map +1 -1
  3. package/dist/index.min.js +1 -1
  4. package/dist/index.min.js.map +1 -1
  5. package/dist/index.min.mjs +1 -1
  6. package/dist/index.min.mjs.map +1 -1
  7. package/dist/index.mjs +504 -102
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/index.node.cjs +504 -102
  10. package/dist/index.node.cjs.map +1 -1
  11. package/dist/index.node.mjs +504 -102
  12. package/dist/index.node.mjs.map +1 -1
  13. package/dist/package.json.min.mjs +1 -1
  14. package/dist/package.json.mjs +1 -1
  15. package/dist/src/shapes/Polyline.d.ts +7 -0
  16. package/dist/src/shapes/Polyline.d.ts.map +1 -1
  17. package/dist/src/shapes/Polyline.min.mjs +1 -1
  18. package/dist/src/shapes/Polyline.min.mjs.map +1 -1
  19. package/dist/src/shapes/Polyline.mjs +48 -16
  20. package/dist/src/shapes/Polyline.mjs.map +1 -1
  21. package/dist/src/shapes/Text/Text.d.ts.map +1 -1
  22. package/dist/src/shapes/Text/Text.min.mjs +1 -1
  23. package/dist/src/shapes/Text/Text.min.mjs.map +1 -1
  24. package/dist/src/shapes/Text/Text.mjs +64 -12
  25. package/dist/src/shapes/Text/Text.mjs.map +1 -1
  26. package/dist/src/shapes/Textbox.d.ts.map +1 -1
  27. package/dist/src/shapes/Textbox.min.mjs +1 -1
  28. package/dist/src/shapes/Textbox.min.mjs.map +1 -1
  29. package/dist/src/shapes/Textbox.mjs +2 -52
  30. package/dist/src/shapes/Textbox.mjs.map +1 -1
  31. package/dist/src/shapes/Triangle.d.ts +27 -2
  32. package/dist/src/shapes/Triangle.d.ts.map +1 -1
  33. package/dist/src/shapes/Triangle.min.mjs +1 -1
  34. package/dist/src/shapes/Triangle.min.mjs.map +1 -1
  35. package/dist/src/shapes/Triangle.mjs +72 -12
  36. package/dist/src/shapes/Triangle.mjs.map +1 -1
  37. package/dist/src/text/overlayEditor.d.ts.map +1 -1
  38. package/dist/src/text/overlayEditor.min.mjs +1 -1
  39. package/dist/src/text/overlayEditor.min.mjs.map +1 -1
  40. package/dist/src/text/overlayEditor.mjs +143 -9
  41. package/dist/src/text/overlayEditor.mjs.map +1 -1
  42. package/dist/src/util/misc/cornerRadius.d.ts +70 -0
  43. package/dist/src/util/misc/cornerRadius.d.ts.map +1 -0
  44. package/dist/src/util/misc/cornerRadius.min.mjs +2 -0
  45. package/dist/src/util/misc/cornerRadius.min.mjs.map +1 -0
  46. package/dist/src/util/misc/cornerRadius.mjs +181 -0
  47. package/dist/src/util/misc/cornerRadius.mjs.map +1 -0
  48. package/dist-extensions/src/shapes/Polyline.d.ts +7 -0
  49. package/dist-extensions/src/shapes/Polyline.d.ts.map +1 -1
  50. package/dist-extensions/src/shapes/Text/Text.d.ts.map +1 -1
  51. package/dist-extensions/src/shapes/Textbox.d.ts.map +1 -1
  52. package/dist-extensions/src/shapes/Triangle.d.ts +27 -2
  53. package/dist-extensions/src/shapes/Triangle.d.ts.map +1 -1
  54. package/dist-extensions/src/text/overlayEditor.d.ts.map +1 -1
  55. package/dist-extensions/src/util/misc/cornerRadius.d.ts +70 -0
  56. package/dist-extensions/src/util/misc/cornerRadius.d.ts.map +1 -0
  57. package/fabric-test-editor.html +1048 -0
  58. package/package.json +164 -164
  59. package/src/shapes/Polyline.ts +70 -29
  60. package/src/shapes/Text/Text.ts +79 -14
  61. package/src/shapes/Textbox.ts +1 -1
  62. package/src/shapes/Triangle.spec.ts +76 -0
  63. package/src/shapes/Triangle.ts +85 -15
  64. package/src/text/overlayEditor.ts +152 -12
  65. package/src/util/misc/cornerRadius.spec.ts +141 -0
  66. package/src/util/misc/cornerRadius.ts +269 -0
@@ -1,2 +1,2 @@
1
- var a="7.0.0-beta1";export{a as version};
1
+ var a="7.0.1-beta2";export{a as version};
2
2
  //# sourceMappingURL=package.json.min.mjs.map
@@ -1,4 +1,4 @@
1
- var version = "7.0.0-beta1";
1
+ var version = "7.0.1-beta2";
2
2
 
3
3
  export { version };
4
4
  //# sourceMappingURL=package.json.mjs.map
@@ -9,6 +9,7 @@ import type { CSSRules } from '../parser/typedefs';
9
9
  export declare const polylineDefaultValues: Partial<TClassProperties<Polyline>>;
10
10
  export interface SerializedPolylineProps extends SerializedObjectProps {
11
11
  points: XY[];
12
+ cornerRadius: number;
12
13
  }
13
14
  export declare class Polyline<Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>, SProps extends SerializedPolylineProps = SerializedPolylineProps, EventSpec extends ObjectEvents = ObjectEvents> extends FabricObject<Props, SProps, EventSpec> {
14
15
  /**
@@ -26,6 +27,12 @@ export declare class Polyline<Props extends TOptions<FabricObjectProps> = Partia
26
27
  * @default false
27
28
  */
28
29
  exactBoundingBox: boolean;
30
+ /**
31
+ * Corner radius for rounded corners
32
+ * @type Number
33
+ * @default 0
34
+ */
35
+ cornerRadius: number;
29
36
  private initialized;
30
37
  static ownDefaults: Partial<TClassProperties<Polyline<Partial<FabricObjectProps>, SerializedPolylineProps, ObjectEvents>>>;
31
38
  static type: string;
@@ -1 +1 @@
1
- {"version":3,"file":"Polyline.d.ts","sourceRoot":"","sources":["../../../src/shapes/Polyline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Polyline.d.ts","sourceRoot":"","sources":["../../../src/shapes/Polyline.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{config as i}from"../config.min.mjs";import{SHARED_ATTRIBUTES as s}from"../parser/attributes.min.mjs";import{parseAttributes as e}from"../parser/parseAttributes.min.mjs";import{parsePointsAttribute as o}from"../parser/parsePointsAttribute.min.mjs";import{Point as n}from"../Point.min.mjs";import{classRegistry as r}from"../ClassRegistry.min.mjs";import{makeBoundingBoxFromPoints as h}from"../util/misc/boundingBoxFromPoints.min.mjs";import{calcDimensionsMatrix as m,transformPoint as p}from"../util/misc/matrix.min.mjs";import{projectStrokeOnPoints as a}from"../util/misc/projectStroke/index.min.mjs";import{degreesToRadians as l}from"../util/misc/radiansDegreesConversion.min.mjs";import{toFixed as f}from"../util/misc/toFixed.min.mjs";import{FabricObject as c}from"./Object/FabricObject.min.mjs";import{SKEW_X as u,SKEW_Y as d,LEFT as g,TOP as k,CENTER as w,SCALE_X as x,SCALE_Y as O}from"../constants.min.mjs";import{cacheProperties as j}from"./Object/defaultValues.min.mjs";const y={exactBoundingBox:!1};class B extends c{static getDefaults(){return{...super.getDefaults(),...B.ownDefaults}}constructor(){let i=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,B.ownDefaults),this.setOptions(s),this.points=i;const{left:e,top:o}=s;this.initialized=!0,this.setBoundingBox(!0),"number"==typeof e&&this.set(g,e),"number"==typeof o&&this.set(k,o)}isOpen(){return!0}_projectStrokeOnPoints(t){return a(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 i=this.exactBoundingBox?this._projectStrokeOnPoints(t).map(t=>t.projectedPoint):this.points;if(0===i.length)return{left:0,top:0,width:0,height:0,pathOffset:new n,strokeOffset:new n,strokeDiff:new n};const s=h(i),e=m({...t,scaleX:1,scaleY:1}),o=h(this.points.map(t=>p(t,e,!0))),r=new n(this.scaleX,this.scaleY);let a=s.left+s.width/2,f=s.top+s.height/2;return this.exactBoundingBox&&(a-=f*Math.tan(l(this.skewX)),f-=a*Math.tan(l(this.skewY))),{...s,pathOffset:new n(a,f),strokeOffset:new n(o.left,o.top).subtract(new n(s.left,s.top)).multiply(r),strokeDiff:new n(s.width,s.height).subtract(new n(o.width,o.height)).multiply(r)}}_findCenterFromElement(){const t=h(this.points);return new n(t.left+t.width/2,t.top+t.height/2)}setDimensions(){this.setBoundingBox()}setBoundingBox(t){const{left:i,top:s,width:e,height:o,pathOffset:r,strokeOffset:h,strokeDiff:m}=this._calcDimensions();this.set({width:e,height:o,pathOffset:r,strokeOffset:h,strokeDiff:m}),t&&this.setPositionByOrigin(new n(i+e/2,s+o/2),w,w)}isStrokeAccountedForInDimensions(){return this.exactBoundingBox}_getNonTransformedDimensions(){return this.exactBoundingBox?new n(this.width,this.height):super._getNonTransformedDimensions()}_getTransformedDimensions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(this.exactBoundingBox){let r;if(Object.keys(t).some(t=>this.strokeUniform||this.constructor.layoutProperties.includes(t))){var i,s;const{width:e,height:o}=this._calcDimensions(t);r=new n(null!==(i=t.width)&&void 0!==i?i:e,null!==(s=t.height)&&void 0!==s?s:o)}else{var e,o;r=new n(null!==(e=t.width)&&void 0!==e?e:this.width,null!==(o=t.height)&&void 0!==o?o:this.height)}return r.multiply(new n(t.scaleX||this.scaleX,t.scaleY||this.scaleY))}return super._getTransformedDimensions(t)}_set(t,i){const s=this.initialized&&this[t]!==i,e=super._set(t,i);return this.exactBoundingBox&&s&&((t===x||t===O)&&this.strokeUniform&&this.constructor.layoutProperties.includes("strokeUniform")||this.constructor.layoutProperties.includes(t))&&this.setDimensions(),e}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(t),points:this.points.map(t=>{let{x:i,y:s}=t;return{x:i,y:s}})}}_toSVG(){const t=[],s=this.pathOffset.x,e=this.pathOffset.y,o=i.NUM_FRACTION_DIGITS;for(let i=0,n=this.points.length;i<n;i++)t.push(f(this.points[i].x-s,o),",",f(this.points[i].y-e,o)," ");return[`<${this.constructor.type.toLowerCase()} `,"COMMON_PARTS",`points="${t.join("")}" />\n`]}_render(t){const i=this.points.length,s=this.pathOffset.x,e=this.pathOffset.y;if(i&&!isNaN(this.points[i-1].y)){t.beginPath(),t.moveTo(this.points[0].x-s,this.points[0].y-e);for(let o=0;o<i;o++){const i=this.points[o];t.lineTo(i.x-s,i.y-e)}!this.isOpen()&&t.closePath(),this._renderPaintInOrder(t)}}complexity(){return this.points.length}static async fromElement(t,i,s){const n=o(t.getAttribute("points")),{left:r,top:h,...m}=e(t,this.ATTRIBUTE_NAMES,s);return new this(n,{...m,...i})}static fromObject(t){return this._fromObject(t,{extraParam:"points"})}}t(B,"ownDefaults",y),t(B,"type","Polyline"),t(B,"layoutProperties",[u,d,"strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeWidth","strokeUniform","points"]),t(B,"cacheProperties",[...j,"points"]),t(B,"ATTRIBUTE_NAMES",[...s]),r.setClass(B),r.setSVGClass(B);export{B as Polyline,y as polylineDefaultValues};
1
+ import{defineProperty as t}from"../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{config as s}from"../config.min.mjs";import{SHARED_ATTRIBUTES as i}from"../parser/attributes.min.mjs";import{parseAttributes as e}from"../parser/parseAttributes.min.mjs";import{parsePointsAttribute as o}from"../parser/parsePointsAttribute.min.mjs";import{Point as n}from"../Point.min.mjs";import{classRegistry as r}from"../ClassRegistry.min.mjs";import{makeBoundingBoxFromPoints as h}from"../util/misc/boundingBoxFromPoints.min.mjs";import{calcDimensionsMatrix as m,transformPoint as a}from"../util/misc/matrix.min.mjs";import{projectStrokeOnPoints as p}from"../util/misc/projectStroke/index.min.mjs";import{degreesToRadians as c}from"../util/misc/radiansDegreesConversion.min.mjs";import{toFixed as l}from"../util/misc/toFixed.min.mjs";import{FabricObject as f}from"./Object/FabricObject.min.mjs";import{SKEW_X as u,SKEW_Y as d,LEFT as g,TOP as k,CENTER as w,SCALE_X as O,SCALE_Y as x}from"../constants.min.mjs";import{applyCornerRadiusToPolygon as y,generateRoundedPolygonPath as j,renderRoundedPolygon as B}from"../util/misc/cornerRadius.min.mjs";import{cacheProperties as _}from"./Object/defaultValues.min.mjs";const D={exactBoundingBox:!1,cornerRadius:0};class b extends f{static getDefaults(){return{...super.getDefaults(),...b.ownDefaults}}constructor(){let s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),t(this,"strokeDiff",void 0),Object.assign(this,b.ownDefaults),this.setOptions(i),this.points=s;const{left:e,top:o}=i;this.initialized=!0,this.setBoundingBox(!0),"number"==typeof e&&this.set(g,e),"number"==typeof o&&this.set(k,o)}isOpen(){return!0}_projectStrokeOnPoints(t){return p(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 s=this.exactBoundingBox?this._projectStrokeOnPoints(t).map(t=>t.projectedPoint):this.points;if(0===s.length)return{left:0,top:0,width:0,height:0,pathOffset:new n,strokeOffset:new n,strokeDiff:new n};const i=h(s),e=m({...t,scaleX:1,scaleY:1}),o=h(this.points.map(t=>a(t,e,!0))),r=new n(this.scaleX,this.scaleY);let p=i.left+i.width/2,l=i.top+i.height/2;return this.exactBoundingBox&&(p-=l*Math.tan(c(this.skewX)),l-=p*Math.tan(c(this.skewY))),{...i,pathOffset:new n(p,l),strokeOffset:new n(o.left,o.top).subtract(new n(i.left,i.top)).multiply(r),strokeDiff:new n(i.width,i.height).subtract(new n(o.width,o.height)).multiply(r)}}_findCenterFromElement(){const t=h(this.points);return new n(t.left+t.width/2,t.top+t.height/2)}setDimensions(){this.setBoundingBox()}setBoundingBox(t){const{left:s,top:i,width:e,height:o,pathOffset:r,strokeOffset:h,strokeDiff:m}=this._calcDimensions();this.set({width:e,height:o,pathOffset:r,strokeOffset:h,strokeDiff:m}),t&&this.setPositionByOrigin(new n(s+e/2,i+o/2),w,w)}isStrokeAccountedForInDimensions(){return this.exactBoundingBox}_getNonTransformedDimensions(){return this.exactBoundingBox?new n(this.width,this.height):super._getNonTransformedDimensions()}_getTransformedDimensions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(this.exactBoundingBox){let r;if(Object.keys(t).some(t=>this.strokeUniform||this.constructor.layoutProperties.includes(t))){var s,i;const{width:e,height:o}=this._calcDimensions(t);r=new n(null!==(s=t.width)&&void 0!==s?s:e,null!==(i=t.height)&&void 0!==i?i:o)}else{var e,o;r=new n(null!==(e=t.width)&&void 0!==e?e:this.width,null!==(o=t.height)&&void 0!==o?o:this.height)}return r.multiply(new n(t.scaleX||this.scaleX,t.scaleY||this.scaleY))}return super._getTransformedDimensions(t)}_set(t,s){const i=this.initialized&&this[t]!==s,e=super._set(t,s);return this.exactBoundingBox&&i&&((t===O||t===x)&&this.strokeUniform&&this.constructor.layoutProperties.includes("strokeUniform")||this.constructor.layoutProperties.includes(t))&&this.setDimensions(),e}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject(["cornerRadius",...t]),points:this.points.map(t=>{let{x:s,y:i}=t;return{x:s,y:i}})}}_toSVG(){if(this.cornerRadius>0&&this.points.length>=3){const t=this.pathOffset.x,s=this.pathOffset.y,i=this.points.map(i=>({x:i.x-t,y:i.y-s})),e=y(i,this.cornerRadius);return["<path ","COMMON_PARTS",`d="${j(e,!this.isOpen())}" />\n`]}{const t=[],i=this.pathOffset.x,e=this.pathOffset.y,o=s.NUM_FRACTION_DIGITS;for(let s=0,n=this.points.length;s<n;s++)t.push(l(this.points[s].x-i,o),",",l(this.points[s].y-e,o)," ");return[`<${this.constructor.type.toLowerCase()} `,"COMMON_PARTS",`points="${t.join("")}" />\n`]}}_render(t){const s=this.points.length,i=this.pathOffset.x,e=this.pathOffset.y;if(s&&!isNaN(this.points[s-1].y)){if(this.cornerRadius>0&&s>=3){const s=this.points.map(t=>({x:t.x-i,y:t.y-e})),o=y(s,this.cornerRadius);B(t,o,!this.isOpen())}else{t.beginPath(),t.moveTo(this.points[0].x-i,this.points[0].y-e);for(let o=0;o<s;o++){const s=this.points[o];t.lineTo(s.x-i,s.y-e)}!this.isOpen()&&t.closePath()}this._renderPaintInOrder(t)}}complexity(){return this.points.length}static async fromElement(t,s,i){const n=o(t.getAttribute("points")),{left:r,top:h,...m}=e(t,this.ATTRIBUTE_NAMES,i);return new this(n,{...m,...s})}static fromObject(t){return this._fromObject(t,{extraParam:"points"})}}t(b,"ownDefaults",D),t(b,"type","Polyline"),t(b,"layoutProperties",[u,d,"strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeWidth","strokeUniform","points"]),t(b,"cacheProperties",[..._,"points","cornerRadius"]),t(b,"ATTRIBUTE_NAMES",[...i]),r.setClass(b),r.setSVGClass(b);export{b as Polyline,D as polylineDefaultValues};
2
2
  //# sourceMappingURL=Polyline.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Polyline.min.mjs","sources":["../../../src/shapes/Polyline.ts"],"sourcesContent":["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<TClassProperties<Polyline>> = {\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<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject<Props, SProps, EventSpec> {\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<string, any> {\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<TProjectStrokeOnPointsOptions>) {\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<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & 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<Polyline>}\n */\n static fromObject<T extends TOptions<SerializedPolylineProps>>(object: T) {\n return this._fromObject<Polyline>(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n"],"names":["polylineDefaultValues","exactBoundingBox","Polyline","FabricObject","getDefaults","super","ownDefaults","constructor","points","arguments","length","undefined","options","_defineProperty","this","Object","assign","setOptions","left","top","initialized","setBoundingBox","set","LEFT","TOP","isOpen","_projectStrokeOnPoints","projectStrokeOnPoints","_calcDimensions","scaleX","scaleY","skewX","skewY","strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeUniform","strokeWidth","map","projection","projectedPoint","width","height","pathOffset","Point","strokeOffset","strokeDiff","bbox","makeBoundingBoxFromPoints","matrix","calcDimensionsMatrix","bboxNoStroke","p","transformPoint","scale","offsetX","offsetY","Math","tan","degreesToRadians","subtract","multiply","_findCenterFromElement","setDimensions","adjustPosition","setPositionByOrigin","CENTER","isStrokeAccountedForInDimensions","_getNonTransformedDimensions","_getTransformedDimensions","size","keys","some","key","layoutProperties","includes","_options$width","_options$height","_options$width2","_options$height2","_set","value","changed","output","SCALE_X","SCALE_Y","toObject","propertiesToInclude","_ref","x","y","_toSVG","diffX","diffY","NUM_FRACTION_DIGITS","config","i","len","push","toFixed","type","toLowerCase","join","_render","ctx","isNaN","beginPath","moveTo","point","lineTo","closePath","_renderPaintInOrder","complexity","fromElement","element","cssRules","parsePointsAttribute","getAttribute","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","object","_fromObject","extraParam","SKEW_X","SKEW_Y","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
1
+ {"version":3,"file":"Polyline.min.mjs","sources":["../../../src/shapes/Polyline.ts"],"sourcesContent":["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';\nimport {\n applyCornerRadiusToPolygon,\n renderRoundedPolygon,\n generateRoundedPolygonPath,\n} from '../util/misc/cornerRadius';\n\nexport const polylineDefaultValues: Partial<TClassProperties<Polyline>> = {\n /**\n * @deprecated transient option soon to be removed in favor of a different design\n */\n exactBoundingBox: false,\n cornerRadius: 0,\n};\n\nexport interface SerializedPolylineProps extends SerializedObjectProps {\n points: XY[];\n cornerRadius: number;\n}\n\nexport class Polyline<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject<Props, SProps, EventSpec> {\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 /**\n * Corner radius for rounded corners\n * @type Number\n * @default 0\n */\n declare cornerRadius: number;\n\n declare private initialized: true | undefined;\n\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polyline';\n\n static getDefaults(): Record<string, any> {\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', 'cornerRadius'];\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<TProjectStrokeOnPointsOptions>) {\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<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return {\n ...super.toObject(['cornerRadius', ...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 if (this.cornerRadius > 0 && this.points.length >= 3) {\n // Generate rounded polygon/polyline as path\n const diffX = this.pathOffset.x;\n const diffY = this.pathOffset.y;\n const adjustedPoints = this.points.map(point => ({\n x: point.x - diffX,\n y: point.y - diffY,\n }));\n const roundedCorners = applyCornerRadiusToPolygon(adjustedPoints, this.cornerRadius);\n const pathData = generateRoundedPolygonPath(roundedCorners, !this.isOpen());\n return ['<path ', 'COMMON_PARTS', `d=\"${pathData}\" />\\n`];\n } else {\n // Original sharp corners implementation\n const points = [];\n const diffX = this.pathOffset.x;\n const diffY = this.pathOffset.y;\n const 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 /**\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\n if (this.cornerRadius > 0 && len >= 3) {\n // Render with rounded corners\n const adjustedPoints = this.points.map(point => ({\n x: point.x - x,\n y: point.y - y,\n }));\n const roundedCorners = applyCornerRadiusToPolygon(adjustedPoints, this.cornerRadius);\n renderRoundedPolygon(ctx, roundedCorners, !this.isOpen());\n } else {\n // Original sharp corners implementation\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 }\n\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<Polyline>}\n */\n static fromObject<T extends TOptions<SerializedPolylineProps>>(object: T) {\n return this._fromObject<Polyline>(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n"],"names":["polylineDefaultValues","exactBoundingBox","cornerRadius","Polyline","FabricObject","getDefaults","super","ownDefaults","constructor","points","arguments","length","undefined","options","_defineProperty","this","Object","assign","setOptions","left","top","initialized","setBoundingBox","set","LEFT","TOP","isOpen","_projectStrokeOnPoints","projectStrokeOnPoints","_calcDimensions","scaleX","scaleY","skewX","skewY","strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeUniform","strokeWidth","map","projection","projectedPoint","width","height","pathOffset","Point","strokeOffset","strokeDiff","bbox","makeBoundingBoxFromPoints","matrix","calcDimensionsMatrix","bboxNoStroke","p","transformPoint","scale","offsetX","offsetY","Math","tan","degreesToRadians","subtract","multiply","_findCenterFromElement","setDimensions","adjustPosition","setPositionByOrigin","CENTER","isStrokeAccountedForInDimensions","_getNonTransformedDimensions","_getTransformedDimensions","size","keys","some","key","layoutProperties","includes","_options$width","_options$height","_options$width2","_options$height2","_set","value","changed","output","SCALE_X","SCALE_Y","toObject","propertiesToInclude","_ref","x","y","_toSVG","diffX","diffY","adjustedPoints","point","roundedCorners","applyCornerRadiusToPolygon","generateRoundedPolygonPath","NUM_FRACTION_DIGITS","config","i","len","push","toFixed","type","toLowerCase","join","_render","ctx","isNaN","renderRoundedPolygon","beginPath","moveTo","lineTo","closePath","_renderPaintInOrder","complexity","fromElement","element","cssRules","parsePointsAttribute","getAttribute","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","object","_fromObject","extraParam","SKEW_X","SKEW_Y","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}
@@ -12,13 +12,15 @@ import { degreesToRadians } from '../util/misc/radiansDegreesConversion.mjs';
12
12
  import { toFixed } from '../util/misc/toFixed.mjs';
13
13
  import { FabricObject } from './Object/FabricObject.mjs';
14
14
  import { SKEW_X, SKEW_Y, LEFT, TOP, CENTER, SCALE_X, SCALE_Y } from '../constants.mjs';
15
+ import { applyCornerRadiusToPolygon, generateRoundedPolygonPath, renderRoundedPolygon } from '../util/misc/cornerRadius.mjs';
15
16
  import { cacheProperties } from './Object/defaultValues.mjs';
16
17
 
17
18
  const polylineDefaultValues = {
18
19
  /**
19
20
  * @deprecated transient option soon to be removed in favor of a different design
20
21
  */
21
- exactBoundingBox: false
22
+ exactBoundingBox: false,
23
+ cornerRadius: 0
22
24
  };
23
25
  class Polyline extends FabricObject {
24
26
  static getDefaults() {
@@ -232,7 +234,7 @@ class Polyline extends FabricObject {
232
234
  toObject() {
233
235
  let propertiesToInclude = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
234
236
  return {
235
- ...super.toObject(propertiesToInclude),
237
+ ...super.toObject(['cornerRadius', ...propertiesToInclude]),
236
238
  points: this.points.map(_ref => {
237
239
  let {
238
240
  x,
@@ -252,14 +254,28 @@ class Polyline extends FabricObject {
252
254
  * of the instance
253
255
  */
254
256
  _toSVG() {
255
- const points = [],
256
- diffX = this.pathOffset.x,
257
- diffY = this.pathOffset.y,
258
- NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;
259
- for (let i = 0, len = this.points.length; i < len; i++) {
260
- points.push(toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS), ',', toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS), ' ');
257
+ if (this.cornerRadius > 0 && this.points.length >= 3) {
258
+ // Generate rounded polygon/polyline as path
259
+ const diffX = this.pathOffset.x;
260
+ const diffY = this.pathOffset.y;
261
+ const adjustedPoints = this.points.map(point => ({
262
+ x: point.x - diffX,
263
+ y: point.y - diffY
264
+ }));
265
+ const roundedCorners = applyCornerRadiusToPolygon(adjustedPoints, this.cornerRadius);
266
+ const pathData = generateRoundedPolygonPath(roundedCorners, !this.isOpen());
267
+ return ['<path ', 'COMMON_PARTS', `d="${pathData}" />\n`];
268
+ } else {
269
+ // Original sharp corners implementation
270
+ const points = [];
271
+ const diffX = this.pathOffset.x;
272
+ const diffY = this.pathOffset.y;
273
+ const NUM_FRACTION_DIGITS = config.NUM_FRACTION_DIGITS;
274
+ for (let i = 0, len = this.points.length; i < len; i++) {
275
+ points.push(toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS), ',', toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS), ' ');
276
+ }
277
+ return [`<${this.constructor.type.toLowerCase()} `, 'COMMON_PARTS', `points="${points.join('')}" />\n`];
261
278
  }
262
- return [`<${this.constructor.type.toLowerCase()} `, 'COMMON_PARTS', `points="${points.join('')}" />\n`];
263
279
  }
264
280
 
265
281
  /**
@@ -275,13 +291,24 @@ class Polyline extends FabricObject {
275
291
  // NaN comes from parseFloat of a empty string in parser
276
292
  return;
277
293
  }
278
- ctx.beginPath();
279
- ctx.moveTo(this.points[0].x - x, this.points[0].y - y);
280
- for (let i = 0; i < len; i++) {
281
- const point = this.points[i];
282
- ctx.lineTo(point.x - x, point.y - y);
294
+ if (this.cornerRadius > 0 && len >= 3) {
295
+ // Render with rounded corners
296
+ const adjustedPoints = this.points.map(point => ({
297
+ x: point.x - x,
298
+ y: point.y - y
299
+ }));
300
+ const roundedCorners = applyCornerRadiusToPolygon(adjustedPoints, this.cornerRadius);
301
+ renderRoundedPolygon(ctx, roundedCorners, !this.isOpen());
302
+ } else {
303
+ // Original sharp corners implementation
304
+ ctx.beginPath();
305
+ ctx.moveTo(this.points[0].x - x, this.points[0].y - y);
306
+ for (let i = 0; i < len; i++) {
307
+ const point = this.points[i];
308
+ ctx.lineTo(point.x - x, point.y - y);
309
+ }
310
+ !this.isOpen() && ctx.closePath();
283
311
  }
284
- !this.isOpen() && ctx.closePath();
285
312
  this._renderPaintInOrder(ctx);
286
313
  }
287
314
 
@@ -346,10 +373,15 @@ class Polyline extends FabricObject {
346
373
  * @type Boolean
347
374
  * @default false
348
375
  */
376
+ /**
377
+ * Corner radius for rounded corners
378
+ * @type Number
379
+ * @default 0
380
+ */
349
381
  _defineProperty(Polyline, "ownDefaults", polylineDefaultValues);
350
382
  _defineProperty(Polyline, "type", 'Polyline');
351
383
  _defineProperty(Polyline, "layoutProperties", [SKEW_X, SKEW_Y, 'strokeLineCap', 'strokeLineJoin', 'strokeMiterLimit', 'strokeWidth', 'strokeUniform', 'points']);
352
- _defineProperty(Polyline, "cacheProperties", [...cacheProperties, 'points']);
384
+ _defineProperty(Polyline, "cacheProperties", [...cacheProperties, 'points', 'cornerRadius']);
353
385
  _defineProperty(Polyline, "ATTRIBUTE_NAMES", [...SHARED_ATTRIBUTES]);
354
386
  classRegistry.setClass(Polyline);
355
387
  classRegistry.setSVGClass(Polyline);
@@ -1 +1 @@
1
- {"version":3,"file":"Polyline.mjs","sources":["../../../src/shapes/Polyline.ts"],"sourcesContent":["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<TClassProperties<Polyline>> = {\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<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject<Props, SProps, EventSpec> {\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<string, any> {\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<TProjectStrokeOnPointsOptions>) {\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<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & 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<Polyline>}\n */\n static fromObject<T extends TOptions<SerializedPolylineProps>>(object: T) {\n return this._fromObject<Polyline>(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n"],"names":["polylineDefaultValues","exactBoundingBox","Polyline","FabricObject","getDefaults","ownDefaults","constructor","points","arguments","length","undefined","options","_defineProperty","Object","assign","setOptions","left","top","initialized","setBoundingBox","set","LEFT","TOP","isOpen","_projectStrokeOnPoints","projectStrokeOnPoints","_calcDimensions","scaleX","scaleY","skewX","skewY","strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeUniform","strokeWidth","map","projection","projectedPoint","width","height","pathOffset","Point","strokeOffset","strokeDiff","bbox","makeBoundingBoxFromPoints","matrix","calcDimensionsMatrix","bboxNoStroke","p","transformPoint","scale","offsetX","offsetY","Math","tan","degreesToRadians","subtract","multiply","_findCenterFromElement","setDimensions","adjustPosition","setPositionByOrigin","CENTER","isStrokeAccountedForInDimensions","_getNonTransformedDimensions","_getTransformedDimensions","size","keys","some","key","layoutProperties","includes","_options$width","_options$height","_options$width2","_options$height2","_set","value","changed","output","SCALE_X","SCALE_Y","toObject","propertiesToInclude","_ref","x","y","_toSVG","diffX","diffY","NUM_FRACTION_DIGITS","config","i","len","push","toFixed","type","toLowerCase","join","_render","ctx","isNaN","beginPath","moveTo","point","lineTo","closePath","_renderPaintInOrder","complexity","fromElement","element","cssRules","parsePointsAttribute","getAttribute","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","object","_fromObject","extraParam","SKEW_X","SKEW_Y","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":";;;;;;;;;;;;;;;;AA4BO,MAAMA,qBAA0D,GAAG;AACxE;AACF;AACA;AACEC,EAAAA,gBAAgB,EAAE;AACpB;AAMO,MAAMC,QAAQ,SAIXC,YAAY,CAA2B;EAwB/C,OAAOC,WAAWA,GAAwB;IACxC,OAAO;AACL,MAAA,GAAG,KAAK,CAACA,WAAW,EAAE;AACtB,MAAA,GAAGF,QAAQ,CAACG;KACb;AACH,EAAA;;AAEA;AACF;AACA;AACA;;AAoBE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACEC,EAAAA,WAAWA,GAAkD;AAAA,IAAA,IAAjDC,MAAY,GAAAC,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,EAAE;AAAA,IAAA,IAAEG,OAAc,GAAAH,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,EAAE;AAChD,IAAA,KAAK,EAAE;IAACI,eAAA,CAAA,IAAA,EAAA,YAAA,EAAA,MAAA,CAAA;IACRC,MAAM,CAACC,MAAM,CAAC,IAAI,EAAEZ,QAAQ,CAACG,WAAW,CAAC;AACzC,IAAA,IAAI,CAACU,UAAU,CAACJ,OAAO,CAAC;IACxB,IAAI,CAACJ,MAAM,GAAGA,MAAM;IACpB,MAAM;MAAES,IAAI;AAAEC,MAAAA;AAAI,KAAC,GAAGN,OAAO;IAC7B,IAAI,CAACO,WAAW,GAAG,IAAI;AACvB,IAAA,IAAI,CAACC,cAAc,CAAC,IAAI,CAAC;IACzB,OAAOH,IAAI,KAAK,QAAQ,IAAI,IAAI,CAACI,GAAG,CAACC,IAAI,EAAEL,IAAI,CAAC;IAChD,OAAOC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAACG,GAAG,CAACE,GAAG,EAAEL,GAAG,CAAC;AAC/C,EAAA;AAEUM,EAAAA,MAAMA,GAAG;AACjB,IAAA,OAAO,IAAI;AACb,EAAA;EAEQC,sBAAsBA,CAACb,OAAsC,EAAE;AACrE,IAAA,OAAOc,qBAAqB,CAAC,IAAI,CAAClB,MAAM,EAAEI,OAAO,EAAE,IAAI,CAACY,MAAM,EAAE,CAAC;AACnE,EAAA;;AAEA;AACF;AACA;AACA;EACEG,eAAeA,CAACf,OAAgD,EAAE;AAChEA,IAAAA,OAAO,GAAG;MACRgB,MAAM,EAAE,IAAI,CAACA,MAAM;MACnBC,MAAM,EAAE,IAAI,CAACA,MAAM;MACnBC,KAAK,EAAE,IAAI,CAACA,KAAK;MACjBC,KAAK,EAAE,IAAI,CAACA,KAAK;MACjBC,aAAa,EAAE,IAAI,CAACA,aAAa;MACjCC,cAAc,EAAE,IAAI,CAACA,cAAc;MACnCC,gBAAgB,EAAE,IAAI,CAACA,gBAAgB;MACvCC,aAAa,EAAE,IAAI,CAACA,aAAa;MACjCC,WAAW,EAAE,IAAI,CAACA,WAAW;MAC7B,IAAIxB,OAAO,IAAI,EAAE;KAClB;IACD,MAAMJ,MAAM,GAAG,IAAI,CAACN,gBAAgB,GAChC,IAAI,CAACuB,sBAAsB,CACzBb,OACF,CAAC,CAACyB,GAAG,CAAEC,UAAU,IAAKA,UAAU,CAACC,cAAc,CAAC,GAChD,IAAI,CAAC/B,MAAM;AACf,IAAA,IAAIA,MAAM,CAACE,MAAM,KAAK,CAAC,EAAE;MACvB,OAAO;AACLO,QAAAA,IAAI,EAAE,CAAC;AACPC,QAAAA,GAAG,EAAE,CAAC;AACNsB,QAAAA,KAAK,EAAE,CAAC;AACRC,QAAAA,MAAM,EAAE,CAAC;AACTC,QAAAA,UAAU,EAAE,IAAIC,KAAK,EAAE;AACvBC,QAAAA,YAAY,EAAE,IAAID,KAAK,EAAE;QACzBE,UAAU,EAAE,IAAIF,KAAK;OACtB;AACH,IAAA;AACA,IAAA,MAAMG,IAAI,GAAGC,yBAAyB,CAACvC,MAAM,CAAC;AAC5C;MACAwC,MAAM,GAAGC,oBAAoB,CAAC;AAAE,QAAA,GAAGrC,OAAO;AAAEgB,QAAAA,MAAM,EAAE,CAAC;AAAEC,QAAAA,MAAM,EAAE;AAAE,OAAC,CAAC;MACnEqB,YAAY,GAAGH,yBAAyB,CACtC,IAAI,CAACvC,MAAM,CAAC6B,GAAG,CAAEc,CAAC,IAAKC,cAAc,CAACD,CAAC,EAAEH,MAAM,EAAE,IAAI,CAAC,CACxD,CAAC;MACDK,KAAK,GAAG,IAAIV,KAAK,CAAC,IAAI,CAACf,MAAM,EAAE,IAAI,CAACC,MAAM,CAAC;IAC7C,IAAIyB,OAAO,GAAGR,IAAI,CAAC7B,IAAI,GAAG6B,IAAI,CAACN,KAAK,GAAG,CAAC;MACtCe,OAAO,GAAGT,IAAI,CAAC5B,GAAG,GAAG4B,IAAI,CAACL,MAAM,GAAG,CAAC;IACtC,IAAI,IAAI,CAACvC,gBAAgB,EAAE;AACzBoD,MAAAA,OAAO,GAAGA,OAAO,GAAGC,OAAO,GAAGC,IAAI,CAACC,GAAG,CAACC,gBAAgB,CAAC,IAAI,CAAC5B,KAAK,CAAC,CAAC;AACpE;AACA;AACAyB,MAAAA,OAAO,GAAGA,OAAO,GAAGD,OAAO,GAAGE,IAAI,CAACC,GAAG,CAACC,gBAAgB,CAAC,IAAI,CAAC3B,KAAK,CAAC,CAAC;AACtE,IAAA;IAEA,OAAO;AACL,MAAA,GAAGe,IAAI;AACPJ,MAAAA,UAAU,EAAE,IAAIC,KAAK,CAACW,OAAO,EAAEC,OAAO,CAAC;AACvCX,MAAAA,YAAY,EAAE,IAAID,KAAK,CAACO,YAAY,CAACjC,IAAI,EAAEiC,YAAY,CAAChC,GAAG,CAAC,CACzDyC,QAAQ,CAAC,IAAIhB,KAAK,CAACG,IAAI,CAAC7B,IAAI,EAAE6B,IAAI,CAAC5B,GAAG,CAAC,CAAC,CACxC0C,QAAQ,CAACP,KAAK,CAAC;AAClBR,MAAAA,UAAU,EAAE,IAAIF,KAAK,CAACG,IAAI,CAACN,KAAK,EAAEM,IAAI,CAACL,MAAM,CAAC,CAC3CkB,QAAQ,CAAC,IAAIhB,KAAK,CAACO,YAAY,CAACV,KAAK,EAAEU,YAAY,CAACT,MAAM,CAAC,CAAC,CAC5DmB,QAAQ,CAACP,KAAK;KAClB;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACEQ,EAAAA,sBAAsBA,GAAU;AAC9B,IAAA,MAAMf,IAAI,GAAGC,yBAAyB,CAAC,IAAI,CAACvC,MAAM,CAAC;IACnD,OAAO,IAAImC,KAAK,CAACG,IAAI,CAAC7B,IAAI,GAAG6B,IAAI,CAACN,KAAK,GAAG,CAAC,EAAEM,IAAI,CAAC5B,GAAG,GAAG4B,IAAI,CAACL,MAAM,GAAG,CAAC,CAAC;AAC1E,EAAA;AAEAqB,EAAAA,aAAaA,GAAG;IACd,IAAI,CAAC1C,cAAc,EAAE;AACvB,EAAA;EAEAA,cAAcA,CAAC2C,cAAwB,EAAE;IACvC,MAAM;MAAE9C,IAAI;MAAEC,GAAG;MAAEsB,KAAK;MAAEC,MAAM;MAAEC,UAAU;MAAEE,YAAY;AAAEC,MAAAA;AAAW,KAAC,GACtE,IAAI,CAAClB,eAAe,EAAE;IACxB,IAAI,CAACN,GAAG,CAAC;MAAEmB,KAAK;MAAEC,MAAM;MAAEC,UAAU;MAAEE,YAAY;AAAEC,MAAAA;AAAW,KAAC,CAAC;IACjEkB,cAAc,IACZ,IAAI,CAACC,mBAAmB,CACtB,IAAIrB,KAAK,CAAC1B,IAAI,GAAGuB,KAAK,GAAG,CAAC,EAAEtB,GAAG,GAAGuB,MAAM,GAAG,CAAC,CAAC,EAC7CwB,MAAM,EACNA,MACF,CAAC;AACL,EAAA;;AAEA;AACF;AACA;AACYC,EAAAA,gCAAgCA,GAAG;IAC3C,OAAO,IAAI,CAAChE,gBAAgB;AAC9B,EAAA;;AAEA;AACF;AACA;AACEiE,EAAAA,4BAA4BA,GAAG;IAC7B,OAAO,IAAI,CAACjE,gBAAgB;AACxB;AACA,IAAA,IAAIyC,KAAK,CAAC,IAAI,CAACH,KAAK,EAAE,IAAI,CAACC,MAAM,CAAC,GAClC,KAAK,CAAC0B,4BAA4B,EAAE;AAC1C,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACEC,EAAAA,yBAAyBA,GAAoB;AAAA,IAAA,IAAnBxD,OAAY,GAAAH,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,EAAE;IACzC,IAAI,IAAI,CAACP,gBAAgB,EAAE;AACzB,MAAA,IAAImE,IAAW;AACf;AACN;AACA;AACA;MACM,IACEvD,MAAM,CAACwD,IAAI,CAAC1D,OAAO,CAAC,CAAC2D,IAAI,CACtBC,GAAG,IACF,IAAI,CAACrC,aAAa,IACjB,IAAI,CAAC5B,WAAW,CAAqBkE,gBAAgB,CAACC,QAAQ,CAC7DF,GACF,CACJ,CAAC,EACD;QAAA,IAAAG,cAAA,EAAAC,eAAA;QACA,MAAM;UAAEpC,KAAK;AAAEC,UAAAA;AAAO,SAAC,GAAG,IAAI,CAACd,eAAe,CAACf,OAAO,CAAC;QACvDyD,IAAI,GAAG,IAAI1B,KAAK,CAAA,CAAAgC,cAAA,GAAC/D,OAAO,CAAC4B,KAAK,MAAA,IAAA,IAAAmC,cAAA,KAAA,MAAA,GAAAA,cAAA,GAAInC,KAAK,EAAA,CAAAoC,eAAA,GAAEhE,OAAO,CAAC6B,MAAM,MAAA,IAAA,IAAAmC,eAAA,KAAA,MAAA,GAAAA,eAAA,GAAInC,MAAM,CAAC;AACpE,MAAA,CAAC,MAAM;QAAA,IAAAoC,eAAA,EAAAC,gBAAA;AACLT,QAAAA,IAAI,GAAG,IAAI1B,KAAK,CAAA,CAAAkC,eAAA,GACdjE,OAAO,CAAC4B,KAAK,MAAA,IAAA,IAAAqC,eAAA,KAAA,MAAA,GAAAA,eAAA,GAAI,IAAI,CAACrC,KAAK,EAAA,CAAAsC,gBAAA,GAC3BlE,OAAO,CAAC6B,MAAM,MAAA,IAAA,IAAAqC,gBAAA,KAAA,MAAA,GAAAA,gBAAA,GAAI,IAAI,CAACrC,MACzB,CAAC;AACH,MAAA;MACA,OAAO4B,IAAI,CAACT,QAAQ,CAClB,IAAIjB,KAAK,CAAC/B,OAAO,CAACgB,MAAM,IAAI,IAAI,CAACA,MAAM,EAAEhB,OAAO,CAACiB,MAAM,IAAI,IAAI,CAACA,MAAM,CACxE,CAAC;AACH,IAAA,CAAC,MAAM;AACL,MAAA,OAAO,KAAK,CAACuC,yBAAyB,CAACxD,OAAO,CAAC;AACjD,IAAA;AACF,EAAA;;AAEA;AACF;AACA;AACA;AACEmE,EAAAA,IAAIA,CAACP,GAAW,EAAEQ,KAAU,EAAE;IAC5B,MAAMC,OAAO,GAAG,IAAI,CAAC9D,WAAW,IAAI,IAAI,CAACqD,GAAG,CAAe,KAAKQ,KAAK;IACrE,MAAME,MAAM,GAAG,KAAK,CAACH,IAAI,CAACP,GAAG,EAAEQ,KAAK,CAAC;AACrC,IAAA,IACE,IAAI,CAAC9E,gBAAgB,IACrB+E,OAAO,KACL,CAACT,GAAG,KAAKW,OAAO,IAAIX,GAAG,KAAKY,OAAO,KACnC,IAAI,CAACjD,aAAa,IACjB,IAAI,CAAC5B,WAAW,CAAqBkE,gBAAgB,CAACC,QAAQ,CAC7D,eACF,CAAC,IACA,IAAI,CAACnE,WAAW,CAAqBkE,gBAAgB,CAACC,QAAQ,CAC7DF,GACF,CAAC,CAAC,EACJ;MACA,IAAI,CAACV,aAAa,EAAE;AACtB,IAAA;AACA,IAAA,OAAOoB,MAAM;AACf,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEG,EAAAA,QAAQA,GAG8C;AAAA,IAAA,IAApDC,mBAAwB,GAAA7E,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,EAAE;IAC7B,OAAO;AACL,MAAA,GAAG,KAAK,CAAC4E,QAAQ,CAACC,mBAAmB,CAAC;AACtC9E,MAAAA,MAAM,EAAE,IAAI,CAACA,MAAM,CAAC6B,GAAG,CAACkD,IAAA,IAAA;QAAA,IAAC;UAAEC,CAAC;AAAEC,UAAAA;AAAE,SAAC,GAAAF,IAAA;QAAA,OAAM;UAAEC,CAAC;AAAEC,UAAAA;SAAG;MAAA,CAAC;KACjD;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEC,EAAAA,MAAMA,GAAG;IACP,MAAMlF,MAAM,GAAG,EAAE;AACfmF,MAAAA,KAAK,GAAG,IAAI,CAACjD,UAAU,CAAC8C,CAAC;AACzBI,MAAAA,KAAK,GAAG,IAAI,CAAClD,UAAU,CAAC+C,CAAC;MACzBI,mBAAmB,GAAGC,MAAM,CAACD,mBAAmB;AAElD,IAAA,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEC,GAAG,GAAG,IAAI,CAACxF,MAAM,CAACE,MAAM,EAAEqF,CAAC,GAAGC,GAAG,EAAED,CAAC,EAAE,EAAE;AACtDvF,MAAAA,MAAM,CAACyF,IAAI,CACTC,OAAO,CAAC,IAAI,CAAC1F,MAAM,CAACuF,CAAC,CAAC,CAACP,CAAC,GAAGG,KAAK,EAAEE,mBAAmB,CAAC,EACtD,GAAG,EACHK,OAAO,CAAC,IAAI,CAAC1F,MAAM,CAACuF,CAAC,CAAC,CAACN,CAAC,GAAGG,KAAK,EAAEC,mBAAmB,CAAC,EACtD,GACF,CAAC;AACH,IAAA;IACA,OAAO,CACL,IACG,IAAI,CAACtF,WAAW,CAAqB4F,IAAI,CAACC,WAAW,EAAE,GAGvD,EACH,cAAc,EACd,CAAA,QAAA,EAAW5F,MAAM,CAAC6F,IAAI,CAAC,EAAE,CAAC,CAAA,MAAA,CAAQ,CACnC;AACH,EAAA;;AAEA;AACF;AACA;AACA;EACEC,OAAOA,CAACC,GAA6B,EAAE;AACrC,IAAA,MAAMP,GAAG,GAAG,IAAI,CAACxF,MAAM,CAACE,MAAM;AAC5B8E,MAAAA,CAAC,GAAG,IAAI,CAAC9C,UAAU,CAAC8C,CAAC;AACrBC,MAAAA,CAAC,GAAG,IAAI,CAAC/C,UAAU,CAAC+C,CAAC;AAEvB,IAAA,IAAI,CAACO,GAAG,IAAIQ,KAAK,CAAC,IAAI,CAAChG,MAAM,CAACwF,GAAG,GAAG,CAAC,CAAC,CAACP,CAAC,CAAC,EAAE;AACzC;AACA;AACA,MAAA;AACF,IAAA;IACAc,GAAG,CAACE,SAAS,EAAE;IACfF,GAAG,CAACG,MAAM,CAAC,IAAI,CAAClG,MAAM,CAAC,CAAC,CAAC,CAACgF,CAAC,GAAGA,CAAC,EAAE,IAAI,CAAChF,MAAM,CAAC,CAAC,CAAC,CAACiF,CAAC,GAAGA,CAAC,CAAC;IACtD,KAAK,IAAIM,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGC,GAAG,EAAED,CAAC,EAAE,EAAE;AAC5B,MAAA,MAAMY,KAAK,GAAG,IAAI,CAACnG,MAAM,CAACuF,CAAC,CAAC;AAC5BQ,MAAAA,GAAG,CAACK,MAAM,CAACD,KAAK,CAACnB,CAAC,GAAGA,CAAC,EAAEmB,KAAK,CAAClB,CAAC,GAAGA,CAAC,CAAC;AACtC,IAAA;IACA,CAAC,IAAI,CAACjE,MAAM,EAAE,IAAI+E,GAAG,CAACM,SAAS,EAAE;AACjC,IAAA,IAAI,CAACC,mBAAmB,CAACP,GAAG,CAAC;AAC/B,EAAA;;AAEA;AACF;AACA;AACA;AACEQ,EAAAA,UAAUA,GAAW;AACnB,IAAA,OAAO,IAAI,CAACvG,MAAM,CAACE,MAAM;AAC3B,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;;AAGE;AACF;AACA;AACA;AACA;AACE,EAAA,aAAasG,WAAWA,CACtBC,OAAiC,EACjCrG,OAAmB,EACnBsG,QAAmB,EACnB;IACA,MAAM1G,MAAM,GAAG2G,oBAAoB,CAACF,OAAO,CAACG,YAAY,CAAC,QAAQ,CAAC,CAAC;AACjE;;AAEA,MAAA;QAAEnG,IAAI;QAAEC,GAAG;QAAE,GAAGmG;OAAkB,GAAGC,eAAe,CAClDL,OAAO,EACP,IAAI,CAACM,eAAe,EACpBL,QACF,CAAC;AACH,IAAA,OAAO,IAAI,IAAI,CAAC1G,MAAM,EAAE;AACtB,MAAA,GAAG6G,gBAAgB;MACnB,GAAGzG;AACL,KAAC,CAAC;AACJ,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;AACA;EACE,OAAO4G,UAAUA,CAA8CC,MAAS,EAAE;AACxE,IAAA,OAAO,IAAI,CAACC,WAAW,CAAWD,MAAM,EAAE;AACxCE,MAAAA,UAAU,EAAE;AACd,KAAC,CAAC;AACJ,EAAA;AACF;AA7XE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AARE9G,eAAA,CAXWV,QAAQ,EAAA,aAAA,EAwBEF,qBAAqB,CAAA;AAAAY,eAAA,CAxB/BV,QAAQ,EAAA,MAAA,EA0BL,UAAU,CAAA;AAAAU,eAAA,CA1BbV,QAAQ,EAAA,kBAAA,EAuC2B,CAC5CyH,MAAM,EACNC,MAAM,EACN,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,QAAQ,CACT,CAAA;AAAAhH,eAAA,CAhDUV,QAAQ,EAAA,iBAAA,EAsDM,CAAC,GAAG2H,eAAe,EAAE,QAAQ,CAAC,CAAA;AAAAjH,eAAA,CAtD5CV,QAAQ,EAAA,iBAAA,EA4VM,CAAC,GAAG4H,iBAAiB,CAAC,CAAA;AAwCjDC,aAAa,CAACC,QAAQ,CAAC9H,QAAQ,CAAC;AAChC6H,aAAa,CAACE,WAAW,CAAC/H,QAAQ,CAAC;;;;"}
1
+ {"version":3,"file":"Polyline.mjs","sources":["../../../src/shapes/Polyline.ts"],"sourcesContent":["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';\nimport {\n applyCornerRadiusToPolygon,\n renderRoundedPolygon,\n generateRoundedPolygonPath,\n} from '../util/misc/cornerRadius';\n\nexport const polylineDefaultValues: Partial<TClassProperties<Polyline>> = {\n /**\n * @deprecated transient option soon to be removed in favor of a different design\n */\n exactBoundingBox: false,\n cornerRadius: 0,\n};\n\nexport interface SerializedPolylineProps extends SerializedObjectProps {\n points: XY[];\n cornerRadius: number;\n}\n\nexport class Polyline<\n Props extends TOptions<FabricObjectProps> = Partial<FabricObjectProps>,\n SProps extends SerializedPolylineProps = SerializedPolylineProps,\n EventSpec extends ObjectEvents = ObjectEvents,\n> extends FabricObject<Props, SProps, EventSpec> {\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 /**\n * Corner radius for rounded corners\n * @type Number\n * @default 0\n */\n declare cornerRadius: number;\n\n declare private initialized: true | undefined;\n\n static ownDefaults = polylineDefaultValues;\n\n static type = 'Polyline';\n\n static getDefaults(): Record<string, any> {\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', 'cornerRadius'];\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<TProjectStrokeOnPointsOptions>) {\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<Props & TClassProperties<this>, keyof SProps>,\n K extends keyof T = never,\n >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n return {\n ...super.toObject(['cornerRadius', ...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 if (this.cornerRadius > 0 && this.points.length >= 3) {\n // Generate rounded polygon/polyline as path\n const diffX = this.pathOffset.x;\n const diffY = this.pathOffset.y;\n const adjustedPoints = this.points.map(point => ({\n x: point.x - diffX,\n y: point.y - diffY,\n }));\n const roundedCorners = applyCornerRadiusToPolygon(adjustedPoints, this.cornerRadius);\n const pathData = generateRoundedPolygonPath(roundedCorners, !this.isOpen());\n return ['<path ', 'COMMON_PARTS', `d=\"${pathData}\" />\\n`];\n } else {\n // Original sharp corners implementation\n const points = [];\n const diffX = this.pathOffset.x;\n const diffY = this.pathOffset.y;\n const 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 /**\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\n if (this.cornerRadius > 0 && len >= 3) {\n // Render with rounded corners\n const adjustedPoints = this.points.map(point => ({\n x: point.x - x,\n y: point.y - y,\n }));\n const roundedCorners = applyCornerRadiusToPolygon(adjustedPoints, this.cornerRadius);\n renderRoundedPolygon(ctx, roundedCorners, !this.isOpen());\n } else {\n // Original sharp corners implementation\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 }\n\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<Polyline>}\n */\n static fromObject<T extends TOptions<SerializedPolylineProps>>(object: T) {\n return this._fromObject<Polyline>(object, {\n extraParam: 'points',\n });\n }\n}\n\nclassRegistry.setClass(Polyline);\nclassRegistry.setSVGClass(Polyline);\n"],"names":["polylineDefaultValues","exactBoundingBox","cornerRadius","Polyline","FabricObject","getDefaults","ownDefaults","constructor","points","arguments","length","undefined","options","_defineProperty","Object","assign","setOptions","left","top","initialized","setBoundingBox","set","LEFT","TOP","isOpen","_projectStrokeOnPoints","projectStrokeOnPoints","_calcDimensions","scaleX","scaleY","skewX","skewY","strokeLineCap","strokeLineJoin","strokeMiterLimit","strokeUniform","strokeWidth","map","projection","projectedPoint","width","height","pathOffset","Point","strokeOffset","strokeDiff","bbox","makeBoundingBoxFromPoints","matrix","calcDimensionsMatrix","bboxNoStroke","p","transformPoint","scale","offsetX","offsetY","Math","tan","degreesToRadians","subtract","multiply","_findCenterFromElement","setDimensions","adjustPosition","setPositionByOrigin","CENTER","isStrokeAccountedForInDimensions","_getNonTransformedDimensions","_getTransformedDimensions","size","keys","some","key","layoutProperties","includes","_options$width","_options$height","_options$width2","_options$height2","_set","value","changed","output","SCALE_X","SCALE_Y","toObject","propertiesToInclude","_ref","x","y","_toSVG","diffX","diffY","adjustedPoints","point","roundedCorners","applyCornerRadiusToPolygon","pathData","generateRoundedPolygonPath","NUM_FRACTION_DIGITS","config","i","len","push","toFixed","type","toLowerCase","join","_render","ctx","isNaN","renderRoundedPolygon","beginPath","moveTo","lineTo","closePath","_renderPaintInOrder","complexity","fromElement","element","cssRules","parsePointsAttribute","getAttribute","parsedAttributes","parseAttributes","ATTRIBUTE_NAMES","fromObject","object","_fromObject","extraParam","SKEW_X","SKEW_Y","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":";;;;;;;;;;;;;;;;;AAiCO,MAAMA,qBAA0D,GAAG;AACxE;AACF;AACA;AACEC,EAAAA,gBAAgB,EAAE,KAAK;AACvBC,EAAAA,YAAY,EAAE;AAChB;AAOO,MAAMC,QAAQ,SAIXC,YAAY,CAA2B;EA+B/C,OAAOC,WAAWA,GAAwB;IACxC,OAAO;AACL,MAAA,GAAG,KAAK,CAACA,WAAW,EAAE;AACtB,MAAA,GAAGF,QAAQ,CAACG;KACb;AACH,EAAA;;AAEA;AACF;AACA;AACA;;AAoBE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACEC,EAAAA,WAAWA,GAAkD;AAAA,IAAA,IAAjDC,MAAY,GAAAC,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,EAAE;AAAA,IAAA,IAAEG,OAAc,GAAAH,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,EAAE;AAChD,IAAA,KAAK,EAAE;IAACI,eAAA,CAAA,IAAA,EAAA,YAAA,EAAA,MAAA,CAAA;IACRC,MAAM,CAACC,MAAM,CAAC,IAAI,EAAEZ,QAAQ,CAACG,WAAW,CAAC;AACzC,IAAA,IAAI,CAACU,UAAU,CAACJ,OAAO,CAAC;IACxB,IAAI,CAACJ,MAAM,GAAGA,MAAM;IACpB,MAAM;MAAES,IAAI;AAAEC,MAAAA;AAAI,KAAC,GAAGN,OAAO;IAC7B,IAAI,CAACO,WAAW,GAAG,IAAI;AACvB,IAAA,IAAI,CAACC,cAAc,CAAC,IAAI,CAAC;IACzB,OAAOH,IAAI,KAAK,QAAQ,IAAI,IAAI,CAACI,GAAG,CAACC,IAAI,EAAEL,IAAI,CAAC;IAChD,OAAOC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAACG,GAAG,CAACE,GAAG,EAAEL,GAAG,CAAC;AAC/C,EAAA;AAEUM,EAAAA,MAAMA,GAAG;AACjB,IAAA,OAAO,IAAI;AACb,EAAA;EAEQC,sBAAsBA,CAACb,OAAsC,EAAE;AACrE,IAAA,OAAOc,qBAAqB,CAAC,IAAI,CAAClB,MAAM,EAAEI,OAAO,EAAE,IAAI,CAACY,MAAM,EAAE,CAAC;AACnE,EAAA;;AAEA;AACF;AACA;AACA;EACEG,eAAeA,CAACf,OAAgD,EAAE;AAChEA,IAAAA,OAAO,GAAG;MACRgB,MAAM,EAAE,IAAI,CAACA,MAAM;MACnBC,MAAM,EAAE,IAAI,CAACA,MAAM;MACnBC,KAAK,EAAE,IAAI,CAACA,KAAK;MACjBC,KAAK,EAAE,IAAI,CAACA,KAAK;MACjBC,aAAa,EAAE,IAAI,CAACA,aAAa;MACjCC,cAAc,EAAE,IAAI,CAACA,cAAc;MACnCC,gBAAgB,EAAE,IAAI,CAACA,gBAAgB;MACvCC,aAAa,EAAE,IAAI,CAACA,aAAa;MACjCC,WAAW,EAAE,IAAI,CAACA,WAAW;MAC7B,IAAIxB,OAAO,IAAI,EAAE;KAClB;IACD,MAAMJ,MAAM,GAAG,IAAI,CAACP,gBAAgB,GAChC,IAAI,CAACwB,sBAAsB,CACzBb,OACF,CAAC,CAACyB,GAAG,CAAEC,UAAU,IAAKA,UAAU,CAACC,cAAc,CAAC,GAChD,IAAI,CAAC/B,MAAM;AACf,IAAA,IAAIA,MAAM,CAACE,MAAM,KAAK,CAAC,EAAE;MACvB,OAAO;AACLO,QAAAA,IAAI,EAAE,CAAC;AACPC,QAAAA,GAAG,EAAE,CAAC;AACNsB,QAAAA,KAAK,EAAE,CAAC;AACRC,QAAAA,MAAM,EAAE,CAAC;AACTC,QAAAA,UAAU,EAAE,IAAIC,KAAK,EAAE;AACvBC,QAAAA,YAAY,EAAE,IAAID,KAAK,EAAE;QACzBE,UAAU,EAAE,IAAIF,KAAK;OACtB;AACH,IAAA;AACA,IAAA,MAAMG,IAAI,GAAGC,yBAAyB,CAACvC,MAAM,CAAC;AAC5C;MACAwC,MAAM,GAAGC,oBAAoB,CAAC;AAAE,QAAA,GAAGrC,OAAO;AAAEgB,QAAAA,MAAM,EAAE,CAAC;AAAEC,QAAAA,MAAM,EAAE;AAAE,OAAC,CAAC;MACnEqB,YAAY,GAAGH,yBAAyB,CACtC,IAAI,CAACvC,MAAM,CAAC6B,GAAG,CAAEc,CAAC,IAAKC,cAAc,CAACD,CAAC,EAAEH,MAAM,EAAE,IAAI,CAAC,CACxD,CAAC;MACDK,KAAK,GAAG,IAAIV,KAAK,CAAC,IAAI,CAACf,MAAM,EAAE,IAAI,CAACC,MAAM,CAAC;IAC7C,IAAIyB,OAAO,GAAGR,IAAI,CAAC7B,IAAI,GAAG6B,IAAI,CAACN,KAAK,GAAG,CAAC;MACtCe,OAAO,GAAGT,IAAI,CAAC5B,GAAG,GAAG4B,IAAI,CAACL,MAAM,GAAG,CAAC;IACtC,IAAI,IAAI,CAACxC,gBAAgB,EAAE;AACzBqD,MAAAA,OAAO,GAAGA,OAAO,GAAGC,OAAO,GAAGC,IAAI,CAACC,GAAG,CAACC,gBAAgB,CAAC,IAAI,CAAC5B,KAAK,CAAC,CAAC;AACpE;AACA;AACAyB,MAAAA,OAAO,GAAGA,OAAO,GAAGD,OAAO,GAAGE,IAAI,CAACC,GAAG,CAACC,gBAAgB,CAAC,IAAI,CAAC3B,KAAK,CAAC,CAAC;AACtE,IAAA;IAEA,OAAO;AACL,MAAA,GAAGe,IAAI;AACPJ,MAAAA,UAAU,EAAE,IAAIC,KAAK,CAACW,OAAO,EAAEC,OAAO,CAAC;AACvCX,MAAAA,YAAY,EAAE,IAAID,KAAK,CAACO,YAAY,CAACjC,IAAI,EAAEiC,YAAY,CAAChC,GAAG,CAAC,CACzDyC,QAAQ,CAAC,IAAIhB,KAAK,CAACG,IAAI,CAAC7B,IAAI,EAAE6B,IAAI,CAAC5B,GAAG,CAAC,CAAC,CACxC0C,QAAQ,CAACP,KAAK,CAAC;AAClBR,MAAAA,UAAU,EAAE,IAAIF,KAAK,CAACG,IAAI,CAACN,KAAK,EAAEM,IAAI,CAACL,MAAM,CAAC,CAC3CkB,QAAQ,CAAC,IAAIhB,KAAK,CAACO,YAAY,CAACV,KAAK,EAAEU,YAAY,CAACT,MAAM,CAAC,CAAC,CAC5DmB,QAAQ,CAACP,KAAK;KAClB;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACEQ,EAAAA,sBAAsBA,GAAU;AAC9B,IAAA,MAAMf,IAAI,GAAGC,yBAAyB,CAAC,IAAI,CAACvC,MAAM,CAAC;IACnD,OAAO,IAAImC,KAAK,CAACG,IAAI,CAAC7B,IAAI,GAAG6B,IAAI,CAACN,KAAK,GAAG,CAAC,EAAEM,IAAI,CAAC5B,GAAG,GAAG4B,IAAI,CAACL,MAAM,GAAG,CAAC,CAAC;AAC1E,EAAA;AAEAqB,EAAAA,aAAaA,GAAG;IACd,IAAI,CAAC1C,cAAc,EAAE;AACvB,EAAA;EAEAA,cAAcA,CAAC2C,cAAwB,EAAE;IACvC,MAAM;MAAE9C,IAAI;MAAEC,GAAG;MAAEsB,KAAK;MAAEC,MAAM;MAAEC,UAAU;MAAEE,YAAY;AAAEC,MAAAA;AAAW,KAAC,GACtE,IAAI,CAAClB,eAAe,EAAE;IACxB,IAAI,CAACN,GAAG,CAAC;MAAEmB,KAAK;MAAEC,MAAM;MAAEC,UAAU;MAAEE,YAAY;AAAEC,MAAAA;AAAW,KAAC,CAAC;IACjEkB,cAAc,IACZ,IAAI,CAACC,mBAAmB,CACtB,IAAIrB,KAAK,CAAC1B,IAAI,GAAGuB,KAAK,GAAG,CAAC,EAAEtB,GAAG,GAAGuB,MAAM,GAAG,CAAC,CAAC,EAC7CwB,MAAM,EACNA,MACF,CAAC;AACL,EAAA;;AAEA;AACF;AACA;AACYC,EAAAA,gCAAgCA,GAAG;IAC3C,OAAO,IAAI,CAACjE,gBAAgB;AAC9B,EAAA;;AAEA;AACF;AACA;AACEkE,EAAAA,4BAA4BA,GAAG;IAC7B,OAAO,IAAI,CAAClE,gBAAgB;AACxB;AACA,IAAA,IAAI0C,KAAK,CAAC,IAAI,CAACH,KAAK,EAAE,IAAI,CAACC,MAAM,CAAC,GAClC,KAAK,CAAC0B,4BAA4B,EAAE;AAC1C,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACEC,EAAAA,yBAAyBA,GAAoB;AAAA,IAAA,IAAnBxD,OAAY,GAAAH,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,EAAE;IACzC,IAAI,IAAI,CAACR,gBAAgB,EAAE;AACzB,MAAA,IAAIoE,IAAW;AACf;AACN;AACA;AACA;MACM,IACEvD,MAAM,CAACwD,IAAI,CAAC1D,OAAO,CAAC,CAAC2D,IAAI,CACtBC,GAAG,IACF,IAAI,CAACrC,aAAa,IACjB,IAAI,CAAC5B,WAAW,CAAqBkE,gBAAgB,CAACC,QAAQ,CAC7DF,GACF,CACJ,CAAC,EACD;QAAA,IAAAG,cAAA,EAAAC,eAAA;QACA,MAAM;UAAEpC,KAAK;AAAEC,UAAAA;AAAO,SAAC,GAAG,IAAI,CAACd,eAAe,CAACf,OAAO,CAAC;QACvDyD,IAAI,GAAG,IAAI1B,KAAK,CAAA,CAAAgC,cAAA,GAAC/D,OAAO,CAAC4B,KAAK,MAAA,IAAA,IAAAmC,cAAA,KAAA,MAAA,GAAAA,cAAA,GAAInC,KAAK,EAAA,CAAAoC,eAAA,GAAEhE,OAAO,CAAC6B,MAAM,MAAA,IAAA,IAAAmC,eAAA,KAAA,MAAA,GAAAA,eAAA,GAAInC,MAAM,CAAC;AACpE,MAAA,CAAC,MAAM;QAAA,IAAAoC,eAAA,EAAAC,gBAAA;AACLT,QAAAA,IAAI,GAAG,IAAI1B,KAAK,CAAA,CAAAkC,eAAA,GACdjE,OAAO,CAAC4B,KAAK,MAAA,IAAA,IAAAqC,eAAA,KAAA,MAAA,GAAAA,eAAA,GAAI,IAAI,CAACrC,KAAK,EAAA,CAAAsC,gBAAA,GAC3BlE,OAAO,CAAC6B,MAAM,MAAA,IAAA,IAAAqC,gBAAA,KAAA,MAAA,GAAAA,gBAAA,GAAI,IAAI,CAACrC,MACzB,CAAC;AACH,MAAA;MACA,OAAO4B,IAAI,CAACT,QAAQ,CAClB,IAAIjB,KAAK,CAAC/B,OAAO,CAACgB,MAAM,IAAI,IAAI,CAACA,MAAM,EAAEhB,OAAO,CAACiB,MAAM,IAAI,IAAI,CAACA,MAAM,CACxE,CAAC;AACH,IAAA,CAAC,MAAM;AACL,MAAA,OAAO,KAAK,CAACuC,yBAAyB,CAACxD,OAAO,CAAC;AACjD,IAAA;AACF,EAAA;;AAEA;AACF;AACA;AACA;AACEmE,EAAAA,IAAIA,CAACP,GAAW,EAAEQ,KAAU,EAAE;IAC5B,MAAMC,OAAO,GAAG,IAAI,CAAC9D,WAAW,IAAI,IAAI,CAACqD,GAAG,CAAe,KAAKQ,KAAK;IACrE,MAAME,MAAM,GAAG,KAAK,CAACH,IAAI,CAACP,GAAG,EAAEQ,KAAK,CAAC;AACrC,IAAA,IACE,IAAI,CAAC/E,gBAAgB,IACrBgF,OAAO,KACL,CAACT,GAAG,KAAKW,OAAO,IAAIX,GAAG,KAAKY,OAAO,KACnC,IAAI,CAACjD,aAAa,IACjB,IAAI,CAAC5B,WAAW,CAAqBkE,gBAAgB,CAACC,QAAQ,CAC7D,eACF,CAAC,IACA,IAAI,CAACnE,WAAW,CAAqBkE,gBAAgB,CAACC,QAAQ,CAC7DF,GACF,CAAC,CAAC,EACJ;MACA,IAAI,CAACV,aAAa,EAAE;AACtB,IAAA;AACA,IAAA,OAAOoB,MAAM;AACf,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEG,EAAAA,QAAQA,GAG8C;AAAA,IAAA,IAApDC,mBAAwB,GAAA7E,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAG,EAAE;IAC7B,OAAO;MACL,GAAG,KAAK,CAAC4E,QAAQ,CAAC,CAAC,cAAc,EAAE,GAAGC,mBAAmB,CAAC,CAAC;AAC3D9E,MAAAA,MAAM,EAAE,IAAI,CAACA,MAAM,CAAC6B,GAAG,CAACkD,IAAA,IAAA;QAAA,IAAC;UAAEC,CAAC;AAAEC,UAAAA;AAAE,SAAC,GAAAF,IAAA;QAAA,OAAM;UAAEC,CAAC;AAAEC,UAAAA;SAAG;MAAA,CAAC;KACjD;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEC,EAAAA,MAAMA,GAAG;AACP,IAAA,IAAI,IAAI,CAACxF,YAAY,GAAG,CAAC,IAAI,IAAI,CAACM,MAAM,CAACE,MAAM,IAAI,CAAC,EAAE;AACpD;AACA,MAAA,MAAMiF,KAAK,GAAG,IAAI,CAACjD,UAAU,CAAC8C,CAAC;AAC/B,MAAA,MAAMI,KAAK,GAAG,IAAI,CAAClD,UAAU,CAAC+C,CAAC;MAC/B,MAAMI,cAAc,GAAG,IAAI,CAACrF,MAAM,CAAC6B,GAAG,CAACyD,KAAK,KAAK;AAC/CN,QAAAA,CAAC,EAAEM,KAAK,CAACN,CAAC,GAAGG,KAAK;AAClBF,QAAAA,CAAC,EAAEK,KAAK,CAACL,CAAC,GAAGG;AACf,OAAC,CAAC,CAAC;MACH,MAAMG,cAAc,GAAGC,0BAA0B,CAACH,cAAc,EAAE,IAAI,CAAC3F,YAAY,CAAC;AACpF,MAAA,MAAM+F,QAAQ,GAAGC,0BAA0B,CAACH,cAAc,EAAE,CAAC,IAAI,CAACvE,MAAM,EAAE,CAAC;MAC3E,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAA,GAAA,EAAMyE,QAAQ,QAAQ,CAAC;AAC3D,IAAA,CAAC,MAAM;AACL;MACA,MAAMzF,MAAM,GAAG,EAAE;AACjB,MAAA,MAAMmF,KAAK,GAAG,IAAI,CAACjD,UAAU,CAAC8C,CAAC;AAC/B,MAAA,MAAMI,KAAK,GAAG,IAAI,CAAClD,UAAU,CAAC+C,CAAC;AAC/B,MAAA,MAAMU,mBAAmB,GAAGC,MAAM,CAACD,mBAAmB;AAEtD,MAAA,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEC,GAAG,GAAG,IAAI,CAAC9F,MAAM,CAACE,MAAM,EAAE2F,CAAC,GAAGC,GAAG,EAAED,CAAC,EAAE,EAAE;AACtD7F,QAAAA,MAAM,CAAC+F,IAAI,CACTC,OAAO,CAAC,IAAI,CAAChG,MAAM,CAAC6F,CAAC,CAAC,CAACb,CAAC,GAAGG,KAAK,EAAEQ,mBAAmB,CAAC,EACtD,GAAG,EACHK,OAAO,CAAC,IAAI,CAAChG,MAAM,CAAC6F,CAAC,CAAC,CAACZ,CAAC,GAAGG,KAAK,EAAEO,mBAAmB,CAAC,EACtD,GACF,CAAC;AACH,MAAA;MACA,OAAO,CACL,IACG,IAAI,CAAC5F,WAAW,CAAqBkG,IAAI,CAACC,WAAW,EAAE,GAGvD,EACH,cAAc,EACd,CAAA,QAAA,EAAWlG,MAAM,CAACmG,IAAI,CAAC,EAAE,CAAC,CAAA,MAAA,CAAQ,CACnC;AACH,IAAA;AACF,EAAA;;AAEA;AACF;AACA;AACA;EACEC,OAAOA,CAACC,GAA6B,EAAE;AACrC,IAAA,MAAMP,GAAG,GAAG,IAAI,CAAC9F,MAAM,CAACE,MAAM;AAC5B8E,MAAAA,CAAC,GAAG,IAAI,CAAC9C,UAAU,CAAC8C,CAAC;AACrBC,MAAAA,CAAC,GAAG,IAAI,CAAC/C,UAAU,CAAC+C,CAAC;AAEvB,IAAA,IAAI,CAACa,GAAG,IAAIQ,KAAK,CAAC,IAAI,CAACtG,MAAM,CAAC8F,GAAG,GAAG,CAAC,CAAC,CAACb,CAAC,CAAC,EAAE;AACzC;AACA;AACA,MAAA;AACF,IAAA;IAEA,IAAI,IAAI,CAACvF,YAAY,GAAG,CAAC,IAAIoG,GAAG,IAAI,CAAC,EAAE;AACrC;MACA,MAAMT,cAAc,GAAG,IAAI,CAACrF,MAAM,CAAC6B,GAAG,CAACyD,KAAK,KAAK;AAC/CN,QAAAA,CAAC,EAAEM,KAAK,CAACN,CAAC,GAAGA,CAAC;AACdC,QAAAA,CAAC,EAAEK,KAAK,CAACL,CAAC,GAAGA;AACf,OAAC,CAAC,CAAC;MACH,MAAMM,cAAc,GAAGC,0BAA0B,CAACH,cAAc,EAAE,IAAI,CAAC3F,YAAY,CAAC;MACpF6G,oBAAoB,CAACF,GAAG,EAAEd,cAAc,EAAE,CAAC,IAAI,CAACvE,MAAM,EAAE,CAAC;AAC3D,IAAA,CAAC,MAAM;AACL;MACAqF,GAAG,CAACG,SAAS,EAAE;MACfH,GAAG,CAACI,MAAM,CAAC,IAAI,CAACzG,MAAM,CAAC,CAAC,CAAC,CAACgF,CAAC,GAAGA,CAAC,EAAE,IAAI,CAAChF,MAAM,CAAC,CAAC,CAAC,CAACiF,CAAC,GAAGA,CAAC,CAAC;MACtD,KAAK,IAAIY,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGC,GAAG,EAAED,CAAC,EAAE,EAAE;AAC5B,QAAA,MAAMP,KAAK,GAAG,IAAI,CAACtF,MAAM,CAAC6F,CAAC,CAAC;AAC5BQ,QAAAA,GAAG,CAACK,MAAM,CAACpB,KAAK,CAACN,CAAC,GAAGA,CAAC,EAAEM,KAAK,CAACL,CAAC,GAAGA,CAAC,CAAC;AACtC,MAAA;MACA,CAAC,IAAI,CAACjE,MAAM,EAAE,IAAIqF,GAAG,CAACM,SAAS,EAAE;AACnC,IAAA;AAEA,IAAA,IAAI,CAACC,mBAAmB,CAACP,GAAG,CAAC;AAC/B,EAAA;;AAEA;AACF;AACA;AACA;AACEQ,EAAAA,UAAUA,GAAW;AACnB,IAAA,OAAO,IAAI,CAAC7G,MAAM,CAACE,MAAM;AAC3B,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;;AAGE;AACF;AACA;AACA;AACA;AACE,EAAA,aAAa4G,WAAWA,CACtBC,OAAiC,EACjC3G,OAAmB,EACnB4G,QAAmB,EACnB;IACA,MAAMhH,MAAM,GAAGiH,oBAAoB,CAACF,OAAO,CAACG,YAAY,CAAC,QAAQ,CAAC,CAAC;AACjE;;AAEA,MAAA;QAAEzG,IAAI;QAAEC,GAAG;QAAE,GAAGyG;OAAkB,GAAGC,eAAe,CAClDL,OAAO,EACP,IAAI,CAACM,eAAe,EACpBL,QACF,CAAC;AACH,IAAA,OAAO,IAAI,IAAI,CAAChH,MAAM,EAAE;AACtB,MAAA,GAAGmH,gBAAgB;MACnB,GAAG/G;AACL,KAAC,CAAC;AACJ,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;AACA;EACE,OAAOkH,UAAUA,CAA8CC,MAAS,EAAE;AACxE,IAAA,OAAO,IAAI,CAACC,WAAW,CAAWD,MAAM,EAAE;AACxCE,MAAAA,UAAU,EAAE;AACd,KAAC,CAAC;AACJ,EAAA;AACF;AA/ZE;AACF;AACA;AACA;AAGE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGE;AACF;AACA;AACA;AACA;AAJEpH,eAAA,CAtBWV,QAAQ,EAAA,aAAA,EA+BEH,qBAAqB,CAAA;AAAAa,eAAA,CA/B/BV,QAAQ,EAAA,MAAA,EAiCL,UAAU,CAAA;AAAAU,eAAA,CAjCbV,QAAQ,EAAA,kBAAA,EA8C2B,CAC5C+H,MAAM,EACNC,MAAM,EACN,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,QAAQ,CACT,CAAA;AAAAtH,eAAA,CAvDUV,QAAQ,EAAA,iBAAA,EA6DM,CAAC,GAAGiI,eAAe,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAA;AAAAvH,eAAA,CA7D5DV,QAAQ,EAAA,iBAAA,EA8XM,CAAC,GAAGkI,iBAAiB,CAAC,CAAA;AAwCjDC,aAAa,CAACC,QAAQ,CAACpI,QAAQ,CAAC;AAChCmI,aAAa,CAACE,WAAW,CAACrI,QAAQ,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Text.d.ts","sourceRoot":"","sources":["../../../../src/shapes/Text/Text.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EACV,4BAA4B,EAC5B,SAAS,EACT,oBAAoB,EACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,KAAK,EACV,SAAS,EACT,sBAAsB,EACtB,gBAAgB,EAChB,OAAO,EACP,QAAQ,EACT,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAQjE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAGpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAevD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAmB3D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzC,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;AAE1E,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,EAAE,CAAC;CAC7B,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAGF,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,EAAE,UAAU,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,eAAe,CAAC;IAC3B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,uBAAuB,EAAE,MAAM,CAAC;IAChC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/B,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,aAAa,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC3C,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,mBACf,SAAQ,qBAAqB,EAC3B,eAAe;IACjB,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,SAAU,SAAQ,iBAAiB,EAAE,eAAe;IACnE,MAAM,EAAE,SAAS,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,UAAU,CACnB,KAAK,SAAS,QAAQ,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,EACtD,MAAM,SAAS,mBAAmB,GAAG,mBAAmB,EACxD,SAAS,SAAS,YAAY,GAAG,YAAY,CAE/C,SAAQ,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAC3C,YAAW,eAAe;IAE1B;;;;OAIG;IACH,MAAM,CAAC,oBAAoB,EAAE,MAAM,EAAE,CAAwB;IAE7D;;OAEG;IACK,UAAU,EAAE,MAAM,CAAC;IAE3B;;;;OAIG;IACK,gBAAgB,EAAE,MAAM,CAAC;IAEjC;;;;OAIG;IACK,cAAc,EAAE,MAAM,CAAC;IAE/B;;;;OAIG;IACK,QAAQ,EAAE,MAAM,CAAC;IAEjB,IAAI,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACK,QAAQ,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACK,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAEpC;;;OAGG;IACK,UAAU,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACK,SAAS,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACK,QAAQ,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACK,WAAW,EAAE,OAAO,CAAC;IAE7B;;;;OAIG;IACK,SAAS,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACK,SAAS,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACK,UAAU,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACK,WAAW,EAAE;QACnB;;;WAGG;QACH,IAAI,EAAE,MAAM,CAAC;QACb;;;WAGG;QACH,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF;;OAEG;IACK,SAAS,EAAE;QACjB;;;WAGG;QACH,IAAI,EAAE,MAAM,CAAC;QACb;;;WAGG;QACH,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF;;;OAGG;IACK,mBAAmB,EAAE,MAAM,CAAC;IAE5B,MAAM,EAAE,SAAS,CAAC;IAE1B;;;;;;;;;;;;;;;;;;;;OAoBG;IACK,IAAI,CAAC,EAAE,IAAI,CAAC;IAEpB;;;;OAIG;IACK,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAEvC;;;;OAIG;IACK,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAEnC;;;;OAIG;IACK,aAAa,EAAE,MAAM,CAAC;IAE9B;;;;OAIG;IACK,oBAAoB,EAAE,OAAO,CAAC;IAEtC;;;;OAIG;IACK,aAAa,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAEnD;;;OAGG;IACK,iBAAiB,EAAE,OAAO,CAAC;IAEnC;;;;;;;;;;;OAWG;IACK,uBAAuB,EAAE,MAAM,CAAC;IAExC;;;OAGG;IACK,eAAe,EAAE,MAAM,CAAC;IAEhC;;;;OAIG;IACK,QAAQ,EAAE,SAAS,CAAC;IAE5B;;;;;;OAMG;IACK,SAAS,EAAE,UAAU,CAAC;IAE9B;;OAEG;IACK,iBAAiB,EAAE,MAAM,CAAC;IAElC;;OAEG;IACK,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAE9E;;;OAGG;IACK,aAAa,EAAE,MAAM,CAAC;IAE9B;;;;OAIG;IACK,WAAW,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACK,MAAM,EAAE,MAAM,CAAC;IAEvB;;;;;;;;;OASG;IACK,SAAS,EAAE,eAAe,CAAC;IAEnC;;;;;OAKG;IACH,YAAY,EAAE,YAAY,EAAE,EAAE,CAAM;IAEpC;;;;;OAKG;IACK,eAAe,EAAE,MAAM,CAAC;IAEhC;;;OAGG;IACK,cAAc,EAAE,MAAM,CAAC;IAE/B;;;;OAIG;IACK,SAAS,EAAE,MAAM,EAAE,CAAC;IAE5B;;;OAGG;IACK,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC;IAEvB,mBAAmB,EAAE,MAAM,EAAE,EAAE,CAAC;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,IAAI,CAAC;IAE3B,MAAM,CAAC,eAAe,WAA4C;IAElE,MAAM,CAAC,WAAW,+FAAqB;IAEvC,MAAM,CAAC,IAAI,SAAU;IAErB,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;gBAI7B,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK;IAgBzC;;;OAGG;IACH,WAAW;IAOX;;;;OAIG;IACH,UAAU,IAAI,aAAa;IAe3B;;;OAGG;IACH,0BAA0B,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,aAAa;IAmCtE;;;;OAIG;IACH,cAAc,IAAI,IAAI;IAuBtB;;OAEG;IACH,aAAa;IAuCb;;;OAGG;IACH,mBAAmB,IAAI,YAAY;IAKnC;;;OAGG;IACH,yBAAyB,IAAI,iBAAiB;IAoB9C;;;OAGG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS;IAmBhF;;OAEG;IACH,sBAAsB,IAAI,IAAI;IAiB9B;;;OAGG;IACH,4BAA4B,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAsBxD;;;;OAIG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI3C;;;;;OAKG;IACH,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC;IAKtE;;;;OAIG;IACH,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO;;;;IAsBlE;;;OAGG;IACH,QAAQ,IAAI,MAAM;IAMlB;;;;;;;;;;OAUG;IACH,yBAAyB,IAAI,sBAAsB;IAQnD;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,wBAAwB;IAWrC;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,wBAAwB;IAczC;;;;;;;;;OASG;IACH,cAAc,CACZ,GAAG,EAAE,wBAAwB,EAC7B,SAAS,CAAC,EAAE,GAAG,EACf,YAAY,CAAC,EAAE,OAAO;IAmBxB;;;;;OAKG;IACH,aAAa,IAAI,MAAM;IAYvB;;;;;;;;OAQG;IACH,eAAe,CACb,MAAM,EAAE,UAAU,GAAG,YAAY,EACjC,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM;IAKnB;;;;OAIG;IACH,0BAA0B,CAAC,GAAG,EAAE,wBAAwB;IAkFxD;;;;;;;;;OASG;IACH,YAAY,CACV,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,4BAA4B,EACvC,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,aAAa,EAAE,4BAA4B,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;;;;IAsDrE;;;;;OAKG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAIpD;;;OAGG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM;;;;IAW7B;;;;;OAKG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM;;;;IAiE9B;;;;;;;OAOG;IACH,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY;IAWrE;;;;;;;OAOG;IACH,eAAe,CACb,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,OAAO,GACjB,YAAY;IA+Bf;;;;OAIG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAgB1C;;OAEG;IACH,cAAc;IAUd;;;OAGG;IACH,cAAc,IAAI,MAAM;IAIxB;;;OAGG;IACH,aAAa,IAAI,MAAM;IAIvB;;;;OAIG;IACH,iBAAiB,CACf,GAAG,EAAE,wBAAwB,EAC7B,MAAM,EAAE,UAAU,GAAG,YAAY;IAuBnC;;;OAGG;IACH,eAAe,CAAC,GAAG,EAAE,wBAAwB;IAQ7C;;;OAGG;IACH,iBAAiB,CAAC,GAAG,EAAE,wBAAwB;IAiB/C;;;;;;;;OAQG;IACH,YAAY,CACV,MAAM,EAAE,UAAU,GAAG,YAAY,EACjC,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,EAChB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM;IAgGnB;;;;;;;;;;OAUG;IACH,kCAAkC,CAAC,MAAM,EAAE,OAAO;IAwBlD,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,QAAQ,EACtC,GAAG,EAAE,wBAAwB,EAC7B,QAAQ,EAAE,GAAG,CAAC,OAAO,EACrB,MAAM,EAAE,OAAO,GAAG,MAAM,GACvB;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IA6BvC;;;;;;OAMG;IACH,gBAAgB,CACd,GAAG,EAAE,wBAAwB,EAC7B,EACE,MAAM,EACN,WAAW,GACZ,EAAE,IAAI,CAAC,4BAA4B,EAAE,QAAQ,GAAG,aAAa,CAAC;iBAzCnD,MAAM;iBAAW,MAAM;;IAmDrC;;;;;;OAMG;IACH,cAAc,CAAC,GAAG,EAAE,wBAAwB,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;iBA1D5D,MAAM;iBAAW,MAAM;;IA8DrC;;;;;;;;;;OAUG;IACH,WAAW,CACT,MAAM,EAAE,UAAU,GAAG,YAAY,EACjC,GAAG,EAAE,wBAAwB,EAC7B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM;IA2Cb;;;;OAIG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAIzC;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAIvC;;;;;;OAMG;IACH,SAAS,CAAC,UAAU,CAClB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;KAClB;IAgBH;;;;OAIG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IA2C7C;;OAEG;IACH,WAAW;IAOX;;;;;;OAMG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAUvC,sBAAsB;IAOtB;;;;;;OAMG;IACH,oBAAoB,CAAC,CAAC,SAAS,mBAAmB,EAChD,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,GACV,IAAI,CAAC,CAAC,CAAC;IAKV;;;OAGG;IACH,qBAAqB,CACnB,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,WAAW,GAAG,aAAa,GAAG,UAAU;IAqHhD;;;;OAIG;IACH,mBAAmB,CACjB,EACE,UAA4B,EAC5B,SAA0B,EAC1B,UAA4B,EAC5B,QAAwB,GACzB,GAAE,OAAO,CACR,IAAI,CACF,oBAAoB,EACpB,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,CACvD,CACG,EACN,YAAY,CAAC,EAAE,OAAO,GACrB,MAAM;IAgBT;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,wBAAwB;IAkBpC;;;;;;;OAOG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAItC;;;;OAIG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IAkBhD;;;;OAIG;IACH,QAAQ,CACN,CAAC,SAAS,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,MAAM,CAAC,EAC5D,CAAC,SAAS,MAAM,CAAC,GAAG,KAAK,EACzB,mBAAmB,GAAE,CAAC,EAAO,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM;IAQrD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG;IA6BlC;;;OAGG;IACH,UAAU,IAAI,MAAM;IAIpB;;;OAGG;IACH,MAAM,CAAC,YAAY,WAcjB;IAIF;;;OAGG;IACH,MAAM,CAAC,eAAe,WAYpB;IAEF;;;;OAIG;WACU,WAAW,CACtB,OAAO,EAAE,WAAW,GAAG,UAAU,EACjC,OAAO,CAAC,EAAE,SAAS,EACnB,QAAQ,CAAC,EAAE,QAAQ;;;;;;;;;;IAqErB;;;;OAIG;IACH,MAAM,CAAC,UAAU,CACf,CAAC,SAAS,QAAQ,CAAC,mBAAmB,CAAC,EACvC,CAAC,SAAS,UAAU,EACpB,MAAM,EAAE,CAAC;CAWZ"}
1
+ {"version":3,"file":"Text.d.ts","sourceRoot":"","sources":["../../../../src/shapes/Text/Text.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{defineProperty as t}from"../../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{cache as e}from"../../cache.min.mjs";import{RIGHT as i,CENTER as s,STROKE as n,BOTTOM as h,TOP as r,FILL as o,LEFT as l,DEFAULT_SVG_FONT_SIZE as a}from"../../constants.min.mjs";import{StyledText as d}from"./StyledText.min.mjs";import{SHARED_ATTRIBUTES as c}from"../../parser/attributes.min.mjs";import{parseAttributes as f}from"../../parser/parseAttributes.min.mjs";import{classRegistry as g}from"../../ClassRegistry.min.mjs";import{graphemeSplit as p}from"../../util/lang_string.min.mjs";import{createCanvasElementFor as u}from"../../util/misc/dom.min.mjs";import{layoutText as m}from"../../text/layout.min.mjs";import{hasStyleChanged as _,stylesToArray as x,stylesFromArray as y}from"../../util/misc/textStyles.min.mjs";import{getPathSegmentsInfo as S,getPointOnPath as T}from"../../util/path/index.min.mjs";import"../Object/FabricObject.min.mjs";import{TextSVGExportMixin as L}from"./TextSVGExportMixin.min.mjs";import{applyMixins as w}from"../../util/applyMixins.min.mjs";import{textLayoutProperties as O,additionalProps as C,textDefaultValues as k,JUSTIFY as v,JUSTIFY_CENTER as W,JUSTIFY_RIGHT as A,JUSTIFY_LEFT as H,TEXT_DECORATION_THICKNESS as D}from"./constants.min.mjs";import{isFiller as P}from"../../util/typeAssertions.min.mjs";import{getBrowserLines as b,clearBrowserLines as j}from"../../text/browserLines.min.mjs";import{cacheProperties as F}from"../Object/defaultValues.min.mjs";let z;class B extends d{static getDefaults(){return{...super.getDefaults(),...B.ownDefaults}}constructor(e,i){super(),t(this,"__charBounds",[]),Object.assign(this,B.ownDefaults),this.setOptions(i),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=S(t.path))}_splitText(){const t=b(this);if(t&&this.useOverlayEditing)return this._splitTextFromBrowserLines(t);const e=this._splitTextIntoLines(this.text);return this.textLines=e.lines,this._textLines=e.graphemeLines,this._unwrappedTextLines=e._unwrappedLines,this._text=e.graphemeText,e}_splitTextFromBrowserLines(t){const e=[],i=[],s=[];let n=[];for(const h of t){e.push(h.text);const r=this.graphemeSplit(h.text);i.push(r),s.push(r),n=n.concat(r),h!==t[t.length-1]&&n.push("\n")}const h={lines:e,graphemeLines:i,graphemeText:n,_unwrappedLines:s};return this.textLines=h.lines,this._textLines=h.graphemeLines,this._unwrappedTextLines=h._unwrappedLines,this._text=h.graphemeText,h}initDimensions(){if(this.enableAdvancedLayout&&!this.path)return this.initDimensionsAdvanced();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(v)&&this.enlargeSpaces()}enlargeSpaces(){let t,e,i,s,n,h,r;for(let o=0,l=this._textLines.length;o<l;o++)if((this.textAlign===v||o!==l-1&&!this.isEndOfWrapping(o))&&(s=0,n=this._textLines[o],e=this.getLineWidth(o),e<this.width&&(r=this.textLines[o].match(this._reSpacesAndTabs)))){i=r.length,t=(this.width-e)/i;for(let e=0;e<=n.length;e++)h=this.__charBounds[o][e],this._reSpaceAndTab.test(n[e])?(h.width+=t,h.kernedWidth+=t,h.left+=s,s+=t):h.left+=s}}_layoutTextAdvanced(){const t=this._getAdvancedLayoutOptions();return m(t)}_getAdvancedLayoutOptions(){return{text:this.text,width:this.width,height:this.height,wrap:this.wrap||"word",align:this._mapTextAlignToAlign(this.textAlign),ellipsis:this.ellipsis||!1,fontSize:this.fontSize,lineHeight:this.lineHeight,letterSpacing:this.letterSpacing||0,charSpacing:this.charSpacing,direction:"inherit"===this.direction?"ltr":this.direction,fontFamily:this.fontFamily,fontStyle:this.fontStyle,fontWeight:this.fontWeight,verticalAlign:this.verticalAlign||"top"}}_mapTextAlignToAlign(t){switch(t){case"center":case s:return"center";case"right":case i:return"right";case"justify":case v:case H:case A:case W:return"justify";default:return"left"}}initDimensionsAdvanced(){if(!this.enableAdvancedLayout)return this.initDimensions();const t=this._layoutTextAdvanced();this.width=t.totalWidth||this.MIN_TEXT_WIDTH,this.height=t.totalHeight,this._convertLayoutToLegacyFormat(t),this.dirty=!0}_convertLayoutToLegacyFormat(t){this._textLines=t.lines.map(t=>t.graphemes),this.textLines=t.lines.map(t=>t.text),this.__charBounds=t.lines.map(t=>t.bounds.map(t=>({left:t.left,top:t.y,width:t.width,height:t.height,kernedWidth:t.kernedWidth,deltaY:t.deltaY||0}))),t.lines.length>0&&(this._unwrappedTextLines=t.lines.map(t=>t.graphemes))}isEndOfWrapping(t){return t===this._textLines.length-1}missingNewlineOffset(t){return 1}get2DCursorLocation(t,e){const i=e?this._unwrappedTextLines:this._textLines;let s;for(s=0;s<i.length;s++){if(t<=i[s].length)return{lineIndex:s,charIndex:t};t-=i[s].length+this.missingNewlineOffset(s,e)}return{lineIndex:s-1,charIndex:i[s-1].length<t?i[s-1].length:t}}toString(){return`#<Text (${this.complexity()}): { "text": "${this.text}", "fontFamily": "${this.fontFamily}" }>`}_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.__overlayEditor||(this.paintFirst===n?(this._renderTextStroke(t),this._renderTextFill(t)):(this._renderTextFill(t),this._renderTextStroke(t)))}_setTextStyles(t,e,i){if(t.textBaseline="alphabetic",this.path)switch(this.pathAlign){case s:t.textBaseline="middle";break;case"ascender":t.textBaseline=r;break;case"descender":t.textBaseline=h}t.font=this._getFontDeclaration(e,i)}calcTextWidth(){let t=this.getLineWidth(0);for(let e=1,i=this._textLines.length;e<i;e++){const i=this.getLineWidth(e);i>t&&(t=i)}return t}_renderTextLine(t,e,i,s,n,h){this._renderChars(t,e,i,s,n,h)}_renderTextLinesBackground(t){if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor"))return;const e=t.fillStyle,i=this._getLeftOffset();let s=this._getTopOffset();for(let e=0,n=this._textLines.length;e<n;e++){const n=this.getHeightOfLine(e);if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor",e)){s+=n;continue}const h=this._textLines[e].length,r=this._getLineLeftOffset(e);let o,l,a=0,d=0,c=this.getValueOfPropertyAt(e,0,"textBackgroundColor");for(let f=0;f<h;f++){const h=this.__charBounds[e][f];l=this.getValueOfPropertyAt(e,f,"textBackgroundColor"),this.path?(t.save(),t.translate(h.renderLeft,h.renderTop),t.rotate(h.angle),t.fillStyle=l,l&&t.fillRect(-h.width/2,-n/this.lineHeight*(1-this._fontSizeFraction),h.width,n/this.lineHeight),t.restore()):l!==c?(o=i+r+d,"rtl"===this.direction&&(o=this.width-o-a),t.fillStyle=c,c&&t.fillRect(o,s,a,n/this.lineHeight),d=h.left,a=h.width,c=l):a+=h.kernedWidth}l&&!this.path&&(o=i+r+d,"rtl"===this.direction&&(o=this.width-o-a),t.fillStyle=l,t.fillRect(o,s,a,n/this.lineHeight)),s+=n}t.fillStyle=e,this._removeShadow(t)}_measureChar(t,i,s,n){const h=e.getFontCache(i),r=this._getFontDeclaration(i),o=s+t,l=s&&r===this._getFontDeclaration(n),a=i.fontSize/this.CACHE_FONT_SIZE;let d,c,f,g;if(s&&void 0!==h[s]&&(f=h[s]),void 0!==h[t]&&(g=d=h[t]),l&&void 0!==h[o]&&(c=h[o],g=c-f),void 0===d||void 0===f||void 0===c){const e=function(){if(!z){const t=u({width:0,height:0});z=t.getContext("2d")}return z}();this._setTextStyles(e,i,!0),void 0===d&&(g=d=e.measureText(t).width,h[t]=d),void 0===f&&l&&s&&(f=e.measureText(s).width,h[s]=f),l&&void 0===c&&(c=e.measureText(o).width,h[o]=c,g=c-f)}return{width:d*a,kernedWidth:g*a}}getHeightOfChar(t,e){return this.getValueOfPropertyAt(t,e,"fontSize")}measureLine(t){const e=this._measureLine(t);return 0!==this.charSpacing&&(e.width-=this._getWidthOfCharSpacing()),e.width<0&&(e.width=0),e}_measureLine(t){let e,n,h=0;const r=this.pathSide===i,o=this.path,a=this._textLines[t],d=a.length,c=new Array(d);this.__charBounds[t]=c;for(let i=0;i<d;i++){const s=a[i];n=this._getGraphemeBox(s,t,i,e),c[i]=n,h+=n.kernedWidth,e=s}if(c[d]={left:n?n.left+n.width:0,width:0,kernedWidth:0,height:this.fontSize,deltaY:0},o&&o.segmentsInfo){let t=0;const e=o.segmentsInfo[o.segmentsInfo.length-1].length;switch(this.textAlign){case l:t=r?e-h:0;break;case s:t=(e-h)/2;break;case i:t=r?0:e-h}t+=this.pathStartOffset*(r?-1:1);for(let i=r?d-1:0;r?i>=0:i<d;r?i--:i++)n=c[i],t>e?t%=e:t<0&&(t+=e),this._setGraphemeOnPath(t,n),t+=n.kernedWidth}return{width:h,numOfSpaces:0}}_setGraphemeOnPath(t,e){const s=t+e.kernedWidth/2,n=this.path,h=T(n.path,s,n.segmentsInfo);e.renderLeft=h.x-n.pathOffset.x,e.renderTop=h.y-n.pathOffset.y,e.angle=h.angle+(this.pathSide===i?Math.PI:0)}_getGraphemeBox(t,e,i,s,n){const h=this.getCompleteStyleDeclaration(e,i),r=s?this.getCompleteStyleDeclaration(e,i-1):{},o=this._measureChar(t,h,s,r);let l,a=o.kernedWidth,d=o.width;0!==this.charSpacing&&(l=this._getWidthOfCharSpacing(),d+=l,a+=l);const c={width:d,left:0,height:h.fontSize,kernedWidth:a,deltaY:h.deltaY};if(i>0&&!n){const t=this.__charBounds[e][i-1];c.left=t.left+t.width+o.kernedWidth-o.width}return c}getHeightOfLine(t){if(this.__lineHeights[t])return this.__lineHeights[t];let e=this.getHeightOfChar(t,0);for(let i=1,s=this._textLines[t].length;i<s;i++)e=Math.max(this.getHeightOfChar(t,i),e);return this.__lineHeights[t]=e*this.lineHeight*this._fontSizeMult}calcTextHeight(){let t,e=0;for(let i=0,s=this._textLines.length;i<s;i++)t=this.getHeightOfLine(i),e+=i===s-1?t/this.lineHeight:t;return e}_getLeftOffset(){return"ltr"===this.direction?-this.width/2:this.width/2}_getTopOffset(){return-this.height/2}_renderTextCommon(t,e){t.save();let i=0;const s=this._getLeftOffset(),n=this._getTopOffset();for(let h=0,r=this._textLines.length;h<r;h++){const r=this.getHeightOfLine(h),o=r/this.lineHeight,l=this._getLineLeftOffset(h);this._renderTextLine(e,t,this._textLines[h],s+l,n+i+o,h),i+=r}t.restore()}_renderTextFill(t){(this.fill||this.styleHas(o))&&this._renderTextCommon(t,"fillText")}_renderTextStroke(t){(this.stroke&&0!==this.strokeWidth||!this.isEmptyStyles())&&(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this._setLineDash(t,this.strokeDashArray),t.beginPath(),this._renderTextCommon(t,"strokeText"),t.closePath(),t.restore())}_renderChars(t,e,s,n,h,r){const o=this.getHeightOfLine(r),a=this.textAlign.includes(v),d=this.path,c=!a&&0===this.charSpacing&&this.isEmptyStyles(r)&&!d,f="ltr"===this.direction,g="ltr"===this.direction?1:-1,p=e.direction;let u,m,x,y,S,T="",L=0;if(e.save(),p!==this.direction&&(e.canvas.setAttribute("dir",f?"ltr":"rtl"),e.direction=f?"ltr":"rtl",e.textAlign=f?l:i),h-=o*this._fontSizeFraction/this.lineHeight,c)return this._renderChar(t,e,r,0,s.join(""),n,h),void e.restore();for(let i=0,o=s.length-1;i<=o;i++)y=i===o||this.charSpacing||d,T+=s[i],x=this.__charBounds[r][i],0===L?(n+=g*(x.kernedWidth-x.width),L+=x.width):L+=x.kernedWidth,a&&!y&&this._reSpaceAndTab.test(s[i])&&(y=!0),y||(u=u||this.getCompleteStyleDeclaration(r,i),m=this.getCompleteStyleDeclaration(r,i+1),y=_(u,m,!1)),y&&(d?(e.save(),e.translate(x.renderLeft,x.renderTop),e.rotate(x.angle),this._renderChar(t,e,r,i,T,-L/2,0),e.restore()):(S=n,this._renderChar(t,e,r,i,T,S,h)),T="",u=m,n+=g*L,L=0);e.restore()}_applyPatternGradientTransformText(t){const e=this.width+this.strokeWidth,i=this.height+this.strokeWidth,s=u({width:e,height:i}),n=s.getContext("2d");return s.width=e,s.height=i,n.beginPath(),n.moveTo(0,0),n.lineTo(e,0),n.lineTo(e,i),n.lineTo(0,i),n.closePath(),n.translate(e/2,i/2),n.fillStyle=t.toLive(n),this._applyPatternGradientTransform(n,t),n.fill(),n.createPattern(s,"no-repeat")}handleFiller(t,e,i){let s,n;return P(i)?"percentage"===i.gradientUnits||i.gradientTransform||i.patternTransform?(s=-this.width/2,n=-this.height/2,t.translate(s,n),t[e]=this._applyPatternGradientTransformText(i),{offsetX:s,offsetY:n}):(t[e]=i.toLive(t),this._applyPatternGradientTransform(t,i)):(t[e]=i,{offsetX:0,offsetY:0})}_setStrokeStyles(t,e){let{stroke:i,strokeWidth:s}=e;return t.lineWidth=s,t.lineCap=this.strokeLineCap,t.lineDashOffset=this.strokeDashOffset,t.lineJoin=this.strokeLineJoin,t.miterLimit=this.strokeMiterLimit,this.handleFiller(t,"strokeStyle",i)}_setFillStyles(t,e){let{fill:i}=e;return this.handleFiller(t,"fillStyle",i)}_renderChar(t,e,i,s,n,h,r){const o=this._getStyleDeclaration(i,s),l=this.getCompleteStyleDeclaration(i,s),a="fillText"===t&&l.fill,d="strokeText"===t&&l.stroke&&l.strokeWidth;if(d||a){if(e.save(),e.font=this._getFontDeclaration(l),o.textBackgroundColor&&this._removeShadow(e),o.deltaY&&(r+=o.deltaY),a){const t=this._setFillStyles(e,l);e.fillText(n,h-t.offsetX,r-t.offsetY)}if(d){const t=this._setStrokeStyles(e,l);e.strokeText(n,h-t.offsetX,r-t.offsetY)}e.restore()}}setSuperscript(t,e){this._setScript(t,e,this.superscript)}setSubscript(t,e){this._setScript(t,e,this.subscript)}_setScript(t,e,i){const s=this.get2DCursorLocation(t,!0),n=this.getValueOfPropertyAt(s.lineIndex,s.charIndex,"fontSize"),h=this.getValueOfPropertyAt(s.lineIndex,s.charIndex,"deltaY"),r={fontSize:n*i.size,deltaY:h+n*i.baseline};this.setSelectionStyles(r,t,e)}_getLineLeftOffset(t){const e=this.getLineWidth(t),n=this.width-e,h=this.textAlign,r=this.direction,o=this.isEndOfWrapping(t);let a=0;return h===v||h===W&&!o||h===A&&!o||h===H&&!o?0:(h===s&&(a=n/2),h===i&&(a=n),h===W&&(a=n/2),h===A&&(a=n),"rtl"===r&&(h===i||h===v||h===A?a=0:h===l||h===H?a=-n:h!==s&&h!==W||(a=-n/2)),a)}_clearCache(){this._forceClearCache=!1,this.__lineWidths=[],this.__lineHeights=[],this.__charBounds=[]}getLineWidth(t){if(void 0!==this.__lineWidths[t])return this.__lineWidths[t];const{width:e}=this.measureLine(t);return this.__lineWidths[t]=e,e}_getWidthOfCharSpacing(){return 0!==this.charSpacing?this.fontSize*this.charSpacing/1e3:0}getValueOfPropertyAt(t,e,i){var s;return null!==(s=this._getStyleDeclaration(t,e)[i])&&void 0!==s?s:this[i]}_renderTextDecoration(t,e){if(!this[e]&&!this.styleHas(e))return;let i=this._getTopOffset();const s=this._getLeftOffset(),n=this.path,h=this._getWidthOfCharSpacing(),r="linethrough"===e?.5:"overline"===e?1:0,l=this.offsets[e];for(let a=0,d=this._textLines.length;a<d;a++){const d=this.getHeightOfLine(a);if(!this[e]&&!this.styleHas(e,a)){i+=d;continue}const c=this._textLines[a],f=d/this.lineHeight,g=this._getLineLeftOffset(a);let p=0,u=0,m=this.getValueOfPropertyAt(a,0,e),_=this.getValueOfPropertyAt(a,0,o),x=this.getValueOfPropertyAt(a,0,D),y=m,S=_,T=x;const L=i+f*(1-this._fontSizeFraction);let w=this.getHeightOfChar(a,0),O=this.getValueOfPropertyAt(a,0,"deltaY");for(let i=0,h=c.length;i<h;i++){const h=this.__charBounds[a][i];y=this.getValueOfPropertyAt(a,i,e),S=this.getValueOfPropertyAt(a,i,o),T=this.getValueOfPropertyAt(a,i,D);const d=this.getHeightOfChar(a,i),c=this.getValueOfPropertyAt(a,i,"deltaY");if(n&&y&&S){const e=this.fontSize*T/1e3;t.save(),t.fillStyle=_,t.translate(h.renderLeft,h.renderTop),t.rotate(h.angle),t.fillRect(-h.kernedWidth/2,l*d+c-r*e,h.kernedWidth,e),t.restore()}else if((y!==m||S!==_||d!==w||T!==x||c!==O)&&u>0){const e=this.fontSize*x/1e3;let i=s+g+p;"rtl"===this.direction&&(i=this.width-i-u),m&&_&&x&&(t.fillStyle=_,t.fillRect(i,L+l*w+O-r*e,u,e)),p=h.left,u=h.width,m=y,x=T,_=S,w=d,O=c}else u+=h.kernedWidth}let C=s+g+p;"rtl"===this.direction&&(C=this.width-C-u),t.fillStyle=S;const k=this.fontSize*T/1e3;y&&S&&T&&t.fillRect(C,L+l*w+O-r*k,u-h,k),i+=d}this._removeShadow(t)}_getFontDeclaration(){let{fontFamily:t=this.fontFamily,fontStyle:e=this.fontStyle,fontWeight:i=this.fontWeight,fontSize:s=this.fontSize}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;const h=t.includes("'")||t.includes('"')||t.includes(",")||B.genericFonts.includes(t.toLowerCase())?t:`"${t}"`;return[e,i,`${n?this.CACHE_FONT_SIZE:s}px`,h].join(" ")}render(t){this.visible&&(this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(this._forceClearCache&&this.initDimensions(),super.render(t)))}graphemeSplit(t){return p(t)}_splitTextIntoLines(t){const e=t.split(this._reNewline),i=new Array(e.length),s=["\n"];let n=[];for(let t=0;t<e.length;t++)i[t]=this.graphemeSplit(e[t]),n=n.concat(i[t],s);return n.pop(),{_unwrappedLines:i,lines:e,graphemeText:n,graphemeLines:i}}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject([...C,...t]),styles:x(this.styles,this.text),...this.path?{path:this.path.toObject()}:{}}}set(t,e){const{textLayoutProperties:i}=this.constructor;super.set(t,e);let s=!1,n=!1;if("object"==typeof t)for(const e in t)"path"===e&&this.setPathInfo(),s=s||i.includes(e),n=n||"path"===e;else s=i.includes(t),n="path"===t;return n&&this.setPathInfo(),s&&this.initialized&&(j(this),this.initDimensions(),this.setCoords()),this}complexity(){return 1}static async fromElement(t,e,n){const h=f(t,B.ATTRIBUTE_NAMES,n),{textAnchor:r=l,textDecoration:o="",dx:d=0,dy:c=0,top:g=0,left:p=0,fontSize:u=a,strokeWidth:m=1,..._}={...e,...h},x=new this((t.textContent||"").replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," "),{left:p+d,top:g+c,underline:o.includes("underline"),overline:o.includes("overline"),linethrough:o.includes("line-through"),strokeWidth:0,fontSize:u,..._}),y=x.getScaledHeight()/x.height,S=((x.height+x.strokeWidth)*x.lineHeight-x.height)*y,T=x.getScaledHeight()+S;let L=0;return r===s&&(L=x.getScaledWidth()/2),r===i&&(L=x.getScaledWidth()),x.set({left:x.left-L,top:x.top-(T-x.fontSize*(.07+x._fontSizeFraction))/x.lineHeight,strokeWidth:m}),x}static fromObject(t){return this._fromObject({...t,styles:y(t.styles||{},t.text)},{extraParam:"text"})}}t(B,"textLayoutProperties",O),t(B,"cacheProperties",[...F,...C]),t(B,"ownDefaults",k),t(B,"type","Text"),t(B,"genericFonts",["serif","sans-serif","monospace","cursive","fantasy","system-ui","ui-serif","ui-sans-serif","ui-monospace","ui-rounded","math","emoji","fangsong"]),t(B,"ATTRIBUTE_NAMES",c.concat("x","y","dx","dy","font-family","font-style","font-weight","font-size","letter-spacing","text-decoration","text-anchor")),w(B,[L]),g.setClass(B),g.setSVGClass(B);export{B as FabricText};
1
+ import{defineProperty as t}from"../../../_virtual/_rollupPluginBabelHelpers.min.mjs";import{cache as e}from"../../cache.min.mjs";import{RIGHT as i,CENTER as s,STROKE as n,BOTTOM as h,TOP as r,FILL as o,LEFT as l,DEFAULT_SVG_FONT_SIZE as a}from"../../constants.min.mjs";import{StyledText as d}from"./StyledText.min.mjs";import{SHARED_ATTRIBUTES as c}from"../../parser/attributes.min.mjs";import{parseAttributes as f}from"../../parser/parseAttributes.min.mjs";import{classRegistry as g}from"../../ClassRegistry.min.mjs";import{graphemeSplit as p}from"../../util/lang_string.min.mjs";import{createCanvasElementFor as _}from"../../util/misc/dom.min.mjs";import{layoutText as u}from"../../text/layout.min.mjs";import{hasStyleChanged as m,stylesToArray as x,stylesFromArray as S}from"../../util/misc/textStyles.min.mjs";import{getPathSegmentsInfo as y,getPointOnPath as T}from"../../util/path/index.min.mjs";import"../Object/FabricObject.min.mjs";import{TextSVGExportMixin as L}from"./TextSVGExportMixin.min.mjs";import{applyMixins as w}from"../../util/applyMixins.min.mjs";import{textLayoutProperties as O,additionalProps as C,textDefaultValues as k,JUSTIFY as v,JUSTIFY_CENTER as W,JUSTIFY_RIGHT as A,JUSTIFY_LEFT as H,TEXT_DECORATION_THICKNESS as D}from"./constants.min.mjs";import{isFiller as b}from"../../util/typeAssertions.min.mjs";import{getBrowserLines as P,clearBrowserLines as j}from"../../text/browserLines.min.mjs";import{cacheProperties as F}from"../Object/defaultValues.min.mjs";let B;class z extends d{static getDefaults(){return{...super.getDefaults(),...z.ownDefaults}}constructor(e,i){super(),t(this,"__charBounds",[]),Object.assign(this,z.ownDefaults),this.setOptions(i),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=y(t.path))}_splitText(){const t=P(this);if(t&&this.useOverlayEditing)return this._splitTextFromBrowserLines(t);const e=this._splitTextIntoLines(this.text);return this.textLines=e.lines,this._textLines=e.graphemeLines,this._unwrappedTextLines=e._unwrappedLines,this._text=e.graphemeText,e}_splitTextFromBrowserLines(t){const e=[],i=[],s=[];let n=[];for(const h of t){e.push(h.text);const r=this.graphemeSplit(h.text);i.push(r),s.push(r),n=n.concat(r),h!==t[t.length-1]&&n.push("\n")}const h={lines:e,graphemeLines:i,graphemeText:n,_unwrappedLines:s};return this.textLines=h.lines,this._textLines=h.graphemeLines,this._unwrappedTextLines=h._unwrappedLines,this._text=h.graphemeText,h}initDimensions(){if(this.enableAdvancedLayout&&!this.path)return this.initDimensionsAdvanced();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(v)&&this.enlargeSpaces()}enlargeSpaces(){let t,e,i,s,n,h,r;const o="rtl"===this.direction;for(let l=0,a=this._textLines.length;l<a;l++)if((this.textAlign===v||l!==a-1&&!this.isEndOfWrapping(l))&&(s=0,n=this._textLines[l],e=this.getLineWidth(l),e<this.width&&(r=this.textLines[l].match(this._reSpacesAndTabs))))if(i=r.length,t=(this.width-e)/i,o){for(let t=0;t<n.length;t++)this._reSpaceAndTab.test(n[t]);let e=0;for(let s=0;s<=n.length;s++)if(h=this.__charBounds[l][s],h){this._reSpaceAndTab.test(n[s])&&(h.width+=t,h.kernedWidth+=t,e++);const r=(i-e)*t;h.left+=r}}else for(let e=0;e<=n.length;e++)h=this.__charBounds[l][e],h&&(this._reSpaceAndTab.test(n[e])?(h.width+=t,h.kernedWidth+=t,h.left+=s,s+=t):h.left+=s)}_layoutTextAdvanced(){const t=this._getAdvancedLayoutOptions();return u(t)}_getAdvancedLayoutOptions(){return{text:this.text,width:this.width,height:this.height,wrap:this.wrap||"word",align:this._mapTextAlignToAlign(this.textAlign),ellipsis:this.ellipsis||!1,fontSize:this.fontSize,lineHeight:this.lineHeight,letterSpacing:this.letterSpacing||0,charSpacing:this.charSpacing,direction:"inherit"===this.direction?"ltr":this.direction,fontFamily:this.fontFamily,fontStyle:this.fontStyle,fontWeight:this.fontWeight,verticalAlign:this.verticalAlign||"top"}}_mapTextAlignToAlign(t){switch(t){case"center":case s:return"center";case"right":case i:return"right";case"justify":case v:case H:case A:case W:return"justify";default:return"left"}}initDimensionsAdvanced(){if(!this.enableAdvancedLayout)return this.initDimensions();const t=this._layoutTextAdvanced();this.width=t.totalWidth||this.MIN_TEXT_WIDTH,this.height=t.totalHeight,this._convertLayoutToLegacyFormat(t),this.dirty=!0}_convertLayoutToLegacyFormat(t){this._textLines=t.lines.map(t=>t.graphemes),this.textLines=t.lines.map(t=>t.text),this.__charBounds=t.lines.map(t=>t.bounds.map(t=>({left:t.left,top:t.y,width:t.width,height:t.height,kernedWidth:t.kernedWidth,deltaY:t.deltaY||0}))),t.lines.length>0&&(this._unwrappedTextLines=t.lines.map(t=>t.graphemes))}isEndOfWrapping(t){return t===this._textLines.length-1}missingNewlineOffset(t){return 1}get2DCursorLocation(t,e){const i=e?this._unwrappedTextLines:this._textLines;let s;for(s=0;s<i.length;s++){if(t<=i[s].length)return{lineIndex:s,charIndex:t};t-=i[s].length+this.missingNewlineOffset(s,e)}return{lineIndex:s-1,charIndex:i[s-1].length<t?i[s-1].length:t}}toString(){return`#<Text (${this.complexity()}): { "text": "${this.text}", "fontFamily": "${this.fontFamily}" }>`}_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.__overlayEditor||(this.paintFirst===n?(this._renderTextStroke(t),this._renderTextFill(t)):(this._renderTextFill(t),this._renderTextStroke(t)))}_setTextStyles(t,e,i){if(t.textBaseline="alphabetic",this.path)switch(this.pathAlign){case s:t.textBaseline="middle";break;case"ascender":t.textBaseline=r;break;case"descender":t.textBaseline=h}t.font=this._getFontDeclaration(e,i)}calcTextWidth(){let t=this.getLineWidth(0);for(let e=1,i=this._textLines.length;e<i;e++){const i=this.getLineWidth(e);i>t&&(t=i)}return t}_renderTextLine(t,e,i,s,n,h){this._renderChars(t,e,i,s,n,h)}_renderTextLinesBackground(t){if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor"))return;const e=t.fillStyle,i=this._getLeftOffset();let s=this._getTopOffset();for(let e=0,n=this._textLines.length;e<n;e++){const n=this.getHeightOfLine(e);if(!this.textBackgroundColor&&!this.styleHas("textBackgroundColor",e)){s+=n;continue}const h=this._textLines[e].length,r=this._getLineLeftOffset(e);let o,l,a=0,d=0,c=this.getValueOfPropertyAt(e,0,"textBackgroundColor");for(let f=0;f<h;f++){const h=this.__charBounds[e][f];l=this.getValueOfPropertyAt(e,f,"textBackgroundColor"),this.path?(t.save(),t.translate(h.renderLeft,h.renderTop),t.rotate(h.angle),t.fillStyle=l,l&&t.fillRect(-h.width/2,-n/this.lineHeight*(1-this._fontSizeFraction),h.width,n/this.lineHeight),t.restore()):l!==c?(o=i+r+d,"rtl"===this.direction&&(o=this.width-o-a),t.fillStyle=c,c&&t.fillRect(o,s,a,n/this.lineHeight),d=h.left,a=h.width,c=l):a+=h.kernedWidth}l&&!this.path&&(o=i+r+d,"rtl"===this.direction&&(o=this.width-o-a),t.fillStyle=l,t.fillRect(o,s,a,n/this.lineHeight)),s+=n}t.fillStyle=e,this._removeShadow(t)}_measureChar(t,i,s,n){const h=e.getFontCache(i),r=this._getFontDeclaration(i),o=s+t,l=s&&r===this._getFontDeclaration(n),a=i.fontSize/this.CACHE_FONT_SIZE;let d,c,f,g;if(s&&void 0!==h[s]&&(f=h[s]),void 0!==h[t]&&(g=d=h[t]),l&&void 0!==h[o]&&(c=h[o],g=c-f),void 0===d||void 0===f||void 0===c){const e=function(){if(!B){const t=_({width:0,height:0});B=t.getContext("2d")}return B}();this._setTextStyles(e,i,!0),void 0===d&&(g=d=e.measureText(t).width,h[t]=d),void 0===f&&l&&s&&(f=e.measureText(s).width,h[s]=f),l&&void 0===c&&(c=e.measureText(o).width,h[o]=c,g=c-f)}return{width:d*a,kernedWidth:g*a}}getHeightOfChar(t,e){return this.getValueOfPropertyAt(t,e,"fontSize")}measureLine(t){const e=this._measureLine(t);return 0!==this.charSpacing&&(e.width-=this._getWidthOfCharSpacing()),e.width<0&&(e.width=0),e}_measureLine(t){let e,n,h=0;const r=this.pathSide===i,o=this.path,a=this._textLines[t],d=a.length,c=new Array(d);this.__charBounds[t]=c;for(let i=0;i<d;i++){const s=a[i];n=this._getGraphemeBox(s,t,i,e),c[i]=n,h+=n.kernedWidth,e=s}if(c[d]={left:n?n.left+n.width:0,width:0,kernedWidth:0,height:this.fontSize,deltaY:0},o&&o.segmentsInfo){let t=0;const e=o.segmentsInfo[o.segmentsInfo.length-1].length;switch(this.textAlign){case l:t=r?e-h:0;break;case s:t=(e-h)/2;break;case i:t=r?0:e-h}t+=this.pathStartOffset*(r?-1:1);for(let i=r?d-1:0;r?i>=0:i<d;r?i--:i++)n=c[i],t>e?t%=e:t<0&&(t+=e),this._setGraphemeOnPath(t,n),t+=n.kernedWidth}return{width:h,numOfSpaces:0}}_setGraphemeOnPath(t,e){const s=t+e.kernedWidth/2,n=this.path,h=T(n.path,s,n.segmentsInfo);e.renderLeft=h.x-n.pathOffset.x,e.renderTop=h.y-n.pathOffset.y,e.angle=h.angle+(this.pathSide===i?Math.PI:0)}_getGraphemeBox(t,e,i,s,n){const h=this.getCompleteStyleDeclaration(e,i),r=s?this.getCompleteStyleDeclaration(e,i-1):{},o=this._measureChar(t,h,s,r);let l,a=o.kernedWidth,d=o.width;0!==this.charSpacing&&(l=this._getWidthOfCharSpacing(),d+=l,a+=l);const c={width:d,left:0,height:h.fontSize,kernedWidth:a,deltaY:h.deltaY};if(i>0&&!n){const t=this.__charBounds[e][i-1];c.left=t.left+t.width+o.kernedWidth-o.width}return c}getHeightOfLine(t){if(this.__lineHeights[t])return this.__lineHeights[t];let e=this.getHeightOfChar(t,0);for(let i=1,s=this._textLines[t].length;i<s;i++)e=Math.max(this.getHeightOfChar(t,i),e);return this.__lineHeights[t]=e*this.lineHeight*this._fontSizeMult}calcTextHeight(){let t,e=0;for(let i=0,s=this._textLines.length;i<s;i++)t=this.getHeightOfLine(i),e+=i===s-1?t/this.lineHeight:t;return e}_getLeftOffset(){return"ltr"===this.direction?-this.width/2:this.width/2}_getTopOffset(){return-this.height/2}_renderTextCommon(t,e){t.save();let i=0;const s=this._getLeftOffset(),n=this._getTopOffset();for(let h=0,r=this._textLines.length;h<r;h++){const r=this.getHeightOfLine(h),o=r/this.lineHeight,l=this._getLineLeftOffset(h);this._renderTextLine(e,t,this._textLines[h],s+l,n+i+o,h),i+=r}t.restore()}_renderTextFill(t){(this.fill||this.styleHas(o))&&this._renderTextCommon(t,"fillText")}_renderTextStroke(t){(this.stroke&&0!==this.strokeWidth||!this.isEmptyStyles())&&(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this._setLineDash(t,this.strokeDashArray),t.beginPath(),this._renderTextCommon(t,"strokeText"),t.closePath(),t.restore())}_renderChars(t,e,s,n,h,r){const o=this.getHeightOfLine(r),a=this.textAlign.includes(v),d=this.path,c=!a&&0===this.charSpacing&&this.isEmptyStyles(r)&&!d,f="ltr"===this.direction,g="ltr"===this.direction?1:-1,p=e.direction;let _,u,x,S,y,T="",L=0;if(e.save(),p!==this.direction&&(e.canvas.setAttribute("dir",f?"ltr":"rtl"),e.direction=f?"ltr":"rtl",e.textAlign=a||f?l:i),h-=o*this._fontSizeFraction/this.lineHeight,c)return this._renderChar(t,e,r,0,s.join(""),n,h),void e.restore();for(let i=0,o=s.length-1;i<=o;i++)S=i===o||this.charSpacing||d,T+=s[i],x=this.__charBounds[r][i],0===L?(n+=g*(x.kernedWidth-x.width),L+=x.width):L+=x.kernedWidth,a&&!S&&this._reSpaceAndTab.test(s[i])&&(S=!0),S||(_=_||this.getCompleteStyleDeclaration(r,i),u=this.getCompleteStyleDeclaration(r,i+1),S=m(_,u,!1)),S&&(d?(e.save(),e.translate(x.renderLeft,x.renderTop),e.rotate(x.angle),this._renderChar(t,e,r,i,T,-L/2,0),e.restore()):(y=n,this._renderChar(t,e,r,i,T,y,h)),T="",_=u,n+=g*L,L=0);e.restore()}_applyPatternGradientTransformText(t){const e=this.width+this.strokeWidth,i=this.height+this.strokeWidth,s=_({width:e,height:i}),n=s.getContext("2d");return s.width=e,s.height=i,n.beginPath(),n.moveTo(0,0),n.lineTo(e,0),n.lineTo(e,i),n.lineTo(0,i),n.closePath(),n.translate(e/2,i/2),n.fillStyle=t.toLive(n),this._applyPatternGradientTransform(n,t),n.fill(),n.createPattern(s,"no-repeat")}handleFiller(t,e,i){let s,n;return b(i)?"percentage"===i.gradientUnits||i.gradientTransform||i.patternTransform?(s=-this.width/2,n=-this.height/2,t.translate(s,n),t[e]=this._applyPatternGradientTransformText(i),{offsetX:s,offsetY:n}):(t[e]=i.toLive(t),this._applyPatternGradientTransform(t,i)):(t[e]=i,{offsetX:0,offsetY:0})}_setStrokeStyles(t,e){let{stroke:i,strokeWidth:s}=e;return t.lineWidth=s,t.lineCap=this.strokeLineCap,t.lineDashOffset=this.strokeDashOffset,t.lineJoin=this.strokeLineJoin,t.miterLimit=this.strokeMiterLimit,this.handleFiller(t,"strokeStyle",i)}_setFillStyles(t,e){let{fill:i}=e;return this.handleFiller(t,"fillStyle",i)}_renderChar(t,e,i,s,n,h,r){const o=this._getStyleDeclaration(i,s),l=this.getCompleteStyleDeclaration(i,s),a="fillText"===t&&l.fill,d="strokeText"===t&&l.stroke&&l.strokeWidth;if(d||a){if(e.save(),e.font=this._getFontDeclaration(l),o.textBackgroundColor&&this._removeShadow(e),o.deltaY&&(r+=o.deltaY),a){const t=this._setFillStyles(e,l);e.fillText(n,h-t.offsetX,r-t.offsetY)}if(d){const t=this._setStrokeStyles(e,l);e.strokeText(n,h-t.offsetX,r-t.offsetY)}e.restore()}}setSuperscript(t,e){this._setScript(t,e,this.superscript)}setSubscript(t,e){this._setScript(t,e,this.subscript)}_setScript(t,e,i){const s=this.get2DCursorLocation(t,!0),n=this.getValueOfPropertyAt(s.lineIndex,s.charIndex,"fontSize"),h=this.getValueOfPropertyAt(s.lineIndex,s.charIndex,"deltaY"),r={fontSize:n*i.size,deltaY:h+n*i.baseline};this.setSelectionStyles(r,t,e)}_getLineLeftOffset(t){const e=this.getLineWidth(t),n=this.width-e,h=this.textAlign,r=this.direction,o=this.isEndOfWrapping(t);let a=0;return h===v||h===W&&!o||h===A&&!o||h===H&&!o?0:(h===s&&(a=n/2),h===i&&(a=n),h===W&&(a=n/2),h===A&&(a=n),"rtl"===r&&(h===i||h===v||h===A?a=0:h===l||h===H?a=-n:h!==s&&h!==W||(a=-n/2)),a)}_clearCache(){this._forceClearCache=!1,this.__lineWidths=[],this.__lineHeights=[],this.__charBounds=[]}getLineWidth(t){if(void 0!==this.__lineWidths[t])return this.__lineWidths[t];const{width:e}=this.measureLine(t);return this.__lineWidths[t]=e,e}_getWidthOfCharSpacing(){return 0!==this.charSpacing?this.fontSize*this.charSpacing/1e3:0}getValueOfPropertyAt(t,e,i){var s;return null!==(s=this._getStyleDeclaration(t,e)[i])&&void 0!==s?s:this[i]}_renderTextDecoration(t,e){if(!this[e]&&!this.styleHas(e))return;let i=this._getTopOffset();const s=this._getLeftOffset(),n=this.path,h=this._getWidthOfCharSpacing(),r="linethrough"===e?.5:"overline"===e?1:0,l=this.offsets[e];for(let a=0,d=this._textLines.length;a<d;a++){const d=this.getHeightOfLine(a);if(!this[e]&&!this.styleHas(e,a)){i+=d;continue}const c=this._textLines[a],f=d/this.lineHeight,g=this._getLineLeftOffset(a);let p=0,_=0,u=this.getValueOfPropertyAt(a,0,e),m=this.getValueOfPropertyAt(a,0,o),x=this.getValueOfPropertyAt(a,0,D),S=u,y=m,T=x;const L=i+f*(1-this._fontSizeFraction);let w=this.getHeightOfChar(a,0),O=this.getValueOfPropertyAt(a,0,"deltaY");for(let i=0,h=c.length;i<h;i++){const h=this.__charBounds[a][i];S=this.getValueOfPropertyAt(a,i,e),y=this.getValueOfPropertyAt(a,i,o),T=this.getValueOfPropertyAt(a,i,D);const d=this.getHeightOfChar(a,i),c=this.getValueOfPropertyAt(a,i,"deltaY");if(n&&S&&y){const e=this.fontSize*T/1e3;t.save(),t.fillStyle=m,t.translate(h.renderLeft,h.renderTop),t.rotate(h.angle),t.fillRect(-h.kernedWidth/2,l*d+c-r*e,h.kernedWidth,e),t.restore()}else if((S!==u||y!==m||d!==w||T!==x||c!==O)&&_>0){const e=this.fontSize*x/1e3;let i=s+g+p;"rtl"===this.direction&&(i=this.width-i-_),u&&m&&x&&(t.fillStyle=m,t.fillRect(i,L+l*w+O-r*e,_,e)),p=h.left,_=h.width,u=S,x=T,m=y,w=d,O=c}else _+=h.kernedWidth}let C=s+g+p;"rtl"===this.direction&&(C=this.width-C-_),t.fillStyle=y;const k=this.fontSize*T/1e3;S&&y&&T&&t.fillRect(C,L+l*w+O-r*k,_-h,k),i+=d}this._removeShadow(t)}_getFontDeclaration(){let{fontFamily:t=this.fontFamily,fontStyle:e=this.fontStyle,fontWeight:i=this.fontWeight,fontSize:s=this.fontSize}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;const h=t.includes("'")||t.includes('"')||t.includes(",")||z.genericFonts.includes(t.toLowerCase())?t:`"${t}"`;return[e,i,`${n?this.CACHE_FONT_SIZE:s}px`,h].join(" ")}render(t){this.visible&&(this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(this._forceClearCache&&this.initDimensions(),super.render(t)))}graphemeSplit(t){return p(t)}_splitTextIntoLines(t){const e=t.split(this._reNewline),i=new Array(e.length),s=["\n"];let n=[];for(let t=0;t<e.length;t++)i[t]=this.graphemeSplit(e[t]),n=n.concat(i[t],s);return n.pop(),{_unwrappedLines:i,lines:e,graphemeText:n,graphemeLines:i}}toObject(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return{...super.toObject([...C,...t]),styles:x(this.styles,this.text),...this.path?{path:this.path.toObject()}:{}}}set(t,e){const{textLayoutProperties:i}=this.constructor;super.set(t,e);let s=!1,n=!1;if("object"==typeof t)for(const e in t)"path"===e&&this.setPathInfo(),s=s||i.includes(e),n=n||"path"===e;else s=i.includes(t),n="path"===t;return n&&this.setPathInfo(),s&&this.initialized&&(j(this),this.initDimensions(),this.setCoords()),this}complexity(){return 1}static async fromElement(t,e,n){const h=f(t,z.ATTRIBUTE_NAMES,n),{textAnchor:r=l,textDecoration:o="",dx:d=0,dy:c=0,top:g=0,left:p=0,fontSize:_=a,strokeWidth:u=1,...m}={...e,...h},x=new this((t.textContent||"").replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," "),{left:p+d,top:g+c,underline:o.includes("underline"),overline:o.includes("overline"),linethrough:o.includes("line-through"),strokeWidth:0,fontSize:_,...m}),S=x.getScaledHeight()/x.height,y=((x.height+x.strokeWidth)*x.lineHeight-x.height)*S,T=x.getScaledHeight()+y;let L=0;return r===s&&(L=x.getScaledWidth()/2),r===i&&(L=x.getScaledWidth()),x.set({left:x.left-L,top:x.top-(T-x.fontSize*(.07+x._fontSizeFraction))/x.lineHeight,strokeWidth:u}),x}static fromObject(t){return this._fromObject({...t,styles:S(t.styles||{},t.text)},{extraParam:"text"})}}t(z,"textLayoutProperties",O),t(z,"cacheProperties",[...F,...C]),t(z,"ownDefaults",k),t(z,"type","Text"),t(z,"genericFonts",["serif","sans-serif","monospace","cursive","fantasy","system-ui","ui-serif","ui-sans-serif","ui-monospace","ui-rounded","math","emoji","fangsong"]),t(z,"ATTRIBUTE_NAMES",c.concat("x","y","dx","dy","font-family","font-style","font-weight","font-size","letter-spacing","text-decoration","text-anchor")),w(z,[L]),g.setClass(z),g.setSVGClass(z);export{z as FabricText};
2
2
  //# sourceMappingURL=Text.min.mjs.map