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
5function moduleDidLoad() {
6}
7
8function postThreadFunc(numThreads) {
9  return function () {
10    common.naclModule.postMessage({'message' : 'set_threads',
11                                   'value' : numThreads});
12  }
13}
14
15// Add event listeners after the NaCl module has loaded.  These listeners will
16// forward messages to the NaCl module via postMessage()
17function attachListeners() {
18  document.getElementById('benchmark').addEventListener('click',
19    function() {
20      common.naclModule.postMessage({'message' : 'run benchmark'});
21      common.updateStatus('BENCHMARKING... (please wait)');
22    });
23  var threads = [0, 1, 2, 4, 6, 8, 12, 16, 24, 32];
24  for (var i = 0; i < threads.length; i++) {
25    document.getElementById('radio'+i).addEventListener('click',
26        postThreadFunc(threads[i]));
27  }
28  document.getElementById('zoomRange').addEventListener('input',
29    function() {
30      var value = parseFloat(document.getElementById('zoomRange').value);
31      common.naclModule.postMessage({'message' : 'set_zoom',
32                                     'value' : value});
33    });
34  document.getElementById('lightRange').addEventListener('input',
35    function() {
36      var value = parseFloat(document.getElementById('lightRange').value);
37      common.naclModule.postMessage({'message' : 'set_light',
38                                     'value' : value});
39    });
40}
41
42// Load a texture and send pixel data down to NaCl module.
43function loadTexture(name) {
44  // Load image from jpg, decompress into canvas.
45  var img = new Image();
46  img.onload = function() {
47    var graph = document.createElement('canvas');
48    graph.width = img.width;
49    graph.height = img.height;
50    var context = graph.getContext('2d');
51    context.drawImage(img, 0, 0);
52    var imageData = context.getImageData(0, 0, img.width, img.height);
53    // Send NaCl module the raw image data obtained from canvas.
54    common.naclModule.postMessage({'message' : 'texture',
55                                   'name' : name,
56                                   'width' : img.width,
57                                   'height' : img.height,
58                                   'data' : imageData.data.buffer});
59  }
60  img.src = name;
61}
62
63// Handle a message coming from the NaCl module.
64function handleMessage(message_event) {
65  if (message_event.data['message'] == 'benchmark_result') {
66    // benchmark result
67    var result = message_event.data['value'];
68    console.log('Benchmark result:' + result);
69    result = (Math.round(result * 1000) / 1000).toFixed(3);
70    document.getElementById('result').textContent =
71      'Result: ' + result + ' seconds';
72    common.updateStatus('SUCCESS');
73  } else if (message_event.data['message'] == 'set_zoom') {
74    // zoom slider
75    var zoom = message_event.data['value'];
76    document.getElementById('zoomRange').value = zoom;
77  } else if (message_event.data['message'] == 'set_light') {
78    // light slider
79    var light = message_event.data['value'];
80    document.getElementById('lightRange').value = light;
81  } else if (message_event.data['message'] == 'request_textures') {
82    // NaCl module is requesting a set of textures.
83    var names = message_event.data['names'];
84    for (var i = 0; i < names.length; i++)
85      loadTexture(names[i]);
86  }
87}
88
89