UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

1 lines 12.5 kB
{"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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"}