// 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;