fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 43.6 kB
Source Map (JSON)
{"version":3,"file":"ObjectGeometry.mjs","sources":["../../../../src/shapes/Object/ObjectGeometry.ts"],"sourcesContent":["import type {\n TBBox,\n TCornerPoint,\n TDegree,\n TMat2D,\n TOriginX,\n TOriginY,\n} from '../../typedefs';\nimport { SCALE_X, SCALE_Y, iMatrix } from '../../constants';\nimport { Intersection } from '../../Intersection';\nimport { Point } from '../../Point';\nimport { makeBoundingBoxFromPoints } from '../../util/misc/boundingBoxFromPoints';\nimport {\n createRotateMatrix,\n createTranslateMatrix,\n composeMatrix,\n invertTransform,\n multiplyTransformMatrices,\n transformPoint,\n calcPlaneRotation,\n} from '../../util/misc/matrix';\nimport { radiansToDegrees } from '../../util/misc/radiansDegreesConversion';\nimport type { Canvas } from '../../canvas/Canvas';\nimport type { StaticCanvas } from '../../canvas/StaticCanvas';\nimport type { ObjectEvents } from '../../EventTypeDefs';\nimport type { ControlProps } from './types/ControlProps';\nimport { resolveOrigin } from '../../util/misc/resolveOrigin';\nimport type { Group } from '../Group';\nimport { calcDimensionsMatrix } from '../../util/misc/matrix';\nimport { sizeAfterTransform } from '../../util/misc/objectTransforms';\nimport { degreesToRadians } from '../../util/misc/radiansDegreesConversion';\nimport { CommonMethods } from '../../CommonMethods';\nimport type { BaseProps } from './types/BaseProps';\nimport type { FillStrokeProps } from './types/FillStrokeProps';\nimport { CENTER, LEFT, TOP } from '../../constants';\n\ntype TMatrixCache = {\n key: number[];\n value: TMat2D;\n};\n\ntype TACoords = TCornerPoint;\n\nexport class ObjectGeometry<EventSpec extends ObjectEvents = ObjectEvents>\n extends CommonMethods<EventSpec>\n implements\n Pick<ControlProps, 'padding'>,\n BaseProps,\n Pick<FillStrokeProps, 'strokeWidth' | 'strokeUniform'>\n{\n // #region Geometry\n\n declare padding: number;\n\n /**\n * Describe object's corner position in scene coordinates.\n * The coordinates are derived from the following:\n * left, top, width, height, scaleX, scaleY, skewX, skewY, angle, strokeWidth.\n * The coordinates do not depend on viewport changes.\n * The coordinates get updated with {@link setCoords}.\n * You can calculate them without updating with {@link calcACoords()}\n */\n declare aCoords: TACoords;\n\n /**\n * storage cache for object transform matrix\n */\n declare ownMatrixCache?: TMatrixCache;\n\n /**\n * storage cache for object full transform matrix\n */\n declare matrixCache?: TMatrixCache;\n\n /**\n * A Reference of the Canvas where the object is actually added\n * @type StaticCanvas | Canvas;\n * @default undefined\n * @private\n */\n declare canvas?: StaticCanvas | Canvas;\n\n /**\n * @returns {number} x position according to object's {@link FabricObject#originX} property in canvas coordinate plane\n */\n getX(): number {\n return this.getXY().x;\n }\n\n /**\n * @param {number} value x position according to object's {@link FabricObject#originX} property in canvas coordinate plane\n */\n setX(value: number) {\n this.setXY(this.getXY().setX(value));\n }\n\n /**\n * @returns {number} y position according to object's {@link FabricObject#originY} property in canvas coordinate plane\n */\n getY(): number {\n return this.getXY().y;\n }\n\n /**\n * @param {number} value y position according to object's {@link FabricObject#originY} property in canvas coordinate plane\n */\n setY(value: number) {\n this.setXY(this.getXY().setY(value));\n }\n\n /**\n * @returns {number} x position according to object's {@link FabricObject#originX} property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getX}\n */\n getRelativeX(): number {\n return this.left;\n }\n\n /**\n * @param {number} value x position according to object's {@link FabricObject#originX} property in parent's coordinate plane\\\n * if parent is canvas then this method is identical to {@link setX}\n */\n setRelativeX(value: number) {\n this.left = value;\n }\n\n /**\n * @returns {number} y position according to object's {@link FabricObject#originY} property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link getY}\n */\n getRelativeY(): number {\n return this.top;\n }\n\n /**\n * @param {number} value y position according to object's {@link FabricObject#originY} property in parent's coordinate plane\\\n * if parent is canvas then this property is identical to {@link setY}\n */\n setRelativeY(value: number) {\n this.top = value;\n }\n\n /**\n * @returns {Point} x position according to object's {@link FabricObject#originX} {@link FabricObject#originY} properties in canvas coordinate plane\n */\n getXY(): Point {\n const relativePosition = this.getRelativeXY();\n return this.group\n ? transformPoint(relativePosition, this.group.calcTransformMatrix())\n : relativePosition;\n }\n\n /**\n * Set an object position to a particular point, the point is intended in absolute ( canvas ) coordinate.\n * You can specify {@link FabricObject#originX} and {@link FabricObject#originY} values,\n * that otherwise are the object's current values.\n * @example <caption>Set object's bottom left corner to point (5,5) on canvas</caption>\n * object.setXY(new Point(5, 5), 'left', 'bottom').\n * @param {Point} point position in scene coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setXY(point: Point, originX?: TOriginX, originY?: TOriginY) {\n if (this.group) {\n point = transformPoint(\n point,\n invertTransform(this.group.calcTransformMatrix()),\n );\n }\n this.setRelativeXY(point, originX, originY);\n }\n\n /**\n * @returns {Point} x,y position according to object's {@link FabricObject#originX} {@link FabricObject#originY} properties in parent's coordinate plane\n */\n getRelativeXY(): Point {\n return new Point(this.left, this.top);\n }\n\n /**\n * As {@link setXY}, but in current parent's coordinate plane (the current group if any or the canvas)\n * @param {Point} point position according to object's {@link FabricObject#originX} {@link FabricObject#originY} properties in parent's coordinate plane\n * @param {TOriginX} [originX] Horizontal origin: 'left', 'center' or 'right'\n * @param {TOriginY} [originY] Vertical origin: 'top', 'center' or 'bottom'\n */\n setRelativeXY(\n point: Point,\n originX: TOriginX = this.originX,\n originY: TOriginY = this.originY,\n ) {\n this.setPositionByOrigin(point, originX, originY);\n }\n\n /**\n * @deprecated intermidiate method to be removed, do not use\n */\n protected isStrokeAccountedForInDimensions() {\n return false;\n }\n\n /**\n * @return {Point[]} [tl, tr, br, bl] in the scene plane\n */\n getCoords(): Point[] {\n const { tl, tr, br, bl } =\n this.aCoords || (this.aCoords = this.calcACoords());\n const coords = [tl, tr, br, bl];\n if (this.group) {\n const t = this.group.calcTransformMatrix();\n return coords.map((p) => transformPoint(p, t));\n }\n return coords;\n }\n\n /**\n * Checks if object intersects with the scene rect formed by TL and BR\n * In this case the rect is meant aligned with the axis of the canvas.\n * TL is the TOP LEFT point while br is the BOTTOM RIGHT point\n */\n intersectsWithRect(tl: Point, br: Point): boolean {\n const intersection = Intersection.intersectPolygonRectangle(\n this.getCoords(),\n tl,\n br,\n );\n return intersection.status === 'Intersection';\n }\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject(other: ObjectGeometry): boolean {\n const intersection = Intersection.intersectPolygonPolygon(\n this.getCoords(),\n other.getCoords(),\n );\n\n return (\n intersection.status === 'Intersection' ||\n intersection.status === 'Coincident' ||\n other.isContainedWithinObject(this) ||\n this.isContainedWithinObject(other)\n );\n }\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject(other: ObjectGeometry): boolean {\n const points = this.getCoords();\n return points.every((point) => other.containsPoint(point));\n }\n\n /**\n * Checks if object is fully contained within the scene rect formed by TL and BR\n */\n isContainedWithinRect(tl: Point, br: Point): boolean {\n const { left, top, width, height } = this.getBoundingRect();\n return (\n left >= tl.x &&\n left + width <= br.x &&\n top >= tl.y &&\n top + height <= br.y\n );\n }\n\n isOverlapping<T extends ObjectGeometry>(other: T): boolean {\n return (\n this.intersectsWithObject(other) ||\n this.isContainedWithinObject(other) ||\n other.isContainedWithinObject(this)\n );\n }\n\n /**\n * Checks if point is inside the object\n * @param {Point} point Point to check against\n * @return {Boolean} true if point is inside the object\n */\n containsPoint(point: Point): boolean {\n return Intersection.isPointInPolygon(point, this.getCoords());\n }\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n const points = this.getCoords();\n // if some point is on screen, the object is on screen.\n if (\n points.some(\n (point) =>\n point.x <= br.x &&\n point.x >= tl.x &&\n point.y <= br.y &&\n point.y >= tl.y,\n )\n ) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n // check if the object is so big that it contains the entire viewport\n return this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen(): boolean {\n if (!this.canvas) {\n return false;\n }\n const { tl, br } = this.canvas.vptCoords;\n if (this.intersectsWithRect(tl, br)) {\n return true;\n }\n const allPointsAreOutside = this.getCoords().every(\n (point) =>\n (point.x >= br.x || point.x <= tl.x) &&\n (point.y >= br.y || point.y <= tl.y),\n );\n // check if the object is so big that it contains the entire viewport\n return allPointsAreOutside && this.containsPoint(tl.midPointFrom(br));\n }\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect(): TBBox {\n return makeBoundingBoxFromPoints(this.getCoords());\n }\n\n /**\n * Returns width of an object's bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} width value\n */\n getScaledWidth(): number {\n return this._getTransformedDimensions().x;\n }\n\n /**\n * Returns height of an object bounding box counting transformations\n * @todo shouldn't this account for group transform and return the actual size in canvas coordinate plane?\n * @return {Number} height value\n */\n getScaledHeight(): number {\n return this._getTransformedDimensions().y;\n }\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {void}\n */\n scale(value: number): void {\n this._set(SCALE_X, value);\n this._set(SCALE_Y, value);\n this.setCoords();\n }\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @return {void}\n */\n scaleToWidth(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n }\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @return {void}\n */\n scaleToHeight(value: number) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n const boundingRectFactor =\n this.getBoundingRect().height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n }\n\n getCanvasRetinaScaling() {\n return this.canvas?.getRetinaScaling() || 1;\n }\n\n /**\n * Returns the object angle relative to canvas counting also the group property\n * @returns {TDegree}\n */\n getTotalAngle(): TDegree {\n return this.group\n ? radiansToDegrees(calcPlaneRotation(this.calcTransformMatrix()))\n : this.angle;\n }\n\n /**\n * Retrieves viewportTransform from Object's canvas if available\n * @return {TMat2D}\n */\n getViewportTransform(): TMat2D {\n return this.canvas?.viewportTransform || (iMatrix.concat() as TMat2D);\n }\n\n /**\n * Calculates the coordinates of the 4 corner of the bbox, in absolute coordinates.\n * those never change with zoom or viewport changes.\n * @return {TCornerPoint}\n */\n calcACoords(): TCornerPoint {\n const rotateMatrix = createRotateMatrix({ angle: this.angle }),\n { x, y } = this.getRelativeCenterPoint(),\n tMatrix = createTranslateMatrix(x, y),\n finalMatrix = multiplyTransformMatrices(tMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2,\n h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix),\n };\n }\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * aCoords are used to quickly find an object on the canvas.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}\n */\n setCoords(): void {\n this.aCoords = this.calcACoords();\n }\n\n transformMatrixKey(skipGroup = false): number[] {\n let prefix: number[] = [];\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup);\n }\n prefix.push(\n this.top,\n this.left,\n this.width,\n this.height,\n this.scaleX,\n this.scaleY,\n this.angle,\n this.strokeWidth,\n this.skewX,\n this.skewY,\n +this.flipX,\n +this.flipY,\n resolveOrigin(this.originX),\n resolveOrigin(this.originY),\n );\n\n return prefix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {TMat2D} transform matrix for the object\n */\n calcTransformMatrix(skipGroup = false): TMat2D {\n let matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n const key = this.transformMatrixKey(skipGroup),\n cache = this.matrixCache;\n if (cache && cache.key.every((x, i) => x === key[i])) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyTransformMatrices(\n this.group.calcTransformMatrix(false),\n matrix,\n );\n }\n this.matrixCache = {\n key,\n value: matrix,\n };\n return matrix;\n }\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {TMat2D} transform matrix for the object\n */\n calcOwnMatrix(): TMat2D {\n const key = this.transformMatrixKey(true),\n cache = this.ownMatrixCache;\n if (cache && cache.key === key) {\n return cache.value;\n }\n const center = this.getRelativeCenterPoint(),\n options = {\n angle: this.angle,\n translateX: center.x,\n translateY: center.y,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n },\n value = composeMatrix(options);\n this.ownMatrixCache = {\n key,\n value,\n };\n return value;\n }\n\n /**\n * Calculate object dimensions from its properties\n * @private\n * @returns {Point} dimensions\n */\n _getNonTransformedDimensions(): Point {\n return new Point(this.width, this.height).scalarAdd(this.strokeWidth);\n }\n\n /**\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * @private\n * @param {object} [options] transform options\n * @returns {Point} dimensions\n */\n _calculateCurrentDimensions(options?: any): Point {\n return this._getTransformedDimensions(options)\n .transform(this.getViewportTransform(), true)\n .scalarAdd(2 * this.padding);\n }\n\n // #region Origin\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 /**\n * @deprecated please use 'center' as value in new projects\n * */\n declare originX: TOriginX;\n /**\n * @deprecated please use 'center' as value in new projects\n * */\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 // TODO remove this spread. is visible in the performance inspection\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 if (originX === CENTER && originY === CENTER) {\n return point;\n }\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 position of the object as if it has a different origin.\n * Take an object that has left, top set to 100, 100 with origin 'left', 'top'.\n * Return the values of left top ( wrapped in a point ) that you would need to keep\n * the same position if origin where different.\n * Alternatively you can use this to also find which point in the parent plane is a specific origin\n * ( where is the bottom right corner of my object? )\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":["ObjectGeometry","CommonMethods","getX","getXY","x","setX","value","setXY","getY","y","setY","getRelativeX","left","setRelativeX","getRelativeY","top","setRelativeY","relativePosition","getRelativeXY","group","transformPoint","calcTransformMatrix","point","originX","originY","invertTransform","setRelativeXY","Point","arguments","length","undefined","setPositionByOrigin","isStrokeAccountedForInDimensions","getCoords","tl","tr","br","bl","aCoords","calcACoords","coords","t","map","p","intersectsWithRect","intersection","Intersection","intersectPolygonRectangle","status","intersectsWithObject","other","intersectPolygonPolygon","isContainedWithinObject","points","every","containsPoint","isContainedWithinRect","width","height","getBoundingRect","isOverlapping","isPointInPolygon","isOnScreen","canvas","vptCoords","some","midPointFrom","isPartiallyOnScreen","allPointsAreOutside","makeBoundingBoxFromPoints","getScaledWidth","_getTransformedDimensions","getScaledHeight","scale","_set","SCALE_X","SCALE_Y","setCoords","scaleToWidth","boundingRectFactor","scaleToHeight","getCanvasRetinaScaling","_this$canvas","getRetinaScaling","getTotalAngle","radiansToDegrees","calcPlaneRotation","angle","getViewportTransform","_this$canvas2","viewportTransform","iMatrix","concat","rotateMatrix","createRotateMatrix","getRelativeCenterPoint","tMatrix","createTranslateMatrix","finalMatrix","multiplyTransformMatrices","dim","w","h","transformMatrixKey","skipGroup","prefix","push","scaleX","scaleY","strokeWidth","skewX","skewY","flipX","flipY","resolveOrigin","matrix","calcOwnMatrix","key","cache","matrixCache","i","ownMatrixCache","center","options","translateX","translateY","composeMatrix","_getNonTransformedDimensions","scalarAdd","_calculateCurrentDimensions","transform","padding","dimOptions","_objectSpread","preScalingStrokeValue","postScalingStrokeValue","strokeUniform","dimX","dimY","noSkew","finalDimensions","sizeAfterTransform","calcDimensionsMatrix","translateToGivenOrigin","fromOriginX","fromOriginY","toOriginX","toOriginY","offsetX","offsetY","translateToCenterPoint","CENTER","rotate","degreesToRadians","translateToOriginPoint","getCenterPoint","relCenter","getPointByOrigin","pos","position","set","_getLeftTopCoords","LEFT","TOP"],"mappings":"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"}