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