Index: ui/file_manager/gallery/js/image_editor/image_util.js |
diff --git a/ui/file_manager/gallery/js/image_editor/image_util.js b/ui/file_manager/gallery/js/image_editor/image_util.js |
index 4d93c7a6a9d44d976f5def126f017db10e6c96a9..2218bdcd4b1deb216eb115ec0a1c52f1e05676d3 100644 |
--- a/ui/file_manager/gallery/js/image_editor/image_util.js |
+++ b/ui/file_manager/gallery/js/image_editor/image_util.js |
@@ -440,7 +440,6 @@ ImageUtil.ImageLoader = function(document, metadataModel) { |
*/ |
this.metadataModel_ = metadataModel; |
- this.image_ = new Image(); |
this.generation_ = 0; |
/** |
@@ -480,7 +479,8 @@ ImageUtil.ImageLoader.prototype.load = function(item, callback, opt_delay) { |
this.entry_ = entry; |
this.callback_ = callback; |
- var targetImage = this.image_; |
+ var targetImage = assertInstanceof(this.document_.createElement('img'), |
+ HTMLImageElement); |
// The transform fetcher is not cancellable so we need a generation counter. |
var generation = ++this.generation_; |
@@ -490,8 +490,7 @@ ImageUtil.ImageLoader.prototype.load = function(item, callback, opt_delay) { |
*/ |
var onTransform = function(image, opt_transform) { |
if (generation === this.generation_) { |
- this.convertImage_( |
- image, opt_transform || { scaleX: 1, scaleY: 1, rotate90: 0}); |
+ this.convertImage_(image, opt_transform); |
} |
}; |
onTransform = onTransform.bind(this); |
@@ -522,6 +521,8 @@ ImageUtil.ImageLoader.prototype.load = function(item, callback, opt_delay) { |
targetImage.onload = function() { |
targetImage.onerror = null; |
targetImage.onload = null; |
+ if (generation !== this.generation_) |
+ return; |
this.metadataModel_.get([entry], ['contentImageTransform']).then( |
function(metadataItems) { |
onTransform(targetImage, metadataItems[0].contentImageTransform); |
@@ -540,9 +541,6 @@ ImageUtil.ImageLoader.prototype.load = function(item, callback, opt_delay) { |
if (generation !== this.generation_) |
return; |
- // Target current image. |
- targetImage = this.image_; |
- |
// Obtain target URL. |
if (FileType.isRaw(entry)) { |
var timestamp = |
@@ -610,14 +608,6 @@ ImageUtil.ImageLoader.prototype.cancel = function() { |
clearTimeout(this.timeout_); |
this.timeout_ = 0; |
} |
- if (this.image_) { |
- this.image_.onload = function() {}; |
- this.image_.onerror = function() {}; |
- // Force to free internal image by assigning empty image. |
- this.image_.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAA' + |
- 'AAABAAEAAAICTAEAOw=='; |
- this.image_ = document.createElement('img'); |
- } |
this.generation_++; // Silence the transform fetcher if it is in progress. |
}; |
@@ -627,6 +617,14 @@ ImageUtil.ImageLoader.prototype.cancel = function() { |
* @private |
*/ |
ImageUtil.ImageLoader.prototype.convertImage_ = function(image, transform) { |
+ if (!transform || |
+ (transform.rotate90 === 0 && |
+ transform.scaleX === 1 && |
+ transform.scaleY === 1)) { |
+ setTimeout(this.callback_, 0, image); |
+ this.callback_ = null; |
+ return; |
+ } |
var canvas = this.document_.createElement('canvas'); |
if (transform.rotate90 & 1) { // Rotated +/-90deg, swap the dimensions. |
@@ -670,11 +668,7 @@ ImageUtil.ImageLoader.prototype.copyStrip_ = function( |
if (this.entry_.toURL().substr(0, 5) !== 'data:') { // Ignore data urls. |
ImageUtil.metrics.recordInterval(ImageUtil.getMetricName('LoadTime')); |
} |
- try { |
- setTimeout(this.callback_, 0, context.canvas); |
- } catch (e) { |
- console.error(e); |
- } |
+ setTimeout(this.callback_, 0, context.canvas); |
this.callback_ = null; |
} else { |
var self = this; |
@@ -732,6 +726,26 @@ ImageUtil.getMetricName = function(name) { |
}; |
/** |
+ * Ensures argument is canvas. If it's not, creates new canvas and copy. |
+ * |
+ * @param {!HTMLCanvasElement|!HTMLImageElement} imgOrCanvas image or canvas |
+ * element |
+ * @return {!HTMLCanvasElement} canvas. |
+ */ |
+ImageUtil.ensureCanvas = function(imgOrCanvas) { |
+ if(imgOrCanvas.tagName === 'canvas') { |
+ return assertInstanceof(imgOrCanvas, HTMLCanvasElement); |
+ } |
+ var canvas = assertInstanceof(document.createElement('canvas'), |
+ HTMLCanvasElement); |
+ canvas.width = imgOrCanvas.width; |
+ canvas.height = imgOrCanvas.height; |
+ var context = canvas.getContext('2d'); |
+ context.drawImage(imgOrCanvas, 0, 0); |
+ return canvas; |
+}; |
+ |
+/** |
* Used for metrics reporting, keep in sync with the histogram description. |
* @type {Array<string>} |
* @const |