From d82200997a5c74a4c0d6ec40970161e96b2c6d5b Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sat, 28 Mar 2020 16:20:35 +0100 Subject: [PATCH 1/2] save-point --- src/control.class.js | 27 +++++++++++++-------------- src/controls.actions.js | 24 ++++++++++++++---------- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/control.class.js b/src/control.class.js index b33d22c7531..fbc1a04fb31 100644 --- a/src/control.class.js +++ b/src/control.class.js @@ -3,7 +3,7 @@ 'use strict'; var fabric = global.fabric || (global.fabric = { }), - degreesToRadians = fabric.util.degreesToRadians, + util = fabric.util, renderCircleControl = fabric.controlRenderers.renderCircleControl, renderSquareControl = fabric.controlRenderers.renderSquareControl; @@ -198,29 +198,28 @@ positionHandler: function(dim, finalMatrix, fabricObject /* currentControl */ ) { - var padding = fabricObject.padding, angle = degreesToRadians(fabricObject.angle), - cos = fabric.util.cos(angle), sin = fabric.util.sin(angle), offsetX = this.offsetX, + var padding = fabricObject.padding, angle = util.degreesToRadians(fabricObject.angle), + cos = util.cos(angle), sin = util.sin(angle), offsetX = this.offsetX, offsetY = this.offsetY, cosP = cos * padding, sinP = sin * padding, cosY = cos * offsetY, cosX = cos * offsetX, sinY = sin * offsetY, sinX = sin * offsetX, - point = fabric.util.transformPoint({ - x: (this.x * dim.x), - y: (this.y * dim.y) }, finalMatrix); + point = util.transformPoint({ + x: this.x * dim.x, + y: this.y * dim.y }, finalMatrix); if (this.x > 0) { - point.y += sinP + sinX + cosY; point.x += cosP + cosX - sinY; + point.y += sinP + sinX + cosY; + } + if (this.x < 0) { + point.x += -cosP + cosX - sinY; + point.y += -sinP + sinX + cosY; } if (this.y > 0) { - point.y += cosP + sinX + cosY; point.x += -sinP + cosX - sinY; - } - // to be verified - if (this.x < 0) { - point.y += -sinP - sinX - cosY; - point.x += -cosP - cosX + sinY; + point.y += cosP + sinX + cosY; } if (this.y < 0) { - point.y += -cosP - sinX + cosY; point.x += sinP + cosX - sinY; + point.y += -cosP - sinX + cosY; } return point; }, diff --git a/src/controls.actions.js b/src/controls.actions.js index 0571e424e45..7c61a484b97 100644 --- a/src/controls.actions.js +++ b/src/controls.actions.js @@ -122,8 +122,10 @@ }; } - function getLocalPoint(target, originX, originY, x, y) { - var zoom = target.canvas.getZoom(), + function getLocalPoint(transform, originX, originY, x, y) { + var target = transform.target, + control = target.controls[transform.corner], + zoom = target.canvas.getZoom(), padding = target.padding / zoom, localPoint = target.toLocalPoint(new fabric.Point(x, y), originX, originY); if (localPoint.x >= padding) { @@ -138,6 +140,8 @@ if (localPoint.y <= padding) { localPoint.y += padding; } + localPoint.x -= control.offsetX; + localPoint.y -= control.offsetY; return localPoint; } @@ -157,7 +161,7 @@ var target = transform.target, // find how big the object would be, if there was no skewX. takes in account scaling dimNoSkew = target._getTransformedDimensions(0, target.skewY), - localPoint = getLocalPoint(target, transform.originX, transform.originY, x, y), + localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y), // the mouse is in the center of the object, and we want it to stay there. // so the object will grow twice as much as the mouse. // this makes the skew growth to localPoint * 2 - dimNoSkew. @@ -168,7 +172,7 @@ newSkew = 0; } else { - newSkew = fabric.util.radiansToDegrees( + newSkew = radiansToDegrees( Math.atan2((totalSkewSize / target.scaleX), (dimNoSkew.y / target.scaleY)) ); // now we have to find the sign of the skew. @@ -197,7 +201,7 @@ var target = transform.target, // find how big the object would be, if there was no skewX. takes in account scaling dimNoSkew = target._getTransformedDimensions(target.skewX, 0), - localPoint = getLocalPoint(target, transform.originX, transform.originY, x, y), + localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y), // the mouse is in the center of the object, and we want it to stay there. // so the object will grow twice as much as the mouse. // this makes the skew growth to localPoint * 2 - dimNoSkew. @@ -208,7 +212,7 @@ newSkew = 0; } else { - newSkew = fabric.util.radiansToDegrees( + newSkew = radiansToDegrees( Math.atan2((totalSkewSize / target.scaleY), (dimNoSkew.x / target.scaleX)) ); // now we have to find the sign of the skew. @@ -246,7 +250,7 @@ return false; } if (currentSkew === 0) { - var localPointFromCenter = getLocalPoint(target, CENTER, CENTER, x, y); + var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y); if (localPointFromCenter.x > 0) { // we are pulling right, anchor left; originX = LEFT; @@ -288,7 +292,7 @@ return false; } if (currentSkew === 0) { - var localPointFromCenter = getLocalPoint(target, CENTER, CENTER, x, y); + var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y); if (localPointFromCenter.y > 0) { // we are pulling down, anchor up; originY = TOP; @@ -373,7 +377,7 @@ } dim = target._getTransformedDimensions(); - newPoint = getLocalPoint(target, transform.originX, transform.originY, x, y); + newPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y); // missing detection of flip and logic to switch the origin if (scaleProportionally && !by) { @@ -443,7 +447,7 @@ // currently unusued, needed for the textbox. function changeWidth(eventData, transform, x, y) { - var target = transform.target, localPoint = getLocalPoint(target, transform.originX, transform.originY, x, y), + var target = transform.target, localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y), strokePadding = target.strokeWidth / (target.strokeUniform ? target.scaleX : 1), newWidth = Math.abs(localPoint.x / target.scaleX) - strokePadding; target.set('width', Math.max(newWidth, 0)); From 1b95e6e793e8d22e0931d840bbc68b98c493ed12 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sat, 28 Mar 2020 16:46:52 +0100 Subject: [PATCH 2/2] fix tests --- test/unit/controls_handlers.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unit/controls_handlers.js b/test/unit/controls_handlers.js index 52cb1f131f3..6e645d832b5 100644 --- a/test/unit/controls_handlers.js +++ b/test/unit/controls_handlers.js @@ -11,6 +11,7 @@ originX: 'left', orginY: 'top', target: target, + corner: 'mr', }; }); hooks.afterEach(function() {