146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This function takes an object |imageSpec| with the key |path| - 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// corresponding to the internet URL to be translated - and optionally 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |width| and |height| which are the maximum dimensions to be used when 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// converting the image. 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)function loadImageData(imageSpec, callbacks) { 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var path = imageSpec.path; 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var img = new Image(); 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (typeof callbacks.onerror === 'function') { 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) img.onerror = function() { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callbacks.onerror({ problem: 'could_not_load', path: path }); 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) img.onload = function() { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var canvas = document.createElement('canvas'); 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (img.width <= 0 || img.height <= 0) { 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callbacks.onerror({ problem: 'image_size_invalid', path: path}); 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var scaleFactor = 1; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (imageSpec.width && imageSpec.width < img.width) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scaleFactor = imageSpec.width / img.width; 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (imageSpec.height && imageSpec.height < img.height) { 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var heightScale = imageSpec.height / img.height; 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (heightScale < scaleFactor) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scaleFactor = heightScale; 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) canvas.width = img.width * scaleFactor; 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) canvas.height = img.height * scaleFactor; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var canvas_context = canvas.getContext('2d'); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas_context.clearRect(0, 0, canvas.width, canvas.height); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas_context.drawImage(img, 0, 0, canvas.width, canvas.height); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) try { 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) var imageData = canvas_context.getImageData( 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 0, canvas.width, canvas.height); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (typeof callbacks.oncomplete === 'function') { 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) callbacks.oncomplete( 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) imageData.width, imageData.height, imageData.data.buffer); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } catch (e) { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (typeof callbacks.onerror === 'function') { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callbacks.onerror({ problem: 'data_url_unavailable', path: path }); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) img.src = path; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function on_complete_index(index, err, loading, finished, callbacks) { 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return function(width, height, imageData) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete loading[index]; 607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) finished[index] = { width: width, height: height, data: imageData }; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (err) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callbacks.onerror(index); 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if ($Object.keys(loading).length == 0) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callbacks.oncomplete(finished); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function loadAllImages(imageSpecs, callbacks) { 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var loading = {}, finished = [], 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) index, pathname; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (var index = 0; index < imageSpecs.length; index++) { 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loading[index] = imageSpecs[index]; 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) loadImageData(imageSpecs[index], { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) oncomplete: on_complete_index(index, false, loading, finished, callbacks), 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) onerror: on_complete_index(index, true, loading, finished, callbacks) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)exports.loadImageData = loadImageData; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)exports.loadAllImages = loadAllImages; 83