1 // Copyright 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.
5 #include "cc/layers/ui_resource_layer.h"
7 #include "cc/layers/ui_resource_layer_impl.h"
8 #include "cc/resources/prioritized_resource.h"
9 #include "cc/resources/resource_update.h"
10 #include "cc/resources/resource_update_queue.h"
11 #include "cc/resources/scoped_ui_resource.h"
12 #include "cc/resources/ui_resource_bitmap.h"
13 #include "cc/trees/layer_tree_host.h"
20 class ScopedUIResourceHolder
: public UIResourceLayer::UIResourceHolder
{
22 static scoped_ptr
<ScopedUIResourceHolder
> Create(LayerTreeHost
* host
,
23 const SkBitmap
& skbitmap
) {
24 return make_scoped_ptr(new ScopedUIResourceHolder(host
, skbitmap
));
26 virtual UIResourceId
id() OVERRIDE
{ return resource_
->id(); }
29 ScopedUIResourceHolder(LayerTreeHost
* host
, const SkBitmap
& skbitmap
) {
30 resource_
= ScopedUIResource::Create(host
, UIResourceBitmap(skbitmap
));
33 scoped_ptr
<ScopedUIResource
> resource_
;
36 class SharedUIResourceHolder
: public UIResourceLayer::UIResourceHolder
{
38 static scoped_ptr
<SharedUIResourceHolder
> Create(UIResourceId id
) {
39 return make_scoped_ptr(new SharedUIResourceHolder(id
));
42 virtual UIResourceId
id() OVERRIDE
{ return id_
; }
45 explicit SharedUIResourceHolder(UIResourceId id
) : id_(id
) {}
50 } // anonymous namespace
52 UIResourceLayer::UIResourceHolder::~UIResourceHolder() {}
54 scoped_refptr
<UIResourceLayer
> UIResourceLayer::Create() {
55 return make_scoped_refptr(new UIResourceLayer());
58 UIResourceLayer::UIResourceLayer()
60 uv_top_left_(0.f
, 0.f
),
61 uv_bottom_right_(1.f
, 1.f
) {
62 vertex_opacity_
[0] = 1.0f
;
63 vertex_opacity_
[1] = 1.0f
;
64 vertex_opacity_
[2] = 1.0f
;
65 vertex_opacity_
[3] = 1.0f
;
68 UIResourceLayer::~UIResourceLayer() {}
70 scoped_ptr
<LayerImpl
> UIResourceLayer::CreateLayerImpl(
71 LayerTreeImpl
* tree_impl
) {
72 return UIResourceLayerImpl::Create(tree_impl
, id()).PassAs
<LayerImpl
>();
75 void UIResourceLayer::SetUV(const gfx::PointF
& top_left
,
76 const gfx::PointF
& bottom_right
) {
77 if (uv_top_left_
== top_left
&& uv_bottom_right_
== bottom_right
)
79 uv_top_left_
= top_left
;
80 uv_bottom_right_
= bottom_right
;
84 void UIResourceLayer::SetVertexOpacity(float bottom_left
,
88 // Indexing according to the quad vertex generation:
92 if (vertex_opacity_
[0] == bottom_left
&&
93 vertex_opacity_
[1] == top_left
&&
94 vertex_opacity_
[2] == top_right
&&
95 vertex_opacity_
[3] == bottom_right
)
97 vertex_opacity_
[0] = bottom_left
;
98 vertex_opacity_
[1] = top_left
;
99 vertex_opacity_
[2] = top_right
;
100 vertex_opacity_
[3] = bottom_right
;
104 void UIResourceLayer::SetLayerTreeHost(LayerTreeHost
* host
) {
105 if (host
== layer_tree_host())
108 Layer::SetLayerTreeHost(host
);
110 // Recreate the resource hold against the new LTH.
111 RecreateUIResourceHolder();
114 void UIResourceLayer::RecreateUIResourceHolder() {
115 ui_resource_holder_
.reset();
116 if (!layer_tree_host() || bitmap_
.empty())
119 ui_resource_holder_
=
120 ScopedUIResourceHolder::Create(layer_tree_host(), bitmap_
);
123 void UIResourceLayer::SetBitmap(const SkBitmap
& skbitmap
) {
126 RecreateUIResourceHolder();
130 void UIResourceLayer::SetUIResourceId(UIResourceId resource_id
) {
131 if (ui_resource_holder_
&& ui_resource_holder_
->id() == resource_id
)
135 ui_resource_holder_
= SharedUIResourceHolder::Create(resource_id
);
137 ui_resource_holder_
.reset();
143 bool UIResourceLayer::DrawsContent() const {
144 return ui_resource_holder_
&& ui_resource_holder_
->id() &&
145 Layer::DrawsContent();
148 void UIResourceLayer::PushPropertiesTo(LayerImpl
* layer
) {
149 Layer::PushPropertiesTo(layer
);
150 UIResourceLayerImpl
* layer_impl
= static_cast<UIResourceLayerImpl
*>(layer
);
152 if (!ui_resource_holder_
) {
153 layer_impl
->SetUIResourceId(0);
155 DCHECK(layer_tree_host());
157 gfx::Size image_size
=
158 layer_tree_host()->GetUIResourceSize(ui_resource_holder_
->id());
159 layer_impl
->SetUIResourceId(ui_resource_holder_
->id());
160 layer_impl
->SetImageBounds(image_size
);
161 layer_impl
->SetUV(uv_top_left_
, uv_bottom_right_
);
162 layer_impl
->SetVertexOpacity(vertex_opacity_
);