1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// This function takes an object |imageSpec| with the key |path| - 6// corresponding to the internet URL to be translated - and optionally 7// |width| and |height| which are the maximum dimensions to be used when 8// converting the image. 9function loadImageData(imageSpec, callbacks) { 10 var path = imageSpec.path; 11 var img = new Image(); 12 if (typeof callbacks.onerror === 'function') { 13 img.onerror = function() { 14 callbacks.onerror({ problem: 'could_not_load', path: path }); 15 }; 16 } 17 img.onload = function() { 18 var canvas = document.createElement('canvas'); 19 20 if (img.width <= 0 || img.height <= 0) { 21 callbacks.onerror({ problem: 'image_size_invalid', path: path}); 22 return; 23 } 24 25 var scaleFactor = 1; 26 if (imageSpec.width && imageSpec.width < img.width) 27 scaleFactor = imageSpec.width / img.width; 28 29 if (imageSpec.height && imageSpec.height < img.height) { 30 var heightScale = imageSpec.height / img.height; 31 if (heightScale < scaleFactor) 32 scaleFactor = heightScale; 33 } 34 35 canvas.width = img.width * scaleFactor; 36 canvas.height = img.height * scaleFactor; 37 38 var canvas_context = canvas.getContext('2d'); 39 canvas_context.clearRect(0, 0, canvas.width, canvas.height); 40 canvas_context.drawImage(img, 0, 0, canvas.width, canvas.height); 41 try { 42 var imageData = canvas_context.getImageData( 43 0, 0, canvas.width, canvas.height); 44 if (typeof callbacks.oncomplete === 'function') { 45 callbacks.oncomplete( 46 imageData.width, imageData.height, imageData.data.buffer); 47 } 48 } catch (e) { 49 if (typeof callbacks.onerror === 'function') { 50 callbacks.onerror({ problem: 'data_url_unavailable', path: path }); 51 } 52 } 53 } 54 img.src = path; 55} 56 57function on_complete_index(index, err, loading, finished, callbacks) { 58 return function(width, height, imageData) { 59 delete loading[index]; 60 finished[index] = { width: width, height: height, data: imageData }; 61 if (err) 62 callbacks.onerror(index); 63 if ($Object.keys(loading).length == 0) 64 callbacks.oncomplete(finished); 65 } 66} 67 68function loadAllImages(imageSpecs, callbacks) { 69 var loading = {}, finished = [], 70 index, pathname; 71 72 for (var index = 0; index < imageSpecs.length; index++) { 73 loading[index] = imageSpecs[index]; 74 loadImageData(imageSpecs[index], { 75 oncomplete: on_complete_index(index, false, loading, finished, callbacks), 76 onerror: on_complete_index(index, true, loading, finished, callbacks) 77 }); 78 } 79} 80 81exports.loadImageData = loadImageData; 82exports.loadAllImages = loadAllImages; 83