{"version":3,"file":"Rect.mjs","sources":["../../../src/shapes/Rect.ts"],"sourcesContent":["import { kRect } from '../constants';\nimport { SHARED_ATTRIBUTES } from '../parser/attributes';\nimport { parseAttributes } from '../parser/parseAttributes';\nimport type { Abortable, TClassProperties, TOptions } from '../typedefs';\nimport { classRegistry } from '../ClassRegistry';\nimport { FabricObject, cacheProperties } from './Object/FabricObject';\nimport type { FabricObjectProps, SerializedObjectProps } from './Object/types';\nimport type { ObjectEvents } from '../EventTypeDefs';\nimport type { CSSRules } from '../parser/typedefs';\n\nexport const rectDefaultValues: Partial<TClassProperties<Rect>> = {\n  uniformRoundness: false,\n  rx: 0,\n  ry: 0,\n};\n\ninterface UniqueRectProps {\n  uniformRoundness: boolean;\n  rx: number;\n  ry: number;\n}\n\nexport interface SerializedRectProps\n  extends SerializedObjectProps,\n    UniqueRectProps {\n}\n\nexport interface RectProps extends FabricObjectProps, UniqueRectProps {\n}\n\nconst RECT_PROPS = ['rx', 'ry'] as const;\n\nexport class Rect<\n  Props extends TOptions<RectProps> = Partial<RectProps>,\n  SProps extends SerializedRectProps = SerializedRectProps,\n  EventSpec extends ObjectEvents = ObjectEvents,\n>\n  extends FabricObject<Props, SProps, EventSpec>\n  implements RectProps {\n  declare uniformRoundness: boolean;\n  /**\n   * Horizontal border radius\n   * @type Number\n   * @default\n   */\n  declare rx: number;\n\n  /**\n   * Vertical border radius\n   * @type Number\n   * @default\n   */\n  declare ry: number;\n\n  static type = 'Rect';\n\n  static cacheProperties = [...cacheProperties, ...RECT_PROPS];\n\n  static ownDefaults = rectDefaultValues;\n\n  static getDefaults(): Record<string, any> {\n    return {\n      ...super.getDefaults(),\n      ...Rect.ownDefaults,\n    };\n  }\n\n  /**\n   * Constructor\n   * @param {Object} [options] Options object\n   */\n  constructor(options?: Props) {\n    super();\n    Object.assign(this, Rect.ownDefaults);\n    this.setOptions(options);\n    this._initRxRy();\n  }\n\n  /**\n   * Initializes rx/ry attributes\n   * @private\n   */\n  _initRxRy() {\n    const { rx, ry } = this;\n    if (rx && !ry) {\n      this.ry = rx;\n    } else if (ry && !rx) {\n      this.rx = ry;\n    }\n  }\n\n  /**\n   * @private\n   * @param {CanvasRenderingContext2D} ctx Context to render on\n   */\n  _render(ctx: CanvasRenderingContext2D) {\n    const { width: w, height: h } = this;\n    const x = -w / 2;\n    const y = -h / 2;\n    let rx = this.rx ? this.rx : 0;\n    let ry = this.ry ? this.ry : 0;\n    const isRounded = rx !== 0 || ry !== 0;\n\n    if (this.uniformRoundness) {\n      const scaling = this.getObjectScaling();\n      rx = rx / scaling.x;\n      ry = ry / scaling.y;\n    }\n\n    rx = Math.min(rx, w / 2);\n    ry = Math.min(ry, h / 2);\n\n    ctx.beginPath();\n    ctx.moveTo(x + rx, y);\n\n    ctx.lineTo(x + w - rx, y);\n    isRounded &&\n    ctx.bezierCurveTo(\n      x + w - kRect * rx,\n      y,\n      x + w,\n      y + kRect * ry,\n      x + w,\n      y + ry,\n    );\n\n    ctx.lineTo(x + w, y + h - ry);\n    isRounded &&\n    ctx.bezierCurveTo(\n      x + w,\n      y + h - kRect * ry,\n      x + w - kRect * rx,\n      y + h,\n      x + w - rx,\n      y + h,\n    );\n\n    ctx.lineTo(x + rx, y + h);\n    isRounded &&\n    ctx.bezierCurveTo(\n      x + kRect * rx,\n      y + h,\n      x,\n      y + h - kRect * ry,\n      x,\n      y + h - ry,\n    );\n\n    ctx.lineTo(x, y + ry);\n    isRounded &&\n    ctx.bezierCurveTo(x, y + kRect * ry, x + kRect * rx, y, x + rx, y);\n\n    ctx.closePath();\n\n    this._renderPaintInOrder(ctx);\n  }\n\n  /**\n   * Returns object representation of an instance\n   * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n   * @return {Object} object representation of an instance\n   */\n  toObject<\n    T extends Omit<Props & TClassProperties<this>, keyof SProps>,\n    K extends keyof T = never,\n  >(propertiesToInclude: K[] = []): Pick<T, K> & SProps {\n    return super.toObject([...RECT_PROPS, ...propertiesToInclude]);\n  }\n\n  /**\n   * Returns svg representation of an instance\n   * @return {Array} an array of strings with the specific svg representation\n   * of the instance\n   */\n  _toSVG() {\n    const { width, height, rx, ry } = this;\n    return [\n      '<rect ',\n      'COMMON_PARTS',\n      `x=\"${-width / 2}\" y=\"${\n        -height / 2\n      }\" rx=\"${rx}\" ry=\"${ry}\" width=\"${width}\" height=\"${height}\" />\\n`,\n    ];\n  }\n\n  /**\n   * List of attribute names to account for when parsing SVG element (used by `Rect.fromElement`)\n   * @static\n   * @memberOf Rect\n   * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n   */\n  static ATTRIBUTE_NAMES = [\n    ...SHARED_ATTRIBUTES,\n    'x',\n    'y',\n    'rx',\n    'ry',\n    'width',\n    'height',\n  ];\n\n  /* _FROM_SVG_START_ */\n\n  /**\n   * Returns {@link Rect} instance from an SVG element\n   * @static\n   * @memberOf Rect\n   * @param {HTMLElement} element Element to parse\n   * @param {Object} [options] Options object\n   */\n  static async fromElement(\n    element: HTMLElement | SVGElement,\n    options?: Abortable,\n    cssRules?: CSSRules,\n  ) {\n    const {\n      left = 0,\n      top = 0,\n      width = 0,\n      height = 0,\n      visible = true,\n      ...restOfparsedAttributes\n    } = parseAttributes(element, this.ATTRIBUTE_NAMES, cssRules);\n\n    return new this({\n      ...options,\n      ...restOfparsedAttributes,\n      left,\n      top,\n      width,\n      height,\n      visible: Boolean(visible && width && height),\n    });\n  }\n\n  /* _FROM_SVG_END_ */\n}\n\nclassRegistry.setClass(Rect);\nclassRegistry.setSVGClass(Rect);\n"],"names":["rectDefaultValues","uniformRoundness","rx","ry","RECT_PROPS","Rect","FabricObject","getDefaults","ownDefaults","constructor","options","Object","assign","setOptions","_initRxRy","_render","ctx","width","w","height","h","x","y","isRounded","scaling","getObjectScaling","Math","min","beginPath","moveTo","lineTo","bezierCurveTo","kRect","closePath","_renderPaintInOrder","toObject","propertiesToInclude","arguments","length","undefined","_toSVG","fromElement","element","cssRules","left","top","visible","restOfparsedAttributes","parseAttributes","ATTRIBUTE_NAMES","Boolean","_defineProperty","cacheProperties","SHARED_ATTRIBUTES","classRegistry","setClass","setSVGClass"],"mappings":"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"}