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_impl.h"
7 #include "base/strings/stringprintf.h"
8 #include "base/values.h"
9 #include "cc/base/math_util.h"
10 #include "cc/layers/quad_sink.h"
11 #include "cc/quads/texture_draw_quad.h"
12 #include "cc/trees/layer_tree_impl.h"
13 #include "ui/gfx/rect_f.h"
17 UIResourceLayerImpl::UIResourceLayerImpl(LayerTreeImpl
* tree_impl
, int id
)
18 : LayerImpl(tree_impl
, id
),
20 uv_top_left_(0.f
, 0.f
),
21 uv_bottom_right_(1.f
, 1.f
) {
22 vertex_opacity_
[0] = 1.0f
;
23 vertex_opacity_
[1] = 1.0f
;
24 vertex_opacity_
[2] = 1.0f
;
25 vertex_opacity_
[3] = 1.0f
;
28 UIResourceLayerImpl::~UIResourceLayerImpl() {}
30 scoped_ptr
<LayerImpl
> UIResourceLayerImpl::CreateLayerImpl(
31 LayerTreeImpl
* tree_impl
) {
32 return UIResourceLayerImpl::Create(tree_impl
, id()).PassAs
<LayerImpl
>();
35 void UIResourceLayerImpl::PushPropertiesTo(LayerImpl
* layer
) {
36 LayerImpl::PushPropertiesTo(layer
);
37 UIResourceLayerImpl
* layer_impl
= static_cast<UIResourceLayerImpl
*>(layer
);
39 layer_impl
->SetUIResourceId(ui_resource_id_
);
40 layer_impl
->SetImageBounds(image_bounds_
);
41 layer_impl
->SetUV(uv_top_left_
, uv_bottom_right_
);
42 layer_impl
->SetVertexOpacity(vertex_opacity_
);
45 void UIResourceLayerImpl::SetUIResourceId(UIResourceId uid
) {
46 if (uid
== ui_resource_id_
)
48 ui_resource_id_
= uid
;
49 NoteLayerPropertyChanged();
52 void UIResourceLayerImpl::SetImageBounds(gfx::Size image_bounds
) {
53 // This check imposes an ordering on the call sequence. An UIResource must
54 // exist before SetImageBounds can be called.
55 DCHECK(ui_resource_id_
);
57 if (image_bounds_
== image_bounds
)
60 image_bounds_
= image_bounds
;
62 NoteLayerPropertyChanged();
65 void UIResourceLayerImpl::SetUV(gfx::PointF top_left
,
66 gfx::PointF bottom_right
) {
67 if (uv_top_left_
== top_left
&& uv_bottom_right_
== bottom_right
)
69 uv_top_left_
= top_left
;
70 uv_bottom_right_
= bottom_right
;
71 NoteLayerPropertyChanged();
74 void UIResourceLayerImpl::SetVertexOpacity(const float vertex_opacity
[4]) {
75 if (vertex_opacity_
[0] == vertex_opacity
[0] &&
76 vertex_opacity_
[1] == vertex_opacity
[1] &&
77 vertex_opacity_
[2] == vertex_opacity
[2] &&
78 vertex_opacity_
[3] == vertex_opacity
[3])
80 vertex_opacity_
[0] = vertex_opacity
[0];
81 vertex_opacity_
[1] = vertex_opacity
[1];
82 vertex_opacity_
[2] = vertex_opacity
[2];
83 vertex_opacity_
[3] = vertex_opacity
[3];
84 NoteLayerPropertyChanged();
87 bool UIResourceLayerImpl::WillDraw(DrawMode draw_mode
,
88 ResourceProvider
* resource_provider
) {
89 if (!ui_resource_id_
|| draw_mode
== DRAW_MODE_RESOURCELESS_SOFTWARE
)
91 return LayerImpl::WillDraw(draw_mode
, resource_provider
);
94 void UIResourceLayerImpl::AppendQuads(QuadSink
* quad_sink
,
95 AppendQuadsData
* append_quads_data
) {
96 SharedQuadState
* shared_quad_state
=
97 quad_sink
->UseSharedQuadState(CreateSharedQuadState());
98 AppendDebugBorderQuad(quad_sink
, shared_quad_state
, append_quads_data
);
100 if (!ui_resource_id_
)
103 ResourceProvider::ResourceId resource
=
104 layer_tree_impl()->ResourceIdForUIResource(ui_resource_id_
);
109 static const bool flipped
= false;
110 static const bool premultiplied_alpha
= true;
112 DCHECK(!bounds().IsEmpty());
114 gfx::Rect
quad_rect(bounds());
116 // TODO(clholgat): Properly calculate opacity: crbug.com/300027
117 gfx::Rect
opaque_rect(contents_opaque() ? quad_rect
: gfx::Rect());
118 scoped_ptr
<TextureDrawQuad
> quad
;
120 quad
= TextureDrawQuad::Create();
121 quad
->SetNew(shared_quad_state
,
131 quad_sink
->Append(quad
.PassAs
<DrawQuad
>(), append_quads_data
);
134 const char* UIResourceLayerImpl::LayerTypeAsString() const {
135 return "cc::UIResourceLayerImpl";
138 base::DictionaryValue
* UIResourceLayerImpl::LayerTreeAsJson() const {
139 base::DictionaryValue
* result
= LayerImpl::LayerTreeAsJson();
141 result
->Set("ImageBounds", MathUtil::AsValue(image_bounds_
).release());
143 base::ListValue
* list
= new base::ListValue
;
144 list
->AppendDouble(vertex_opacity_
[0]);
145 list
->AppendDouble(vertex_opacity_
[1]);
146 list
->AppendDouble(vertex_opacity_
[2]);
147 list
->AppendDouble(vertex_opacity_
[3]);
148 result
->Set("VertexOpacity", list
);
150 result
->Set("UVTopLeft", MathUtil::AsValue(uv_top_left_
).release());
151 result
->Set("UVBottomRight", MathUtil::AsValue(uv_bottom_right_
).release());