From bbae1aa9f644a99f5e9a4432e04a3e4ef49952f6 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sat, 19 Sep 2015 08:25:17 +0200 Subject: [PATCH 01/17] Add gradient transform to toObject method --- src/gradient.class.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gradient.class.js b/src/gradient.class.js index 1f7c8a8a40d..fd09149e6cd 100644 --- a/src/gradient.class.js +++ b/src/gradient.class.js @@ -153,7 +153,8 @@ coords: this.coords, colorStops: this.colorStops, offsetX: this.offsetX, - offsetY: this.offsetY + offsetY: this.offsetY, + gradientTransform: this.gradientTransform ? this.gradientTransform.concat() : this.gradientTransform }; }, From 436ce5a70cb4d34e0f125f107a4c6e9c9561ef69 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sat, 19 Sep 2015 08:27:28 +0200 Subject: [PATCH 02/17] add test for gradient Transform --- test/unit/gradient.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/gradient.js b/test/unit/gradient.js index cdf4cf9c5fe..4aee8893003 100644 --- a/test/unit/gradient.js +++ b/test/unit/gradient.js @@ -92,7 +92,7 @@ test('toObject linearGradient', function() { var gradient = createLinearGradient(); - + gradient.gradientTransform = [1, 0, 0, 1, 50, 50]; ok(typeof gradient.toObject == 'function'); var object = gradient.toObject(); @@ -103,7 +103,7 @@ equal(object.coords.y2, gradient.coords.y2); equal(object.type, gradient.type); - + deepEqual(object.gradientTransform, gradient.gradientTransform); equal(object.colorStops, gradient.colorStops); }); From 69d0071536e3bbaaa14d9a236ecb6f130180e475 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sat, 19 Sep 2015 09:37:06 +0200 Subject: [PATCH 03/17] move toDataURL to lower canvas, if it has to work on staticCanvas. --- src/mixins/canvas_dataurl_exporter.mixin.js | 9 ++------- src/static_canvas.class.js | 8 +++----- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/mixins/canvas_dataurl_exporter.mixin.js b/src/mixins/canvas_dataurl_exporter.mixin.js index 7b6ecd5fecd..227569430fd 100644 --- a/src/mixins/canvas_dataurl_exporter.mixin.js +++ b/src/mixins/canvas_dataurl_exporter.mixin.js @@ -57,7 +57,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati */ __toDataURL: function(format, quality, cropping) { - this.renderAll(true); + this.renderAll(); var canvasEl = this.upperCanvasEl || this.lowerCanvasEl, croppedCanvasEl = this.__getCroppedCanvas(canvasEl, cropping); @@ -71,9 +71,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati ? (croppedCanvasEl || canvasEl).toDataURL('image/' + format, quality) : (croppedCanvasEl || canvasEl).toDataURL('image/' + format); - this.contextTop && this.clearContext(this.contextTop); - this.renderAll(); - if (croppedCanvasEl) { croppedCanvasEl = null; } @@ -119,7 +116,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati activeObject = this.getActiveObject(), activeGroup = this.getActiveGroup(), - ctx = this.contextTop || this.contextContainer; + ctx = this.contextContainer; if (multiplier > 1) { this.setWidth(scaledWidth).setHeight(scaledHeight); @@ -153,8 +150,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati this.deactivateAll(); } - this.renderAll(true); - var data = this.__toDataURL(format, quality, cropping); // restoring width, height for `renderAll` to draw diff --git a/src/static_canvas.class.js b/src/static_canvas.class.js index b1d8f8e415b..fb8f9036fba 100644 --- a/src/static_canvas.class.js +++ b/src/static_canvas.class.js @@ -853,17 +853,15 @@ * @return {fabric.Canvas} instance * @chainable */ - renderAll: function (allOnTop) { - var canvasToDrawOn = this[(allOnTop === true && this.interactive) ? 'contextTop' : 'contextContainer'], + renderAll: function () { + var canvasToDrawOn = this.contextContainer, activeGroup = this.getActiveGroup(); if (this.contextTop && this.selection && !this._groupSelector) { this.clearContext(this.contextTop); } - if (!allOnTop) { - this.clearContext(canvasToDrawOn); - } + this.clearContext(canvasToDrawOn); this.fire('before:render'); From 520e8e61796ba4d563398d0efc61490451a2c44c Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Wed, 23 Sep 2015 00:23:21 +0200 Subject: [PATCH 04/17] Update canvas_dataurl_exporter.mixin.js --- src/mixins/canvas_dataurl_exporter.mixin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mixins/canvas_dataurl_exporter.mixin.js b/src/mixins/canvas_dataurl_exporter.mixin.js index 227569430fd..402697e9f61 100644 --- a/src/mixins/canvas_dataurl_exporter.mixin.js +++ b/src/mixins/canvas_dataurl_exporter.mixin.js @@ -59,7 +59,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati this.renderAll(); - var canvasEl = this.upperCanvasEl || this.lowerCanvasEl, + var canvasEl = this.lowerCanvasEl, croppedCanvasEl = this.__getCroppedCanvas(canvasEl, cropping); // to avoid common confusion https://github.com/kangax/fabric.js/issues/806 From 30c64ec9c115276f14fd83e76ca800002d8f31c1 Mon Sep 17 00:00:00 2001 From: Juriy Zaytsev Date: Thu, 24 Sep 2015 13:45:12 -0400 Subject: [PATCH 05/17] Add node 4 to travis; remove <1.0.0 limitation from package.json --- .travis.yml | 1 + package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d24b7e75d49..2f419ecd439 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: node_js node_js: + - "4" - "0.12" - "0.11" - "0.10" diff --git a/package.json b/package.json index e77013ea368..ae49b5aeabb 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "istanbul": "0.3.x" }, "engines": { - "node": ">=0.4.0 && <1.0.0" + "node": ">=0.4.0" }, "main": "./dist/fabric.js" } From c943d369a270f22b2934efd13e46d548b66882e3 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sun, 27 Sep 2015 16:37:32 +0200 Subject: [PATCH 06/17] Update itext_key_behavior.mixin.js Remove cancelOnInput logic, a normal e.preventDefault + stopPropagation is enough. Take in account already selected text when deciding how much text we are inserting during input event --- src/mixins/itext_key_behavior.mixin.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/mixins/itext_key_behavior.mixin.js b/src/mixins/itext_key_behavior.mixin.js index e5d33fc616f..cb4a4ce3781 100644 --- a/src/mixins/itext_key_behavior.mixin.js +++ b/src/mixins/itext_key_behavior.mixin.js @@ -81,14 +81,14 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * @param {Event} e Event object */ onInput: function(e) { - if (!this.isEditing || this._cancelOnInput) { - this._cancelOnInput = false; + if (!this.isEditing) { return; } var offset = this.selectionStart || 0, + offsetEnd = this.selectionEnd || 0, textLength = this.text.length, newTextLength = this.hiddenTextarea.value.length, - diff = newTextLength - textLength, + diff = newTextLength - textLength + offsetEnd - offset, charsToInsert = this.hiddenTextarea.value.slice(offset, offset + diff); this.insertChars(charsToInsert); e.stopPropagation(); @@ -149,7 +149,8 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot if (copiedText) { this.insertChars(copiedText, useCopiedStyle); } - this._cancelOnInput = true; + e.stopImmediatePropagation(); + e.preventDefault(); }, /** From 49b876a7046603280f179834dbe9798a7d0b97ea Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sun, 27 Sep 2015 16:58:15 +0200 Subject: [PATCH 07/17] Update textbox_behavior.mixin.js --- src/mixins/textbox_behavior.mixin.js | 37 +--------------------------- 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/src/mixins/textbox_behavior.mixin.js b/src/mixins/textbox_behavior.mixin.js index 2b9d934bcb9..e8d8bc61769 100644 --- a/src/mixins/textbox_behavior.mixin.js +++ b/src/mixins/textbox_behavior.mixin.js @@ -142,42 +142,7 @@ map = this._styleMap[cursorLocation.lineIndex], lineIndex = map.line, charIndex = map.offset + cursorLocation.charIndex; - - if (isBeginningOfLine) { - var textOnPreviousLine = this._getTextOnPreviousLine(cursorLocation.lineIndex), - newCharIndexOnPrevLine = textOnPreviousLine ? textOnPreviousLine.length : 0; - - if (!this.styles[lineIndex - 1]) { - this.styles[lineIndex - 1] = {}; - } - - for (charIndex in this.styles[lineIndex]) { - this.styles[lineIndex - 1][parseInt(charIndex, 10) + newCharIndexOnPrevLine] - = this.styles[lineIndex][charIndex]; - } - - this.shiftLineStyles(cursorLocation.lineIndex, -1); - - } - else { - var currentLineStyles = this.styles[lineIndex]; - - if (currentLineStyles) { - delete currentLineStyles[charIndex]; - //console.log('deleting', lineIndex, charIndex + offset); - } - - var currentLineStylesCloned = clone(currentLineStyles); - - // shift all styles by 1 backwards - for (var i in currentLineStylesCloned) { - var numericIndex = parseInt(i, 10); - if (numericIndex >= charIndex && numericIndex !== 0) { - currentLineStyles[numericIndex - 1] = currentLineStylesCloned[numericIndex]; - delete currentLineStyles[numericIndex]; - } - } - } + this._removeStyleObject(isBeginningOfLine, cursorLocation, lineIndex, charIndex); } }); })(); From b020b243e912024d7ff155edc16682327859a15c Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sun, 27 Sep 2015 17:00:16 +0200 Subject: [PATCH 08/17] removed some duplicate code --- src/mixins/itext_behavior.mixin.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/mixins/itext_behavior.mixin.js b/src/mixins/itext_behavior.mixin.js index 1e790760ffb..44b9870fb37 100644 --- a/src/mixins/itext_behavior.mixin.js +++ b/src/mixins/itext_behavior.mixin.js @@ -703,35 +703,35 @@ lineIndex = cursorLocation.lineIndex, charIndex = cursorLocation.charIndex; - if (isBeginningOfLine) { + this._removeStyleObject(isBeginningOfLine, cursorLocation, lineIndex, charIndex); + }, + + _getTextOnPreviousLine: function(lIndex) { + return this._textLines[lIndex - 1]; + }, + + _removeStyleObject: function(isBeginningOfLine, cursorLocation, lineIndex, charIndex) { - var textOnPreviousLine = this._textLines[lineIndex - 1], - newCharIndexOnPrevLine = textOnPreviousLine - ? textOnPreviousLine.length - : 0; + if (isBeginningOfLine) { + var textOnPreviousLine = this._getTextOnPreviousLine(cursorLocation.lineIndex), + newCharIndexOnPrevLine = textOnPreviousLine ? textOnPreviousLine.length : 0; if (!this.styles[lineIndex - 1]) { this.styles[lineIndex - 1] = {}; } - for (charIndex in this.styles[lineIndex]) { this.styles[lineIndex - 1][parseInt(charIndex, 10) + newCharIndexOnPrevLine] = this.styles[lineIndex][charIndex]; } - - this.shiftLineStyles(lineIndex, -1); - + this.shiftLineStyles(cursorLocation.lineIndex, -1); } else { var currentLineStyles = this.styles[lineIndex]; if (currentLineStyles) { delete currentLineStyles[charIndex]; - //console.log('deleting', lineIndex, charIndex + offset); } - var currentLineStylesCloned = clone(currentLineStyles); - // shift all styles by 1 backwards for (var i in currentLineStylesCloned) { var numericIndex = parseInt(i, 10); From 26cf009c9879c35f80258f3ea2bc8a0a9f1e1020 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sun, 27 Sep 2015 17:44:25 +0200 Subject: [PATCH 09/17] Update canvas.class.js --- src/canvas.class.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/canvas.class.js b/src/canvas.class.js index b2a0f644f03..6550c465b66 100644 --- a/src/canvas.class.js +++ b/src/canvas.class.js @@ -923,7 +923,6 @@ if (obj && obj.visible && obj.evented && - obj.selectable && this.containsPoint(e, obj)){ if ((this.perPixelTargetFind || obj.perPixelTargetFind) && !obj.isEditing) { var isTransparent = this.isTargetTransparent(obj, pointer.x, pointer.y); From 6426a0275816a61f6a5a544bf4839ec48a756666 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sun, 27 Sep 2015 17:50:57 +0200 Subject: [PATCH 10/17] Update canvas_grouping.mixin.js --- src/mixins/canvas_grouping.mixin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mixins/canvas_grouping.mixin.js b/src/mixins/canvas_grouping.mixin.js index 422b4491e23..eb9c79ed729 100644 --- a/src/mixins/canvas_grouping.mixin.js +++ b/src/mixins/canvas_grouping.mixin.js @@ -13,7 +13,7 @@ */ _shouldGroup: function(e, target) { var activeObject = this.getActiveObject(); - return e.shiftKey && + return e.shiftKey && target && target.selectable && (this.getActiveGroup() || (activeObject && activeObject !== target)) && this.selection; }, From 66bafc4162d8aa8c052670cf8c073c4be5c68331 Mon Sep 17 00:00:00 2001 From: Juriy Zaytsev Date: Tue, 29 Sep 2015 12:14:20 -0400 Subject: [PATCH 11/17] Try to remove before_install --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2f419ecd439..31319276af3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,5 +5,3 @@ node_js: - "0.11" - "0.10" script: 'npm run build && npm run test && npm run lint && npm run lint_tests' -before_install: - - sudo apt-get install -qq libgif-dev libpng-dev libjpeg8-dev libpango1.0-dev libcairo2-dev From 06ed44aaf0cf4e8beeb9b8c8e187d79877fde635 Mon Sep 17 00:00:00 2001 From: Juriy Zaytsev Date: Tue, 29 Sep 2015 12:16:29 -0400 Subject: [PATCH 12/17] Bring back before_install --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 31319276af3..2f419ecd439 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,3 +5,5 @@ node_js: - "0.11" - "0.10" script: 'npm run build && npm run test && npm run lint && npm run lint_tests' +before_install: + - sudo apt-get install -qq libgif-dev libpng-dev libjpeg8-dev libpango1.0-dev libcairo2-dev From d026c3f30838ddaef3205b1ad0a2c53e41fa3f70 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Mon, 5 Oct 2015 15:13:31 +0200 Subject: [PATCH 13/17] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e77013ea368..62cb06ee48e 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ }, "dependencies": { "canvas": "1.2.x", - "jsdom": "1.1.x", + "jsdom": "7.x.x", "xmldom": "0.1.x" }, "devDependencies": { From 21ed812c3e1d38a29edb77c11a0be84bb5b76707 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Mon, 5 Oct 2015 15:26:10 +0200 Subject: [PATCH 14/17] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 62cb06ee48e..90f3440b713 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ }, "dependencies": { "canvas": "1.2.x", - "jsdom": "7.x.x", + "jsdom": "6.x.x", "xmldom": "0.1.x" }, "devDependencies": { From c75756d7684ff87c113121bfb5840c8fcc3deaeb Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Mon, 5 Oct 2015 15:39:33 +0200 Subject: [PATCH 15/17] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 90f3440b713..e77013ea368 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ }, "dependencies": { "canvas": "1.2.x", - "jsdom": "6.x.x", + "jsdom": "1.1.x", "xmldom": "0.1.x" }, "devDependencies": { From e2a56bb254bad91fc513c1960f1930a54af036af Mon Sep 17 00:00:00 2001 From: DanieleSassoli Date: Wed, 7 Oct 2015 16:52:45 +0200 Subject: [PATCH 16/17] Fixed bug that caused image to be corrupted when a mask was applyed only if the image was bigger the mask. --- src/filters/mask_filter.class.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/filters/mask_filter.class.js b/src/filters/mask_filter.class.js index 5133a95ae9c..eb314279d88 100644 --- a/src/filters/mask_filter.class.js +++ b/src/filters/mask_filter.class.js @@ -57,9 +57,9 @@ maskCanvasEl.width = maskEl.width; maskCanvasEl.height = maskEl.height; - maskCanvasEl.getContext('2d').drawImage(maskEl, 0, 0, maskEl.width, maskEl.height); + maskCanvasEl.getContext('2d').drawImage(maskEl, 0, 0, canvasEl.width, canvasEl.height); - var maskImageData = maskCanvasEl.getContext('2d').getImageData(0, 0, maskEl.width, maskEl.height), + var maskImageData = maskCanvasEl.getContext('2d').getImageData(0, 0, canvasEl.width, canvasEl.height), maskData = maskImageData.data; for (i = 0; i < iLen; i += 4) { From f3268cf855e63182cee108a423367dbfa7f76c79 Mon Sep 17 00:00:00 2001 From: DanieleSassoli Date: Thu, 8 Oct 2015 15:17:24 +0200 Subject: [PATCH 17/17] bugfix, sometimes the mask was stretched. --- src/filters/mask_filter.class.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/filters/mask_filter.class.js b/src/filters/mask_filter.class.js index eb314279d88..7fa161a4822 100644 --- a/src/filters/mask_filter.class.js +++ b/src/filters/mask_filter.class.js @@ -54,8 +54,8 @@ i, iLen = imageData.width * imageData.height * 4; - maskCanvasEl.width = maskEl.width; - maskCanvasEl.height = maskEl.height; + maskCanvasEl.width = canvasEl.width; + maskCanvasEl.height = canvasEl.height; maskCanvasEl.getContext('2d').drawImage(maskEl, 0, 0, canvasEl.width, canvasEl.height);