diff --git a/CHANGELOG.md b/CHANGELOG.md index 61bc62800a2..817abea98ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## [next] +- fix(Controls): changeWidth can change width with decimals [#10186](https://github.com/fabricjs/fabric.js/pull/10186) - ci(): Add some prebuilt fabric in the dist folder [#10178](https://github.com/fabricjs/fabric.js/pull/10178) ## [6.4.2] diff --git a/src/controls/changeWidth.test.ts b/src/controls/changeWidth.test.ts index 50e9df1f92b..f5d201dead1 100644 --- a/src/controls/changeWidth.test.ts +++ b/src/controls/changeWidth.test.ts @@ -43,6 +43,15 @@ describe('changeWidth', () => { expect(target.top).toBe(0); }); + test('changeWidth changes the width with decimals', () => { + expect(target.width).toBe(100); + const changed = changeWidth(eventData, transform, 200.2, 300); + expect(changed).toBe(true); + expect(target.width).toBe(199.2); + expect(target.left).toBe(0); + expect(target.top).toBe(0); + }); + test('changeWidth does not change the width', () => { const target = new Rect({ width: 100, height: 100, canvas }); jest.spyOn(target, '_set').mockImplementation(function _set(this: Rect) { diff --git a/src/controls/changeWidth.ts b/src/controls/changeWidth.ts index a00108e1212..3323019d7cc 100644 --- a/src/controls/changeWidth.ts +++ b/src/controls/changeWidth.ts @@ -40,10 +40,9 @@ export const changeObjectWidth: TransformActionHandler = ( target.strokeWidth / (target.strokeUniform ? target.scaleX : 1), multiplier = isTransformCentered(transform) ? 2 : 1, oldWidth = target.width, - newWidth = Math.ceil( - Math.abs((localPoint.x * multiplier) / target.scaleX) - strokePadding, - ); - target.set('width', Math.max(newWidth, 0)); + newWidth = + Math.abs((localPoint.x * multiplier) / target.scaleX) - strokePadding; + target.set('width', Math.max(newWidth, 1)); // check against actual target width in case `newWidth` was rejected return oldWidth !== target.width; }