{"version":3,"file":"Circle.min.mjs","sources":["../../../src/shapes/Circle.ts"],"sourcesContent":["import type { ObjectEvents } from '../EventTypeDefs';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport { cos } from '../util/misc/cos';\nimport { degreesToRadians } from '../util/misc/radiansDegreesConversion';\nimport { sin } from '../util/misc/sin';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { CSSRules } from '../parser/typedefs';\n\ninterface UniqueCircleProps {\n  /**\n   * Radius of this circle\n   * @type Number\n   * @default 0\n   */\n  radius: number;\n\n  /**\n   * Angle for the start of the circle, in degrees.\n   * @type TDegree 0 - 359\n   * @default 0\n   */\n  startAngle: number;\n\n  /**\n   * Angle for the end of the circle, in degrees\n   * @type TDegree 1 - 360\n   * @default 360\n   */\n  endAngle: number;\n\n  /**\n   * Orientation for the direction of the circle.\n   * Setting to true will switch the arc of the circle to traverse from startAngle to endAngle in a counter-clockwise direction.\n   * Note: this will only change how the circle is drawn, and does not affect rotational transformation.\n   * @default false\n   */\n  counterClockwise: boolean;\n}\n\nexport interface SerializedCircleProps\n  extends SerializedObjectProps,\n    UniqueCircleProps {}\n\nexport interface CircleProps extends FabricObjectProps, UniqueCircleProps {}\n\nconst CIRCLE_PROPS = [\n  'radius',\n  'startAngle',\n  'endAngle',\n  'counterClockwise',\n] as const;\n\nexport const circleDefaultValues: Partial<TClassProperties<Circle>> = {\n  radius: 0,\n  startAngle: 0,\n  endAngle: 360,\n  counterClockwise: false,\n};\n\nexport class Circle<\n    Props extends TOptions<CircleProps> = Partial<CircleProps>,\n    SProps extends SerializedCircleProps = SerializedCircleProps,\n    EventSpec extends ObjectEvents = ObjectEvents\n  >\n  extends FabricObject<Props, SProps, EventSpec>\n  implements UniqueCircleProps\n{\n  declare radius: number;\n  declare startAngle: number;\n  declare endAngle: number;\n  declare counterClockwise: boolean;\n\n  static type = 'Circle';\n\n  static cacheProperties = [...cacheProperties, ...CIRCLE_PROPS];\n\n  static ownDefaults = circleDefaultValues;\n\n  static getDefaults(): Record<string, any> {\n    return {\n      ...super.getDefaults(),\n      ...Circle.ownDefaults,\n    };\n  }\n\n  /**\n   * @private\n   * @param {String} key\n   * @param {*} value\n   */\n  _set(key: string, value: any) {\n    super._set(key, value);\n\n    if (key === 'radius') {\n      this.setRadius(value);\n    }\n\n    return this;\n  }\n\n  /**\n   * @private\n   * @param {CanvasRenderingContext2D} ctx context to render on\n   */\n  _render(ctx: CanvasRenderingContext2D) {\n    ctx.beginPath();\n    ctx.arc(\n      0,\n      0,\n      this.radius,\n      degreesToRadians(this.startAngle),\n      degreesToRadians(this.endAngle),\n      this.counterClockwise\n    );\n    this._renderPaintInOrder(ctx);\n  }\n\n  /**\n   * Returns horizontal radius of an object (according to how an object is scaled)\n   * @return {Number}\n   */\n  getRadiusX(): number {\n    return this.get('radius') * this.get('scaleX');\n  }\n\n  /**\n   * Returns vertical radius of an object (according to how an object is scaled)\n   * @return {Number}\n   */\n  getRadiusY(): number {\n    return this.get('radius') * this.get('scaleY');\n  }\n\n  /**\n   * Sets radius of an object (and updates width accordingly)\n   */\n  setRadius(value: number) {\n    this.radius = value;\n    this.set({ width: value * 2, height: value * 2 });\n  }\n\n  /**\n   * Returns object representation of an instance\n   * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n   * @return {Object} object representation of an instance\n   */\n  toObject<\n    T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n    K extends keyof T = never\n  >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n    return super.toObject([...CIRCLE_PROPS, ...propertiesToInclude]);\n  }\n\n  /* _TO_SVG_START_ */\n\n  /**\n   * Returns svg representation of an instance\n   * @return {Array} an array of strings with the specific svg representation\n   * of the instance\n   */\n  _toSVG(): string[] {\n    const angle = (this.endAngle - this.startAngle) % 360;\n\n    if (angle === 0) {\n      return [\n        '<circle ',\n        'COMMON_PARTS',\n        'cx=\"0\" cy=\"0\" ',\n        'r=\"',\n        `${this.radius}`,\n        '\" />\\n',\n      ];\n    } else {\n      const { radius } = this;\n      const start = degreesToRadians(this.startAngle),\n        end = degreesToRadians(this.endAngle),\n        startX = cos(start) * radius,\n        startY = sin(start) * radius,\n        endX = cos(end) * radius,\n        endY = sin(end) * radius,\n        largeFlag = angle > 180 ? 1 : 0,\n        sweepFlag = this.counterClockwise ? 0 : 1;\n      return [\n        `<path d=\"M ${startX} ${startY} A ${radius} ${radius} 0 ${largeFlag} ${sweepFlag} ${endX} ${endY}\" `,\n        'COMMON_PARTS',\n        ' />\\n',\n      ];\n    }\n  }\n  /* _TO_SVG_END_ */\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by {@link Circle.fromElement})\n   * @static\n   * @memberOf Circle\n   * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n   */\n  static ATTRIBUTE_NAMES = ['cx', 'cy', 'r', ...SHARED_ATTRIBUTES];\n\n  /**\n   * Returns {@link Circle} instance from an SVG element\n   * @static\n   * @memberOf Circle\n   * @param {HTMLElement} element Element to parse\n   * @param {Object} [options] Partial Circle object to default missing properties on the element.\n   * @throws {Error} If value of `r` attribute is missing or invalid\n   */\n  static async fromElement(\n    element: HTMLElement,\n    options: Abortable,\n    cssRules?: CSSRules\n  ): Promise<Circle> {\n    const {\n      left = 0,\n      top = 0,\n      radius = 0,\n      ...otherParsedAttributes\n    } = parseAttributes(\n      element,\n      this.ATTRIBUTE_NAMES,\n      cssRules\n    ) as Partial<CircleProps>;\n\n    // this probably requires to be fixed for default origins not being top/left.\n\n    return new this({\n      ...otherParsedAttributes,\n      radius,\n      left: left - radius,\n      top: top - radius,\n    });\n  }\n\n  /* _FROM_SVG_END_ */\n\n  /**\n   * @todo how do we declare this??\n   */\n  static fromObject<T extends TOptions<SerializedCircleProps>>(object: T) {\n    return super._fromObject<Circle>(object);\n  }\n}\n\nclassRegistry.setClass(Circle);\nclassRegistry.setSVGClass(Circle);\n"],"names":["CIRCLE_PROPS","circleDefaultValues","radius","startAngle","endAngle","counterClockwise","Circle","FabricObject","getDefaults","_objectSpread","super","ownDefaults","_set","key","value","this","setRadius","_render","ctx","beginPath","arc","degreesToRadians","_renderPaintInOrder","getRadiusX","get","getRadiusY","set","width","height","toObject","propertiesToInclude","arguments","length","undefined","_toSVG","angle","concat","start","end","startX","cos","startY","sin","endX","endY","largeFlag","sweepFlag","fromElement","element","options","cssRules","_ref","parseAttributes","ATTRIBUTE_NAMES","left","top","otherParsedAttributes","_objectWithoutProperties","_excluded","fromObject","object","_fromObject","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"6oBAiDMA,EAAe,CACnB,SACA,aACA,WACA,oBAGWC,EAAyD,CACpEC,OAAQ,EACRC,WAAY,EACZC,SAAU,IACVC,kBAAkB,GAGb,MAAMC,UAKHC,EAcR,kBAAOC,GACL,OAAAC,EAAAA,EAAA,GACKC,MAAMF,eACNF,EAAOK,YAEd,CAOAC,IAAAA,CAAKC,EAAaC,GAOhB,OANAJ,MAAME,KAAKC,EAAKC,GAEJ,WAARD,GACFE,KAAKC,UAAUF,GAGVC,IACT,CAMAE,OAAAA,CAAQC,GACNA,EAAIC,YACJD,EAAIE,IACF,EACA,EACAL,KAAKb,OACLmB,EAAiBN,KAAKZ,YACtBkB,EAAiBN,KAAKX,UACtBW,KAAKV,kBAEPU,KAAKO,oBAAoBJ,EAC3B,CAMAK,UAAAA,GACE,OAAOR,KAAKS,IAAI,UAAYT,KAAKS,IAAI,SACvC,CAMAC,UAAAA,GACE,OAAOV,KAAKS,IAAI,UAAYT,KAAKS,IAAI,SACvC,CAKAR,SAAAA,CAAUF,GACRC,KAAKb,OAASY,EACdC,KAAKW,IAAI,CAAEC,MAAe,EAARb,EAAWc,OAAgB,EAARd,GACvC,CAOAe,QAAAA,GAGsD,IAApDC,EAAwBC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3B,OAAOrB,MAAMmB,SAAS,IAAI7B,KAAiB8B,GAC7C,CASAI,MAAAA,GACE,MAAMC,GAASpB,KAAKX,SAAWW,KAAKZ,YAAc,IAElD,GAAc,IAAVgC,EACF,MAAO,CACL,WACA,eACA,iBACA,MAAKC,GAAAA,OACFrB,KAAKb,QACR,UAEG,CACL,MAAMA,OAAEA,GAAWa,KACbsB,EAAQhB,EAAiBN,KAAKZ,YAClCmC,EAAMjB,EAAiBN,KAAKX,UAC5BmC,EAASC,EAAIH,GAASnC,EACtBuC,EAASC,EAAIL,GAASnC,EACtByC,EAAOH,EAAIF,GAAOpC,EAClB0C,EAAOF,EAAIJ,GAAOpC,EAClB2C,EAAYV,EAAQ,IAAM,EAAI,EAC9BW,EAAY/B,KAAKV,iBAAmB,EAAI,EAC1C,MAAO,eAAA+B,OACSG,EAAM,KAAAH,OAAIK,EAAML,OAAAA,OAAMlC,EAAM,KAAAkC,OAAIlC,EAAMkC,OAAAA,OAAMS,OAAST,OAAIU,EAAS,KAAAV,OAAIO,EAAIP,KAAAA,OAAIQ,EAAI,MAChG,eACA,QAEJ,CACF,CAoBA,wBAAaG,CACXC,EACAC,EACAC,GAEA,MAAAC,EAKIC,EACFJ,EACAjC,KAAKsC,gBACLH,IARII,KACJA,EAAO,EAACC,IACRA,EAAM,EAACrD,OACPA,EAAS,GAEViD,EADIK,EAAqBC,EAAAN,EAAAO,GAS1B,OAAO,IAAI3C,KAAIN,EAAAA,KACV+C,GAAqB,GAAA,CACxBtD,SACAoD,KAAMA,EAAOpD,EACbqD,IAAKA,EAAMrD,IAEf,CAOA,iBAAOyD,CAAsDC,GAC3D,OAAOlD,MAAMmD,YAAoBD,EACnC,EACDE,EAvLYxD,EAAM,OAaH,UAAQwD,EAbXxD,EAec,kBAAA,IAAIyD,KAAoB/D,IAAa8D,EAfnDxD,EAAM,cAiBIL,GAAmB6D,EAjB7BxD,EA2Ic,kBAAA,CAAC,KAAM,KAAM,OAAQ0D,IA8ChDC,EAAcC,SAAS5D,GACvB2D,EAAcE,YAAY7D"}