Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / cc / layers / surface_layer.cc
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
5 #include "cc/layers/surface_layer.h"
6
7 #include "cc/base/swap_promise.h"
8 #include "cc/layers/surface_layer_impl.h"
9 #include "cc/trees/layer_tree_host.h"
10
11 namespace cc {
12
13 class SatisfySwapPromise : public SwapPromise {
14  public:
15   SatisfySwapPromise(SurfaceSequence sequence,
16                      const SurfaceLayer::SatisfyCallback& satisfy_callback)
17       : sequence_(sequence), satisfy_callback_(satisfy_callback) {}
18
19   ~SatisfySwapPromise() override {}
20
21  private:
22   void DidSwap(CompositorFrameMetadata* metadata) override {
23     metadata->satisfies_sequences.push_back(sequence_.sequence);
24   }
25
26   void DidNotSwap(DidNotSwapReason reason) override {
27     satisfy_callback_.Run(sequence_);
28   }
29   int64 TraceId() const override { return 0; }
30
31   SurfaceSequence sequence_;
32   SurfaceLayer::SatisfyCallback satisfy_callback_;
33
34   DISALLOW_COPY_AND_ASSIGN(SatisfySwapPromise);
35 };
36
37 scoped_refptr<SurfaceLayer> SurfaceLayer::Create(
38     const SatisfyCallback& satisfy_callback,
39     const RequireCallback& require_callback) {
40   return make_scoped_refptr(
41       new SurfaceLayer(satisfy_callback, require_callback));
42 }
43
44 SurfaceLayer::SurfaceLayer(const SatisfyCallback& satisfy_callback,
45                            const RequireCallback& require_callback)
46     : Layer(),
47       satisfy_callback_(satisfy_callback),
48       require_callback_(require_callback) {
49 }
50
51 SurfaceLayer::~SurfaceLayer() {
52   DCHECK(!layer_tree_host());
53   DCHECK(destroy_sequence_.is_null());
54 }
55
56 void SurfaceLayer::SetSurfaceId(SurfaceId surface_id, const gfx::Size& size) {
57   SatisfyDestroySequence();
58   surface_id_ = surface_id;
59   surface_size_ = size;
60   CreateNewDestroySequence();
61
62   UpdateDrawsContent(HasDrawableContent());
63   SetNeedsPushProperties();
64 }
65
66 scoped_ptr<LayerImpl> SurfaceLayer::CreateLayerImpl(LayerTreeImpl* tree_impl) {
67   return SurfaceLayerImpl::Create(tree_impl, id());
68 }
69
70 bool SurfaceLayer::HasDrawableContent() const {
71   return !surface_id_.is_null() && Layer::HasDrawableContent();
72 }
73
74 void SurfaceLayer::SetLayerTreeHost(LayerTreeHost* host) {
75   if (layer_tree_host() == host) {
76     Layer::SetLayerTreeHost(host);
77     return;
78   }
79
80   SatisfyDestroySequence();
81   Layer::SetLayerTreeHost(host);
82   CreateNewDestroySequence();
83 }
84
85 void SurfaceLayer::PushPropertiesTo(LayerImpl* layer) {
86   Layer::PushPropertiesTo(layer);
87   SurfaceLayerImpl* layer_impl = static_cast<SurfaceLayerImpl*>(layer);
88
89   layer_impl->SetSurfaceId(surface_id_);
90 }
91
92 void SurfaceLayer::CalculateContentsScale(float ideal_contents_scale,
93                                           float* contents_scale_x,
94                                           float* contents_scale_y,
95                                           gfx::Size* content_bounds) {
96   *content_bounds = surface_size_;
97   *contents_scale_x =
98       bounds().IsEmpty() ? 1.f : static_cast<float>(content_bounds->width()) /
99                                      bounds().width();
100   *contents_scale_y =
101       bounds().IsEmpty() ? 1.f : static_cast<float>(content_bounds->height()) /
102                                      bounds().height();
103 }
104
105 void SurfaceLayer::CreateNewDestroySequence() {
106   DCHECK(destroy_sequence_.is_null());
107   if (layer_tree_host()) {
108     destroy_sequence_ = layer_tree_host()->CreateSurfaceSequence();
109     require_callback_.Run(surface_id_, destroy_sequence_);
110   }
111 }
112
113 void SurfaceLayer::SatisfyDestroySequence() {
114   if (!layer_tree_host())
115     return;
116   DCHECK(!destroy_sequence_.is_null());
117   scoped_ptr<SatisfySwapPromise> satisfy(
118       new SatisfySwapPromise(destroy_sequence_, satisfy_callback_));
119   layer_tree_host()->QueueSwapPromise(satisfy.Pass());
120   destroy_sequence_ = SurfaceSequence();
121 }
122
123 }  // namespace cc