Index: ui/file_manager/gallery/js/image_editor/commands.js |
diff --git a/ui/file_manager/gallery/js/image_editor/commands.js b/ui/file_manager/gallery/js/image_editor/commands.js |
index a67d0f9df2ff419cf85c2f7dd7e714b42079636f..a63801b2c37b8a207a0a907ecd7e6c34583ecfe3 100644 |
--- a/ui/file_manager/gallery/js/image_editor/commands.js |
+++ b/ui/file_manager/gallery/js/image_editor/commands.js |
@@ -8,34 +8,35 @@ |
* Command execution is asynchronous (callback-based). |
* |
* @param {!Document} document Document to create canvases in. |
- * @param {!HTMLCanvasElement} canvas The canvas with the original image. |
+ * @param {!HTMLCanvasElement|!HTMLImageElement} image The canvas with the |
+ * original image. |
* @param {function(function())} saveFunction Function to save the image. |
* @constructor |
* @struct |
*/ |
-function CommandQueue(document, canvas, saveFunction) { |
+function CommandQueue(document, image, saveFunction) { |
this.document_ = document; |
this.undo_ = []; |
this.redo_ = []; |
this.subscribers_ = []; |
- this.currentImage_ = canvas; |
- |
- // Current image may be null or not-null but with width = height = 0. |
- // Copying an image with zero dimensions causes js errors. |
- if (this.currentImage_) { |
- this.baselineImage_ = document.createElement('canvas'); |
- this.baselineImage_.width = this.currentImage_.width; |
- this.baselineImage_.height = this.currentImage_.height; |
- if (this.currentImage_.width > 0 && this.currentImage_.height > 0) { |
- var context = this.baselineImage_.getContext('2d'); |
- context.drawImage(this.currentImage_, 0, 0); |
- } |
- } else { |
- this.baselineImage_ = null; |
- } |
- this.previousImage_ = document.createElement('canvas'); |
- this.previousImageAvailable_ = false; |
+ /** |
+ * @type {HTMLCanvasElement|HTMLImageElement} |
+ * @private |
+ */ |
+ this.currentImage_ = image; |
+ |
+ /** |
+ * @type {HTMLCanvasElement|HTMLImageElement} |
+ * @private |
+ */ |
+ this.baselineImage_ = image; |
+ |
+ /** |
+ * @type {HTMLCanvasElement|HTMLImageElement} |
+ * @private |
+ */ |
+ this.previousImage_ = null; |
this.saveFunction_ = saveFunction; |
this.busy_ = false; |
@@ -139,13 +140,6 @@ CommandQueue.prototype.doExecute_ = function(command, uiContext, callback) { |
if (!this.currentImage_) |
throw new Error('Cannot operate on null image'); |
- // Remember one previous image so that the first undo is as fast as possible. |
- this.previousImage_.width = this.currentImage_.width; |
- this.previousImage_.height = this.currentImage_.height; |
- this.previousImageAvailable_ = true; |
- var context = this.previousImage_.getContext('2d'); |
- context.drawImage(this.currentImage_, 0, 0); |
- |
command.execute( |
this.document_, |
this.currentImage_, |
@@ -153,6 +147,7 @@ CommandQueue.prototype.doExecute_ = function(command, uiContext, callback) { |
* @type {function(HTMLCanvasElement, number=)} |
*/ |
(function(result, opt_delay) { |
+ this.previousImage_ = this.currentImage_; |
this.currentImage_ = result; |
callback(opt_delay); |
}.bind(this)), |
@@ -204,26 +199,16 @@ CommandQueue.prototype.undo = function() { |
self.commit_(false /* Do not show undo action */, delay); |
} |
- if (this.previousImageAvailable_) { |
+ if (this.previousImage_) { |
// First undo after an execute call. |
- this.currentImage_.width = this.previousImage_.width; |
- this.currentImage_.height = this.previousImage_.height; |
- var context = this.currentImage_.getContext('2d'); |
- context.drawImage(this.previousImage_, 0, 0); |
- |
- // Free memory. |
- this.previousImage_.width = 0; |
- this.previousImage_.height = 0; |
- this.previousImageAvailable_ = false; |
+ this.currentImage_ = this.previousImage_; |
+ this.previousImage_ = null; |
complete(); |
// TODO(kaznacheev) Consider recalculating previousImage_ right here |
// by replaying the commands in the background. |
} else { |
- this.currentImage_.width = this.baselineImage_.width; |
- this.currentImage_.height = this.baselineImage_.height; |
- var context = this.currentImage_.getContext('2d'); |
- context.drawImage(this.baselineImage_, 0, 0); |
+ this.currentImage_ = this.baselineImage_; |
var replay = function(index) { |
if (index < self.undo_.length) |
@@ -260,14 +245,9 @@ CommandQueue.prototype.redo = function() { |
*/ |
CommandQueue.prototype.close = function() { |
// Free memory used by the undo buffer. |
- this.previousImage_.width = 0; |
- this.previousImage_.height = 0; |
- this.previousImageAvailable_ = false; |
- |
- if (this.baselineImage_) { |
- this.baselineImage_.width = 0; |
- this.baselineImage_.height = 0; |
- } |
+ this.currentImage_ = null; |
+ this.previousImage_ = null; |
+ this.baselineImage_ = null; |
}; |
/** |
@@ -296,24 +276,25 @@ Command.prototype.toString = function() { |
* to be able to show partial results for slower operations. |
* |
* @param {!Document} document Document on which to execute command. |
- * @param {!HTMLCanvasElement} srcCanvas Canvas to execute on. |
+ * @param {!HTMLCanvasElement|!HTMLImageElement} srcImage Image to execute on. |
+ * Do NOT modify this object. |
* @param {function(HTMLCanvasElement, number=)} callback Callback to call on |
* completion. |
* @param {!Object} uiContext Context to work in. |
*/ |
-Command.prototype.execute = function(document, srcCanvas, callback, uiContext) { |
+Command.prototype.execute = function(document, srcImage, callback, uiContext) { |
console.error('Command.prototype.execute not implemented'); |
}; |
/** |
* Visualize reversion of the operation. |
* |
- * @param {!HTMLCanvasElement} canvas Image data to use. |
+ * @param {!HTMLCanvasElement|!HTMLCanvasElement} image previous image. |
* @param {!ImageView} imageView ImageView to revert. |
* @return {number} Animation duration in ms. |
*/ |
-Command.prototype.revertView = function(canvas, imageView) { |
- imageView.replace(canvas); |
+Command.prototype.revertView = function(image, imageView) { |
+ imageView.replace(image); |
return 0; |
}; |
@@ -321,18 +302,19 @@ Command.prototype.revertView = function(canvas, imageView) { |
* Creates canvas to render on. |
* |
* @param {!Document} document Document to create canvas in. |
- * @param {!HTMLCanvasElement} srcCanvas to copy optional dimensions from. |
+ * @param {!HTMLCanvasElement|!HTMLImageElement} srcImage to copy optional |
+ * dimensions from. |
* @param {number=} opt_width new canvas width. |
* @param {number=} opt_height new canvas height. |
* @return {!HTMLCanvasElement} Newly created canvas. |
* @private |
*/ |
Command.prototype.createCanvas_ = function( |
- document, srcCanvas, opt_width, opt_height) { |
+ document, srcImage, opt_width, opt_height) { |
var result = assertInstanceof(document.createElement('canvas'), |
HTMLCanvasElement); |
- result.width = opt_width || srcCanvas.width; |
- result.height = opt_height || srcCanvas.height; |
+ result.width = opt_width || srcImage.width; |
+ result.height = opt_height || srcImage.height; |
return result; |
}; |
@@ -353,14 +335,14 @@ Command.Rotate.prototype = { __proto__: Command.prototype }; |
/** @override */ |
Command.Rotate.prototype.execute = function( |
- document, srcCanvas, callback, uiContext) { |
+ document, srcImage, callback, uiContext) { |
var result = this.createCanvas_( |
document, |
- srcCanvas, |
- (this.rotate90_ & 1) ? srcCanvas.height : srcCanvas.width, |
- (this.rotate90_ & 1) ? srcCanvas.width : srcCanvas.height); |
+ srcImage, |
+ (this.rotate90_ & 1) ? srcImage.height : srcImage.width, |
+ (this.rotate90_ & 1) ? srcImage.width : srcImage.height); |
ImageUtil.drawImageTransformed( |
- result, srcCanvas, 1, 1, this.rotate90_ * Math.PI / 2); |
+ result, srcImage, 1, 1, this.rotate90_ * Math.PI / 2); |
var delay; |
if (uiContext.imageView) { |
delay = uiContext.imageView.replaceAndAnimate(result, null, this.rotate90_); |
@@ -369,8 +351,8 @@ Command.Rotate.prototype.execute = function( |
}; |
/** @override */ |
-Command.Rotate.prototype.revertView = function(canvas, imageView) { |
- return imageView.replaceAndAnimate(canvas, null, -this.rotate90_); |
+Command.Rotate.prototype.revertView = function(image, imageView) { |
+ return imageView.replaceAndAnimate(image, null, -this.rotate90_); |
}; |
@@ -404,8 +386,8 @@ Command.Crop.prototype.execute = function( |
}; |
/** @override */ |
-Command.Crop.prototype.revertView = function(canvas, imageView) { |
- return imageView.animateAndReplace(canvas, this.imageRect_); |
+Command.Crop.prototype.revertView = function(image, imageView) { |
+ return imageView.animateAndReplace(image, this.imageRect_); |
}; |
@@ -430,8 +412,8 @@ Command.Filter.prototype = { __proto__: Command.prototype }; |
/** @override */ |
Command.Filter.prototype.execute = function( |
- document, srcCanvas, callback, uiContext) { |
- var result = this.createCanvas_(document, srcCanvas); |
+ document, srcImage, callback, uiContext) { |
+ var result = this.createCanvas_(document, srcImage); |
var self = this; |
var previousRow = 0; |
@@ -465,6 +447,6 @@ Command.Filter.prototype.execute = function( |
} |
} |
- filter.applyByStrips(result, srcCanvas, this.filter_, |
+ filter.applyByStrips(result, srcImage, this.filter_, |
uiContext.imageView ? onProgressVisible : onProgressInvisible); |
}; |