1// Copyright (c) 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'use strict';
6
7/**
8 * @fileoverview Provides the LayerTreeHostImpl model-level objects.
9 */
10base.require('base.bbox2');
11base.require('tracing.trace_model.object_instance');
12base.require('cc.constants');
13base.require('cc.layer_tree_impl');
14base.require('cc.util');
15
16base.exportTo('cc', function() {
17  var constants = cc.constants;
18  var ObjectSnapshot = tracing.trace_model.ObjectSnapshot;
19  var ObjectInstance = tracing.trace_model.ObjectInstance;
20
21  /**
22   * @constructor
23   */
24  function LayerTreeHostImplSnapshot() {
25    ObjectSnapshot.apply(this, arguments);
26  }
27
28  LayerTreeHostImplSnapshot.prototype = {
29    __proto__: ObjectSnapshot.prototype,
30
31    preInitialize: function() {
32      cc.preInitializeObject(this);
33    },
34
35    initialize: function() {
36      cc.moveRequiredFieldsFromArgsToToplevel(
37          this, ['deviceViewportSize',
38            'activeTree']);
39      cc.moveOptionalFieldsFromArgsToToplevel(
40          this, ['pendingTree',
41            'tiles']);
42
43      this.activeTree.layerTreeHostImpl = this;
44      this.activeTree.whichTree = constants.ACTIVE_TREE;
45      if (this.pendingTree) {
46        this.pendingTree.layerTreeHostImpl = this;
47        this.pendingTree.whichTree = constants.PENDING_TREE;
48      }
49    },
50
51    getTree: function(whichTree) {
52      if (whichTree == constants.ACTIVE_TREE)
53        return this.activeTree;
54      if (whichTree == constants.PENDING_TREE)
55        return this.pendingTree;
56      throw new Exception('Unknown tree type + ' + whichTree);
57    }
58  };
59
60  ObjectSnapshot.register('cc::LayerTreeHostImpl', LayerTreeHostImplSnapshot);
61
62  /**
63   * @constructor
64   */
65  function LayerTreeHostImplInstance() {
66    ObjectInstance.apply(this, arguments);
67
68    this.allLayersBBox_ = undefined;
69  }
70
71  LayerTreeHostImplInstance.prototype = {
72    __proto__: ObjectInstance.prototype,
73
74    get allContentsScales() {
75      if (this.allContentsScales_)
76        return this.allContentsScales_;
77
78      var scales = {};
79      for (var tileID in this.allTileHistories_) {
80        var tileHistory = this.allTileHistories_[tileID];
81        scales[tileHistory.contentsScale] = true;
82      }
83      this.allContentsScales_ = base.dictionaryKeys(scales);
84      return this.allContentsScales_;
85    },
86
87    get allLayersBBox() {
88      if (this.allLayersBBox_)
89        return this.allLayersBBox_;
90      var bbox = new base.BBox2();
91      function handleTree(tree) {
92        tree.renderSurfaceLayerList.forEach(function(layer) {
93          bbox.addQuad(layer.layerQuad);
94        });
95      }
96      this.snapshots.forEach(function(lthi) {
97        handleTree(lthi.activeTree);
98        if (lthi.pendingTree)
99          handleTree(lthi.pendingTree);
100      });
101      this.allLayersBBox_ = bbox;
102      return this.allLayersBBox_;
103    }
104  };
105
106  ObjectInstance.register('cc::LayerTreeHostImpl', LayerTreeHostImplInstance);
107
108  return {
109    LayerTreeHostImplSnapshot: LayerTreeHostImplSnapshot,
110    LayerTreeHostImplInstance: LayerTreeHostImplInstance
111
112  };
113});
114