OLD | NEW |
| (Empty) |
1 // Copyright 2013 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. | |
9 function 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 | |
57 function 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 | |
68 function 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 | |
81 exports.loadImageData = loadImageData; | |
82 exports.loadAllImages = loadAllImages; | |
OLD | NEW |