{"version":3,"file":"ObjectOrigin.mjs","sources":["../../../../src/shapes/Object/ObjectOrigin.ts"],"sourcesContent":["import { Point } from '../../Point';\nimport type { Group } from '../Group';\nimport type { TDegree, TOriginX, TOriginY } from '../../typedefs';\nimport { calcDimensionsMatrix, transformPoint } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport { CommonMethods } from '../../CommonMethods';\nimport { resolveOrigin } from '../../util/misc/resolveOrigin';\nimport type { BaseProps } from './types/BaseProps';\nimport type { FillStrokeProps } from './types/FillStrokeProps';\nimport { CENTER, LEFT, TOP } from '../../constants';\n\nexport class ObjectOrigin<EventSpec>\n  extends CommonMethods<EventSpec>\n  implements BaseProps, Pick<FillStrokeProps, 'strokeWidth' | 'strokeUniform'>\n{\n  declare top: number;\n  declare left: number;\n  declare width: number;\n  declare height: number;\n  declare flipX: boolean;\n  declare flipY: boolean;\n  declare scaleX: number;\n  declare scaleY: number;\n  declare skewX: number;\n  declare skewY: number;\n  declare originX: TOriginX;\n  declare originY: TOriginY;\n  declare angle: TDegree;\n  declare strokeWidth: number;\n  declare strokeUniform: boolean;\n\n  /**\n   * Object containing this object.\n   * can influence its size and position\n   */\n  declare group?: Group;\n\n  /**\n   * Calculate object bounding box dimensions from its properties scale, skew.\n   * This bounding box is aligned with object angle and not with canvas axis or screen.\n   * @param {Object} [options]\n   * @param {Number} [options.scaleX]\n   * @param {Number} [options.scaleY]\n   * @param {Number} [options.skewX]\n   * @param {Number} [options.skewY]\n   * @private\n   * @returns {Point} dimensions\n   */\n  _getTransformedDimensions(options: any = {}): Point {\n    const dimOptions = {\n      // if scaleX or scaleY are negative numbers,\n      // this will return dimensions that are negative.\n      // and this will break assumptions around the codebase\n      scaleX: this.scaleX,\n      scaleY: this.scaleY,\n      skewX: this.skewX,\n      skewY: this.skewY,\n      width: this.width,\n      height: this.height,\n      strokeWidth: this.strokeWidth,\n      ...options,\n    };\n    // stroke is applied before/after transformations are applied according to `strokeUniform`\n    const strokeWidth = dimOptions.strokeWidth;\n    let preScalingStrokeValue = strokeWidth,\n      postScalingStrokeValue = 0;\n\n    if (this.strokeUniform) {\n      preScalingStrokeValue = 0;\n      postScalingStrokeValue = strokeWidth;\n    }\n    const dimX = dimOptions.width + preScalingStrokeValue,\n      dimY = dimOptions.height + preScalingStrokeValue,\n      noSkew = dimOptions.skewX === 0 && dimOptions.skewY === 0;\n    let finalDimensions;\n    if (noSkew) {\n      finalDimensions = new Point(\n        dimX * dimOptions.scaleX,\n        dimY * dimOptions.scaleY\n      );\n    } else {\n      finalDimensions = sizeAfterTransform(\n        dimX,\n        dimY,\n        calcDimensionsMatrix(dimOptions)\n      );\n    }\n\n    return finalDimensions.scalarAdd(postScalingStrokeValue);\n  }\n\n  /**\n   * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n   * @param {Point} point The point which corresponds to the originX and originY params\n   * @param {TOriginX} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n   * @param {TOriginY} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n   * @param {TOriginX} toOriginX Horizontal origin: 'left', 'center' or 'right'\n   * @param {TOriginY} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n   * @return {Point}\n   */\n  translateToGivenOrigin(\n    point: Point,\n    fromOriginX: TOriginX,\n    fromOriginY: TOriginY,\n    toOriginX: TOriginX,\n    toOriginY: TOriginY\n  ): Point {\n    let x = point.x,\n      y = point.y;\n    const offsetX = resolveOrigin(toOriginX) - resolveOrigin(fromOriginX),\n      offsetY = resolveOrigin(toOriginY) - resolveOrigin(fromOriginY);\n\n    if (offsetX || offsetY) {\n      const dim = this._getTransformedDimensions();\n      x += offsetX * dim.x;\n      y += offsetY * dim.y;\n    }\n\n    return new Point(x, y);\n  }\n\n  /**\n   * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n   * @param {Point} point The point which corresponds to the originX and originY params\n   * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n   * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n   * @return {Point}\n   */\n  translateToCenterPoint(\n    point: Point,\n    originX: TOriginX,\n    originY: TOriginY\n  ): Point {\n    const p = this.translateToGivenOrigin(\n      point,\n      originX,\n      originY,\n      CENTER,\n      CENTER\n    );\n    if (this.angle) {\n      return p.rotate(degreesToRadians(this.angle), point);\n    }\n    return p;\n  }\n\n  /**\n   * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n   * @param {Point} center The point which corresponds to center of the object\n   * @param {OriginX} originX Horizontal origin: 'left', 'center' or 'right'\n   * @param {OriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n   * @return {Point}\n   */\n  translateToOriginPoint(\n    center: Point,\n    originX: TOriginX,\n    originY: TOriginY\n  ): Point {\n    const p = this.translateToGivenOrigin(\n      center,\n      CENTER,\n      CENTER,\n      originX,\n      originY\n    );\n    if (this.angle) {\n      return p.rotate(degreesToRadians(this.angle), center);\n    }\n    return p;\n  }\n\n  /**\n   * Returns the center coordinates of the object relative to canvas\n   * @return {Point}\n   */\n  getCenterPoint(): Point {\n    const relCenter = this.getRelativeCenterPoint();\n    return this.group\n      ? transformPoint(relCenter, this.group.calcTransformMatrix())\n      : relCenter;\n  }\n\n  /**\n   * Returns the center coordinates of the object relative to it's parent\n   * @return {Point}\n   */\n  getRelativeCenterPoint(): Point {\n    return this.translateToCenterPoint(\n      new Point(this.left, this.top),\n      this.originX,\n      this.originY\n    );\n  }\n\n  /**\n   * Returns the coordinates of the object as if it has a different origin\n   * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n   * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n   * @return {Point}\n   */\n  getPointByOrigin(originX: TOriginX, originY: TOriginY): Point {\n    return this.translateToOriginPoint(\n      this.getRelativeCenterPoint(),\n      originX,\n      originY\n    );\n  }\n\n  /**\n   * Sets the position of the object taking into consideration the object's origin\n   * @param {Point} pos The new position of the object\n   * @param {TOriginX} originX Horizontal origin: 'left', 'center' or 'right'\n   * @param {TOriginY} originY Vertical origin: 'top', 'center' or 'bottom'\n   * @return {void}\n   */\n  setPositionByOrigin(pos: Point, originX: TOriginX, originY: TOriginY) {\n    const center = this.translateToCenterPoint(pos, originX, originY),\n      position = this.translateToOriginPoint(\n        center,\n        this.originX,\n        this.originY\n      );\n    this.set({ left: position.x, top: position.y });\n  }\n\n  /**\n   * @private\n   */\n  _getLeftTopCoords() {\n    return this.translateToOriginPoint(\n      this.getRelativeCenterPoint(),\n      LEFT,\n      TOP\n    );\n  }\n}\n"],"names":["ObjectOrigin","CommonMethods","_getTransformedDimensions","options","arguments","length","undefined","dimOptions","_objectSpread","scaleX","scaleY","skewX","skewY","width","height","strokeWidth","preScalingStrokeValue","postScalingStrokeValue","strokeUniform","dimX","dimY","noSkew","finalDimensions","Point","sizeAfterTransform","calcDimensionsMatrix","scalarAdd","translateToGivenOrigin","point","fromOriginX","fromOriginY","toOriginX","toOriginY","x","y","offsetX","resolveOrigin","offsetY","dim","translateToCenterPoint","originX","originY","p","CENTER","angle","rotate","degreesToRadians","translateToOriginPoint","center","getCenterPoint","relCenter","getRelativeCenterPoint","group","transformPoint","calcTransformMatrix","left","top","getPointByOrigin","setPositionByOrigin","pos","position","set","_getLeftTopCoords","LEFT","TOP"],"mappings":"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"}