fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 10.3 kB
Source Map (JSON)
{"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"}