Roll src/third_party/WebKit d9c6159:8139f33 (svn 201974:201975)
[chromium-blink-merge.git] / chrome / test / data / third_party / spaceport / js / sprites / renderers / DomContext.js
blobd4a4d97998e457785ca5981587b278f1245c4acc
1 define([ 'util/ensureCallback' ], function (ensureCallback) {
2 function DomContext(sourceData, frameData, onLoad) {
3 var onLoadCalled = 0;
4 var onLoadExpected = 0;
5 var onLoadReady = false;
7 function checkOnLoad() {
8 if (onLoadReady) {
9 if (onLoadCalled === onLoadExpected) {
10 onLoad();
15 var sourcePool = [ ];
16 var elementPool = [ ];
17 var elements = [ ];
18 var i, j;
20 for (i = 0; i < frameData.length; ++i) {
21 var objectTransforms = frameData[i];
22 var frameElements = [ ];
23 var sourceElements = [ ];
25 for (j = 0; j < objectTransforms.length; ++j) {
26 var element;
27 var img = sourceData.getImage(i);
28 var index = sourcePool.indexOf(img);
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';
41 if (element instanceof Image) {
42 onLoadExpected += 1;
43 element.onload = function () {
44 onLoadCalled += 1;
45 checkOnLoad();
47 element.src = element.src;
51 sourceElements.push(img);
52 frameElements.push(element);
55 sourcePool.push.apply(sourcePool, sourceElements);
56 elementPool.push.apply(elementPool, frameElements);
57 elements.push(frameElements);
60 onLoadReady = true;
61 checkOnLoad();
63 this.elements = elements;
64 this.activeElements = null;
66 this.transformData = null;
69 DomContext.prototype.unload = function unload() {
70 this.activeElements.forEach(function (el) {
71 if (el.parentNode) {
72 el.parentNode.removeChild(el);
74 });
76 this.activeElements = null;
79 DomContext.prototype.renderFrame = function renderFrame(frameIndex) {
80 var transforms = this.transformData[frameIndex];
81 var elements = this.elements[frameIndex];
83 this.processElements(elements, transforms);
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);
98 this.activeElements = elements;
101 return DomContext;