| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 /** | 5 /** | 
| 6  * The overlay displaying the image. | 6  * The overlay displaying the image. | 
| 7  */ | 7  */ | 
| 8 function ImageView(container, viewport) { | 8 function ImageView(container, viewport) { | 
| 9   this.container_ = container; | 9   this.container_ = container; | 
| 10   this.viewport_ = viewport; | 10   this.viewport_ = viewport; | 
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 173 | 173 | 
| 174   var self = this; | 174   var self = this; | 
| 175 | 175 | 
| 176   this.contentID_ = id; | 176   this.contentID_ = id; | 
| 177 | 177 | 
| 178   if (FileType.getMediaType(source) == 'video') { | 178   if (FileType.getMediaType(source) == 'video') { | 
| 179     var video = this.document_.createElement('video'); | 179     var video = this.document_.createElement('video'); | 
| 180     if (metadata.thumbnailURL) { | 180     if (metadata.thumbnailURL) { | 
| 181       video.setAttribute('poster', metadata.thumbnailURL); | 181       video.setAttribute('poster', metadata.thumbnailURL); | 
| 182     } | 182     } | 
| 183     if (!metadata.thumbnailOnly) { | 183     video.src = metadata.contentURL || source; | 
| 184       video.src = source; | 184     video.load(); | 
| 185       video.load(); | 185     displayMainImage(ImageView.LOAD_TYPE_TOTAL, slide, video); | 
| 186     } |  | 
| 187     displayMainImage(ImageView.LOAD_TYPE_TOTAL, video); |  | 
| 188     return; | 186     return; | 
| 189   } | 187   } | 
| 190   var readyContent = this.getReadyContent(id, source); | 188   var readyContent = this.getReadyContent(id, source); | 
| 191   if (readyContent) { | 189   if (readyContent) { | 
| 192     displayMainImage(ImageView.LOAD_TYPE_CACHED_FULL, readyContent); | 190     displayMainImage(ImageView.LOAD_TYPE_CACHED_FULL, slide, readyContent); | 
| 193   } else { | 191   } else { | 
| 194     var cachedScreen = this.screenCache_.getItem(id); | 192     var cachedScreen = this.screenCache_.getItem(id); | 
| 195     if (cachedScreen) { | 193     if (cachedScreen) { | 
| 196       // We have a cached screen-scale canvas, use it instead of a thumbnail. | 194       // We have a cached screen-scale canvas, use it instead of a thumbnail. | 
| 197       displayThumbnail(ImageView.LOAD_TYPE_CACHED_SCREEN, cachedScreen); | 195       displayThumbnail(ImageView.LOAD_TYPE_CACHED_SCREEN, slide, cachedScreen); | 
| 198       // As far as the user can tell the image is loaded. We still need to load | 196       // As far as the user can tell the image is loaded. We still need to load | 
| 199       // the full res image to make editing possible, but we can report now. | 197       // the full res image to make editing possible, but we can report now. | 
| 200       ImageUtil.metrics.recordInterval(ImageUtil.getMetricName('DisplayTime')); | 198       ImageUtil.metrics.recordInterval(ImageUtil.getMetricName('DisplayTime')); | 
| 201     } else if (metadata.thumbnailURL) { | 199     } else if (metadata.thumbnailURL) { | 
| 202       this.imageLoader_.load( | 200       this.imageLoader_.load( | 
| 203           metadata.thumbnailURL, | 201           metadata.thumbnailURL, | 
| 204           metadata.thumbnailTransform, | 202           metadata.thumbnailTransform, | 
| 205           displayThumbnail.bind(null, ImageView.LOAD_TYPE_FILE)); | 203           displayThumbnail.bind(null, ImageView.LOAD_TYPE_FILE, slide)); | 
| 206     } else { | 204     } else { | 
| 207       loadMainImage(ImageView.LOAD_TYPE_FILE, 0); | 205       loadMainImage(ImageView.LOAD_TYPE_FILE, slide, source, 0); | 
| 208     } | 206     } | 
| 209   } | 207   } | 
| 210 | 208 | 
| 211   function displayThumbnail(loadType, canvas) { | 209   function displayThumbnail(loadType, slide, canvas) { | 
| 212     // The thumbnail may have different aspect ratio than the main image. | 210     // The thumbnail may have different aspect ratio than the main image. | 
| 213     // Force the main image proportions to avoid flicker. | 211     // Force the main image proportions to avoid flicker. | 
| 214     var time = Date.now(); | 212     var time = Date.now(); | 
| 215 | 213 | 
| 216     var mainImageLoadDelay = ImageView.ANIMATION_WAIT_INTERVAL; | 214     var mainImageLoadDelay = ImageView.ANIMATION_WAIT_INTERVAL; | 
|  | 215     var mainImageSlide = slide; | 
| 217 | 216 | 
| 218     // Do not do slide-in animation when scrolling very fast. | 217     // Do not do slide-in animation when scrolling very fast. | 
| 219     if (self.lastLoadTime_ && | 218     if (self.lastLoadTime_ && | 
| 220         (time - self.lastLoadTime_) < ImageView.FAST_SCROLL_INTERVAL) { | 219         (time - self.lastLoadTime_) < ImageView.FAST_SCROLL_INTERVAL) { | 
| 221       slide = 0; | 220       mainImageSlide = 0; | 
| 222     } | 221     } | 
| 223     self.lastLoadTime_ = time; | 222     self.lastLoadTime_ = time; | 
| 224 | 223 | 
| 225     if (metadata.thumbnailOnly) { | 224     var contentURL; | 
|  | 225     if (metadata.contentURL) { | 
|  | 226       contentURL = metadata.contentURL; | 
| 226       // We do not know the main image size, but chances are that it is large | 227       // We do not know the main image size, but chances are that it is large | 
| 227       // enough. Show the thumbnail at the maximum possible scale. | 228       // enough. Show the thumbnail at the maximum possible scale. | 
| 228       var bounds = self.viewport_.getScreenBounds(); | 229       var bounds = self.viewport_.getScreenBounds(); | 
| 229       var scale = Math.min (bounds.width / canvas.width, | 230       var scale = Math.min (bounds.width / canvas.width, | 
| 230                             bounds.height / canvas.height); | 231                             bounds.height / canvas.height); | 
| 231       self.replace(canvas, slide, canvas.width * scale, canvas.height * scale); | 232       self.replace(canvas, slide, canvas.width * scale, canvas.height * scale); | 
| 232       if (opt_callback) opt_callback(ImageView.LOAD_TYPE_TOTAL); | 233     } else { | 
| 233       return; | 234       contentURL = source; | 
|  | 235       self.replace(canvas, slide, metadata.width, metadata.height); | 
| 234     } | 236     } | 
| 235 | 237     if (!mainImageSlide) mainImageLoadDelay = 0; | 
| 236     self.replace(canvas, slide, metadata.width, metadata.height); | 238     mainImageSlide = 0; | 
| 237     if (!slide) mainImageLoadDelay = 0; | 239     loadMainImage(loadType, mainImageSlide, contentURL, mainImageLoadDelay); | 
| 238     slide = 0; |  | 
| 239     loadMainImage(loadType, mainImageLoadDelay); |  | 
| 240   } | 240   } | 
| 241 | 241 | 
| 242   function loadMainImage(loadType, delay) { | 242   function loadMainImage(loadType, slide, contentURL, delay) { | 
| 243     if (self.prefetchLoader_.isLoading(source)) { | 243     if (self.prefetchLoader_.isLoading(contentURL)) { | 
| 244       // The image we need is already being prefetched. Initiating another load | 244       // The image we need is already being prefetched. Initiating another load | 
| 245       // would be a waste. Hijack the load instead by overriding the callback. | 245       // would be a waste. Hijack the load instead by overriding the callback. | 
| 246       self.prefetchLoader_.setCallback(displayMainImage.bind(null, loadType)); | 246       self.prefetchLoader_.setCallback( | 
|  | 247           displayMainImage.bind(null, loadType, slide)); | 
| 247 | 248 | 
| 248       // Swap the loaders so that the self.isLoading works correctly. | 249       // Swap the loaders so that the self.isLoading works correctly. | 
| 249       var temp = self.prefetchLoader_; | 250       var temp = self.prefetchLoader_; | 
| 250       self.prefetchLoader_ = self.imageLoader_; | 251       self.prefetchLoader_ = self.imageLoader_; | 
| 251       self.imageLoader_ = temp; | 252       self.imageLoader_ = temp; | 
| 252       return; | 253       return; | 
| 253     } | 254     } | 
| 254     self.prefetchLoader_.cancel();  // The prefetch was doing something useless. | 255     self.prefetchLoader_.cancel();  // The prefetch was doing something useless. | 
| 255 | 256 | 
| 256     self.imageLoader_.load( | 257     self.imageLoader_.load( | 
| 257         source, | 258         contentURL, | 
| 258         metadata.imageTransform, | 259         metadata.imageTransform, | 
| 259         displayMainImage.bind(null, loadType), | 260         displayMainImage.bind(null, loadType, slide), | 
| 260         delay); | 261         delay); | 
| 261   } | 262   } | 
| 262 | 263 | 
| 263   function displayMainImage(loadType, content) { | 264   function displayMainImage(loadType, slide, content) { | 
| 264     self.replace(content, slide); | 265     self.replace(content, slide); | 
| 265     ImageUtil.metrics.recordEnum(ImageUtil.getMetricName('LoadMode'), | 266     ImageUtil.metrics.recordEnum(ImageUtil.getMetricName('LoadMode'), | 
| 266         loadType, ImageView.LOAD_TYPE_TOTAL); | 267         loadType, ImageView.LOAD_TYPE_TOTAL); | 
| 267     if (loadType != ImageView.LOAD_TYPE_CACHED_SCREEN) { | 268     if (loadType != ImageView.LOAD_TYPE_CACHED_SCREEN) { | 
| 268       ImageUtil.metrics.recordInterval(ImageUtil.getMetricName('DisplayTime')); | 269       ImageUtil.metrics.recordInterval(ImageUtil.getMetricName('DisplayTime')); | 
| 269     } | 270     } | 
| 270     if (opt_callback) opt_callback(loadType); | 271     if (opt_callback) opt_callback(loadType); | 
| 271   } | 272   } | 
| 272 }; | 273 }; | 
| 273 | 274 | 
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 522   if (this.order_.length > this.capacity_) | 523   if (this.order_.length > this.capacity_) | 
| 523     throw new Error('Exceeded cache capacity'); | 524     throw new Error('Exceeded cache capacity'); | 
| 524 }; | 525 }; | 
| 525 | 526 | 
| 526 ImageView.Cache.prototype.evictLRU = function() { | 527 ImageView.Cache.prototype.evictLRU = function() { | 
| 527   if (this.order_.length == this.capacity_) { | 528   if (this.order_.length == this.capacity_) { | 
| 528     var id = this.order_.shift(); | 529     var id = this.order_.shift(); | 
| 529     delete this.map_[id]; | 530     delete this.map_[id]; | 
| 530   } | 531   } | 
| 531 }; | 532 }; | 
| OLD | NEW | 
|---|