- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / test / data / third_party / spaceport / js / sprites / renderers / DomContext.js
1 define([ 'util/ensureCallback' ], function (ensureCallback) {
2     function DomContext(sourceData, frameData, onLoad) {
3         var onLoadCalled = 0;
4         var onLoadExpected = 0;
5         var onLoadReady = false;
6
7         function checkOnLoad() {
8             if (onLoadReady) {
9                 if (onLoadCalled === onLoadExpected) {
10                     onLoad();
11                 }
12             }
13         }
14
15         var sourcePool = [ ];
16         var elementPool = [ ];
17         var elements = [ ];
18         var i, j;
19
20         for (i = 0; i < frameData.length; ++i) {
21             var objectTransforms = frameData[i];
22             var frameElements = [ ];
23             var sourceElements = [ ];
24
25             for (j = 0; j < objectTransforms.length; ++j) {
26                 var element;
27                 var img = sourceData.getImage(i);
28                 var index = sourcePool.indexOf(img);
29
30                 if (index >= 0) {
31                     // Image is available in the pool; take it
32                     element = elementPool.splice(index, 1)[0];
33                     sourcePool.splice(index, 1);
34                 } else {
35                     // Image not in the pool; add it
36                     element = img.cloneNode(true);
37                     element.style.position = 'absolute';
38                     element.style.left = '0';
39                     element.style.top = '0';
40
41                     if (element instanceof Image) {
42                         onLoadExpected += 1;
43                         element.onload = function () {
44                             onLoadCalled += 1;
45                             checkOnLoad();
46                         };
47                         element.src = element.src;
48                     }
49                 }
50
51                 sourceElements.push(img);
52                 frameElements.push(element);
53             }
54
55             sourcePool.push.apply(sourcePool, sourceElements);
56             elementPool.push.apply(elementPool, frameElements);
57             elements.push(frameElements);
58         }
59
60         onLoadReady = true;
61         checkOnLoad();
62
63         this.elements = elements;
64         this.activeElements = null;
65
66         this.transformData = null;
67     }
68
69     DomContext.prototype.unload = function unload() {
70         this.activeElements.forEach(function (el) {
71             if (el.parentNode) {
72                 el.parentNode.removeChild(el);
73             }
74         });
75
76         this.activeElements = null;
77     };
78
79     DomContext.prototype.renderFrame = function renderFrame(frameIndex) {
80         var transforms = this.transformData[frameIndex];
81         var elements = this.elements[frameIndex];
82
83         this.processElements(elements, transforms);
84
85         // Elements no longer displayed must be removed from the DOM
86         var activeElements = this.activeElements;
87         if (activeElements) {
88             var count = activeElements.length;
89             var i;
90             for (i = 0; i < count; ++i) {
91                 var element = activeElements[i];
92                 if (element.parentNode && elements.indexOf(element) < 0) {
93                     element.parentNode.removeChild(element);
94                 }
95             }
96         }
97
98         this.activeElements = elements;
99     };
100
101     return DomContext;
102 });