// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This function takes an object |imageSpec| with the key |path| - // corresponding to the internet URL to be translated - and optionally // |width| and |height| which are the maximum dimensions to be used when // converting the image. function loadImageData(imageSpec, callbacks) { var path = imageSpec.path; var img = new Image(); if (typeof callbacks.onerror === 'function') { img.onerror = function() { callbacks.onerror({ problem: 'could_not_load', path: path }); }; } img.onload = function() { var canvas = document.createElement('canvas'); if (img.width <= 0 || img.height <= 0) { callbacks.onerror({ problem: 'image_size_invalid', path: path}); return; } var scaleFactor = 1; if (imageSpec.width && imageSpec.width < img.width) scaleFactor = imageSpec.width / img.width; if (imageSpec.height && imageSpec.height < img.height) { var heightScale = imageSpec.height / img.height; if (heightScale < scaleFactor) scaleFactor = heightScale; } canvas.width = img.width * scaleFactor; canvas.height = img.height * scaleFactor; var canvas_context = canvas.getContext('2d'); canvas_context.clearRect(0, 0, canvas.width, canvas.height); canvas_context.drawImage(img, 0, 0, canvas.width, canvas.height); try { var imageData = canvas_context.getImageData( 0, 0, canvas.width, canvas.height); if (typeof callbacks.oncomplete === 'function') { callbacks.oncomplete( imageData.width, imageData.height, imageData.data.buffer); } } catch (e) { if (typeof callbacks.onerror === 'function') { callbacks.onerror({ problem: 'data_url_unavailable', path: path }); } } } img.src = path; } function on_complete_index(index, err, loading, finished, callbacks) { return function(width, height, imageData) { delete loading[index]; finished[index] = { width: width, height: height, data: imageData }; if (err) callbacks.onerror(index); if ($Object.keys(loading).length == 0) callbacks.oncomplete(finished); } } function loadAllImages(imageSpecs, callbacks) { var loading = {}, finished = [], index, pathname; for (var index = 0; index < imageSpecs.length; index++) { loading[index] = imageSpecs[index]; loadImageData(imageSpecs[index], { oncomplete: on_complete_index(index, false, loading, finished, callbacks), onerror: on_complete_index(index, true, loading, finished, callbacks) }); } } exports.loadImageData = loadImageData; exports.loadAllImages = loadAllImages;