{"version":3,"file":"ObjectOrigin.min.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","this","scaleY","skewX","skewY","width","height","strokeWidth","preScalingStrokeValue","postScalingStrokeValue","strokeUniform","dimX","dimY","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":"kkBAYO,MAAMA,UACHC,EAoCRC,yBAAAA,GAAoD,IAA1BC,EAAYC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACvC,MAAMG,EAAUC,EAAA,CAIdC,OAAQC,KAAKD,OACbE,OAAQD,KAAKC,OACbC,MAAOF,KAAKE,MACZC,MAAOH,KAAKG,MACZC,MAAOJ,KAAKI,MACZC,OAAQL,KAAKK,OACbC,YAAaN,KAAKM,aACfb,GAGCa,EAAcT,EAAWS,YAC/B,IAAIC,EAAwBD,EAC1BE,EAAyB,EAEvBR,KAAKS,gBACPF,EAAwB,EACxBC,EAAyBF,GAE3B,MAAMI,EAAOb,EAAWO,MAAQG,EAC9BI,EAAOd,EAAWQ,OAASE,EAE7B,IAAIK,EAcJ,OAZEA,EAH8B,IAArBf,EAAWK,OAAoC,IAArBL,EAAWM,MAG5B,IAAIU,EACpBH,EAAOb,EAAWE,OAClBY,EAAOd,EAAWI,QAGFa,EAChBJ,EACAC,EACAI,EAAqBlB,IAIlBe,EAAgBI,UAAUR,EACnC,CAWAS,sBAAAA,CACEC,EACAC,EACAC,EACAC,EACAC,GAEA,IAAIC,EAAIL,EAAMK,EACZC,EAAIN,EAAMM,EACZ,MAAMC,EAAUC,EAAcL,GAAaK,EAAcP,GACvDQ,EAAUD,EAAcJ,GAAaI,EAAcN,GAErD,GAAIK,GAAWE,EAAS,CACtB,MAAMC,EAAM5B,KAAKR,4BACjB+B,GAAKE,EAAUG,EAAIL,EACnBC,GAAKG,EAAUC,EAAIJ,CACrB,CAEA,OAAO,IAAIX,EAAMU,EAAGC,EACtB,CASAK,sBAAAA,CACEX,EACAY,EACAC,GAEA,MAAMC,EAAIhC,KAAKiB,uBACbC,EACAY,EACAC,EACAE,EACAA,GAEF,OAAIjC,KAAKkC,MACAF,EAAEG,OAAOC,EAAiBpC,KAAKkC,OAAQhB,GAEzCc,CACT,CASAK,sBAAAA,CACEC,EACAR,EACAC,GAEA,MAAMC,EAAIhC,KAAKiB,uBACbqB,EACAL,EACAA,EACAH,EACAC,GAEF,OAAI/B,KAAKkC,MACAF,EAAEG,OAAOC,EAAiBpC,KAAKkC,OAAQI,GAEzCN,CACT,CAMAO,cAAAA,GACE,MAAMC,EAAYxC,KAAKyC,yBACvB,OAAOzC,KAAK0C,MACRC,EAAeH,EAAWxC,KAAK0C,MAAME,uBACrCJ,CACN,CAMAC,sBAAAA,GACE,OAAOzC,KAAK6B,uBACV,IAAIhB,EAAMb,KAAK6C,KAAM7C,KAAK8C,KAC1B9C,KAAK8B,QACL9B,KAAK+B,QAET,CAQAgB,gBAAAA,CAAiBjB,EAAmBC,GAClC,OAAO/B,KAAKqC,uBACVrC,KAAKyC,yBACLX,EACAC,EAEJ,CASAiB,mBAAAA,CAAoBC,EAAYnB,EAAmBC,GACjD,MAAMO,EAAStC,KAAK6B,uBAAuBoB,EAAKnB,EAASC,GACvDmB,EAAWlD,KAAKqC,uBACdC,EACAtC,KAAK8B,QACL9B,KAAK+B,SAET/B,KAAKmD,IAAI,CAAEN,KAAMK,EAAS3B,EAAGuB,IAAKI,EAAS1B,GAC7C,CAKA4B,iBAAAA,GACE,OAAOpD,KAAKqC,uBACVrC,KAAKyC,yBACLY,EACAC,EAEJ"}