Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(692)

Unified Diff: ui/file_manager/gallery/js/image_editor/image_util.js

Issue 1608143002: support animated GIF (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add assert to pass closure compiler Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « ui/file_manager/gallery/js/image_editor/image_editor.js ('k') | ui/file_manager/gallery/js/image_editor/image_view.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698