blob: 2cf47030a51cc36f83eb8d95aa890e31f744895e [file] [log] [blame]
[email protected]5e5648a2013-11-18 00:39:331// Copyright 2012 The Chromium Authors. All rights reserved.
[email protected]94f206c12012-08-25 00:09:142// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]cc3cfaa2013-03-18 09:05:525#include "cc/layers/layer_impl.h"
[email protected]94f206c12012-08-25 00:09:146
avi02a4d172015-12-21 06:14:367#include <stddef.h>
8#include <stdint.h>
9
vollick83fbfc82016-03-22 18:33:2710#include <algorithm>
dchengf9c838e2015-12-18 08:10:1211#include <utility>
12
[email protected]9f3be432013-12-03 03:53:2213#include "base/json/json_reader.h"
danakj60bc3bc2016-04-09 00:24:4814#include "base/memory/ptr_util.h"
vmpstr91e23092015-06-08 22:24:1615#include "base/numerics/safe_conversions.h"
[email protected]8e61d4b2013-06-10 22:11:4816#include "base/strings/stringprintf.h"
primianoc06e2382015-01-28 04:21:4917#include "base/trace_event/trace_event.h"
18#include "base/trace_event/trace_event_argument.h"
[email protected]681ccff2013-03-18 06:13:5219#include "cc/base/math_util.h"
[email protected]d5467eb72014-08-22 01:16:4320#include "cc/base/simple_enclosed_region.h"
chrishtr82b5d9502017-03-20 18:25:3321#include "cc/benchmarks/micro_benchmark_impl.h"
[email protected]6e84de22013-03-18 06:54:2722#include "cc/debug/debug_colors.h"
23#include "cc/debug/layer_tree_debug_state.h"
[email protected]f6742f52013-05-08 23:52:2224#include "cc/debug/traced_value.h"
danakj35904762016-01-21 20:49:4025#include "cc/input/main_thread_scrolling_reason.h"
tdresserd9e201472015-07-31 13:15:0726#include "cc/input/scroll_state.h"
aeliasa57c40d122015-10-08 00:20:0927#include "cc/layers/layer.h"
[email protected]3d86dd7a2014-01-24 01:33:1128#include "cc/layers/layer_utils.h"
[email protected]0e5f7142013-05-24 06:45:3629#include "cc/output/copy_output_request.h"
[email protected]89e8267a2013-03-18 07:50:5630#include "cc/quads/debug_border_draw_quad.h"
[email protected]0cd7d6f72014-08-22 14:50:5131#include "cc/quads/render_pass.h"
trchendba8b1502016-07-08 09:47:0132#include "cc/trees/clip_node.h"
ajumad9432e32015-11-30 19:43:4433#include "cc/trees/draw_property_utils.h"
trchendba8b1502016-07-08 09:47:0134#include "cc/trees/effect_node.h"
[email protected]3d86dd7a2014-01-24 01:33:1135#include "cc/trees/layer_tree_host_common.h"
[email protected]556fd292013-03-18 08:03:0436#include "cc/trees/layer_tree_impl.h"
37#include "cc/trees/layer_tree_settings.h"
loyso6bd8b612016-11-11 07:00:0238#include "cc/trees/mutable_properties.h"
loyso6d6356e2016-11-02 23:41:0839#include "cc/trees/mutator_host.h"
[email protected]556fd292013-03-18 08:03:0440#include "cc/trees/proxy.h"
trchendba8b1502016-07-08 09:47:0141#include "cc/trees/scroll_node.h"
42#include "cc/trees/transform_node.h"
heejin.r.chungd28506ba2014-10-23 16:36:2043#include "ui/gfx/geometry/box_f.h"
44#include "ui/gfx/geometry/point_conversions.h"
45#include "ui/gfx/geometry/quad_f.h"
46#include "ui/gfx/geometry/rect_conversions.h"
47#include "ui/gfx/geometry/size_conversions.h"
[email protected]adeda572014-01-31 00:49:4748#include "ui/gfx/geometry/vector2d_conversions.h"
[email protected]94f206c12012-08-25 00:09:1449
[email protected]9c88e562012-09-14 22:21:3050namespace cc {
sunxdc36713a2016-03-03 22:31:1051LayerImpl::LayerImpl(LayerTreeImpl* tree_impl, int id)
jaydasikaf419bf72016-06-15 10:21:2152 : layer_id_(id),
[email protected]7aba6662013-03-12 10:17:3453 layer_tree_impl_(tree_impl),
jaydasika38be7a822016-04-21 16:07:0654 test_properties_(nullptr),
aeliasa57c40d122015-10-08 00:20:0955 scroll_clip_layer_id_(Layer::INVALID_ID),
danakj35904762016-01-21 20:49:4056 main_thread_scrolling_reasons_(
57 MainThreadScrollingReason::kNotScrollingOnMain),
[email protected]59a7d552013-10-22 03:36:4358 user_scrollable_horizontal_(true),
59 user_scrollable_vertical_(true),
ennee95b1542015-04-20 20:35:5060 should_flatten_transform_from_property_tree_(false),
[email protected]7aba6662013-03-12 10:17:3461 layer_property_changed_(false),
sadrul32d10972016-07-30 05:26:2162 may_contain_video_(false),
[email protected]7aba6662013-03-12 10:17:3463 masks_to_bounds_(false),
64 contents_opaque_(false),
[email protected]7aba6662013-03-12 10:17:3465 use_parent_backface_visibility_(false),
jaydasika62bd3dd2016-02-04 18:52:5566 use_local_transform_for_backface_visibility_(false),
67 should_check_backface_visibility_(false),
[email protected]7aba6662013-03-12 10:17:3468 draws_content_(false),
ajuma0adb5902016-04-28 16:32:3869 is_drawn_render_surface_layer_list_member_(false),
vmpstre1564a52015-11-24 19:43:1570 was_ever_ready_since_last_transform_animation_(true),
[email protected]c55f3fc2013-12-10 05:48:4871 background_color_(0),
jaydasikac6326bb2016-03-03 03:46:1472 safe_opaque_background_color_(0),
jaydasikadba9f752016-07-26 20:35:3473 transform_tree_index_(TransformTree::kInvalidNodeId),
74 effect_tree_index_(EffectTree::kInvalidNodeId),
75 clip_tree_index_(ClipTree::kInvalidNodeId),
76 scroll_tree_index_(ScrollTree::kInvalidNodeId),
vmpstr3d1d72c2015-01-26 18:27:4077 current_draw_mode_(DRAW_MODE_NONE),
vollickfd6e4f4a2016-01-22 19:13:2978 mutable_properties_(MutableProperty::kNone),
primianocb1afb32016-02-29 20:46:0579 debug_info_(nullptr),
vmpstr6e8dd7c2016-06-21 00:59:5880 has_will_change_transform_hint_(false),
bokan169f5ad2016-10-30 16:32:4881 needs_push_properties_(false),
skobes56451775d2017-03-28 18:46:3882 scrollbars_hidden_(false),
jaydasikaaf0dcd172017-05-01 17:37:1783 needs_show_scrollbars_(false),
84 raster_even_if_not_in_rsll_(false) {
[email protected]bf691c22013-03-26 21:15:0685 DCHECK_GT(layer_id_, 0);
loyso9556c732016-03-11 07:54:5886
bokane1aab122017-03-09 20:03:5787 DCHECK(layer_tree_impl_);
vollickcb3f6b12016-03-01 23:44:1088 layer_tree_impl_->RegisterLayer(this);
vollickcb3f6b12016-03-01 23:44:1089 layer_tree_impl_->AddToElementMap(this);
vollick9c7f6d02016-01-08 04:36:3890
[email protected]ad0250b2014-01-18 03:24:3491 SetNeedsPushProperties();
[email protected]94f206c12012-08-25 00:09:1492}
93
[email protected]7aba6662013-03-12 10:17:3494LayerImpl::~LayerImpl() {
[email protected]ffbb2212013-06-02 23:47:5995 DCHECK_EQ(DRAW_MODE_NONE, current_draw_mode_);
[email protected]18a70192013-04-26 16:18:2596
aeliasa57c40d122015-10-08 00:20:0997 layer_tree_impl_->UnregisterScrollLayer(this);
vollickcb3f6b12016-03-01 23:44:1098 layer_tree_impl_->UnregisterLayer(this);
[email protected]0e98cdd2013-08-23 00:44:3099
vollickcb3f6b12016-03-01 23:44:10100 layer_tree_impl_->RemoveFromElementMap(this);
vollick9c7f6d02016-01-08 04:36:38101
[email protected]f5ad4282014-02-15 14:23:16102 TRACE_EVENT_OBJECT_DELETED_WITH_ID(
[email protected]b4dc36472014-02-26 02:48:25103 TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerImpl", this);
[email protected]94f206c12012-08-25 00:09:14104}
105
vmpstrd6dce2602016-05-18 20:19:04106void LayerImpl::SetHasWillChangeTransformHint(bool has_will_change) {
vmpstrd6dce2602016-05-18 20:19:04107 has_will_change_transform_hint_ = has_will_change;
vmpstrd6dce2602016-05-18 20:19:04108}
109
chrishtrcde557b62016-10-19 19:04:01110
loyso6d6356e2016-11-02 23:41:08111MutatorHost* LayerImpl::GetMutatorHost() const {
112 return layer_tree_impl_ ? layer_tree_impl_->mutator_host() : nullptr;
khushalsagaraf222d92016-07-08 21:19:32113}
114
115ElementListType LayerImpl::GetElementTypeForAnimation() const {
116 return IsActive() ? ElementListType::ACTIVE : ElementListType::PENDING;
117}
118
[email protected]9f3be432013-12-03 03:53:22119void LayerImpl::SetDebugInfo(
danakj60bc3bc2016-04-09 00:24:48120 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> debug_info) {
primianocb1afb32016-02-29 20:46:05121 owned_debug_info_ = std::move(debug_info);
122 debug_info_ = owned_debug_info_.get();
[email protected]ad0250b2014-01-18 03:24:34123 SetNeedsPushProperties();
[email protected]9f3be432013-12-03 03:53:22124}
125
vollick692444f2015-05-20 15:39:14126void LayerImpl::SetTransformTreeIndex(int index) {
127 transform_tree_index_ = index;
vollick692444f2015-05-20 15:39:14128}
129
130void LayerImpl::SetClipTreeIndex(int index) {
131 clip_tree_index_ = index;
vollick692444f2015-05-20 15:39:14132}
133
weiliangc6a52f302015-08-18 16:29:35134void LayerImpl::SetEffectTreeIndex(int index) {
135 effect_tree_index_ = index;
vollick692444f2015-05-20 15:39:14136}
137
sunxd47c2a0e32016-07-25 15:34:10138int LayerImpl::render_target_effect_tree_index() const {
wkorman5a126a52017-01-06 18:41:13139 EffectNode* effect_node = GetEffectTree().Node(effect_tree_index_);
ajuma6b96f4cc42017-02-23 14:07:12140
141 return GetEffectTree().GetRenderSurface(effect_tree_index_)
142 ? effect_node->id
143 : effect_node->target_id;
sunxd47c2a0e32016-07-25 15:34:10144}
145
sunxdea1df782016-01-28 00:12:33146void LayerImpl::SetScrollTreeIndex(int index) {
147 scroll_tree_index_ = index;
sunxdea1df782016-01-28 00:12:33148}
149
[email protected]9be1adc82014-05-07 15:39:41150void LayerImpl::PopulateSharedQuadState(SharedQuadState* state) const {
sunxdf0866592017-04-21 17:01:57151 state->SetAll(draw_properties_.target_space_transform, gfx::Rect(bounds()),
danakj64767d902015-06-19 00:10:43152 draw_properties_.visible_layer_rect, draw_properties_.clip_rect,
ajumae2b7a5c2015-09-30 21:41:42153 draw_properties_.is_clipped, draw_properties_.opacity,
jaydasika815ffdb82017-04-10 18:19:46154 SkBlendMode::kSrcOver, GetSortingContextId());
[email protected]94f206c12012-08-25 00:09:14155}
156
xlai5e87e712016-12-16 02:10:25157void LayerImpl::PopulateScaledSharedQuadState(
158 SharedQuadState* state,
159 float layer_to_content_scale_x,
160 float layer_to_content_scale_y) const {
enne467829b2015-02-13 02:39:34161 gfx::Transform scaled_draw_transform =
162 draw_properties_.target_space_transform;
xlai5e87e712016-12-16 02:10:25163 scaled_draw_transform.Scale(SK_MScalar1 / layer_to_content_scale_x,
164 SK_MScalar1 / layer_to_content_scale_y);
165 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize(
166 bounds(), layer_to_content_scale_x, layer_to_content_scale_y);
167 gfx::Rect scaled_visible_layer_rect = gfx::ScaleToEnclosingRect(
168 visible_layer_rect(), layer_to_content_scale_x, layer_to_content_scale_y);
danakj64767d902015-06-19 00:10:43169 scaled_visible_layer_rect.Intersect(gfx::Rect(scaled_bounds));
enne467829b2015-02-13 02:39:34170
sunxdf0866592017-04-21 17:01:57171 state->SetAll(scaled_draw_transform, gfx::Rect(scaled_bounds),
172 scaled_visible_layer_rect, draw_properties().clip_rect,
173 draw_properties().is_clipped, draw_properties().opacity,
174 SkBlendMode::kSrcOver, GetSortingContextId());
enne467829b2015-02-13 02:39:34175}
176
[email protected]ffbb2212013-06-02 23:47:59177bool LayerImpl::WillDraw(DrawMode draw_mode,
178 ResourceProvider* resource_provider) {
[email protected]ed511b8d2013-03-25 03:29:29179 // WillDraw/DidDraw must be matched.
[email protected]ffbb2212013-06-02 23:47:59180 DCHECK_NE(DRAW_MODE_NONE, draw_mode);
181 DCHECK_EQ(DRAW_MODE_NONE, current_draw_mode_);
182 current_draw_mode_ = draw_mode;
183 return true;
[email protected]94f206c12012-08-25 00:09:14184}
185
[email protected]7aba6662013-03-12 10:17:34186void LayerImpl::DidDraw(ResourceProvider* resource_provider) {
[email protected]ffbb2212013-06-02 23:47:59187 DCHECK_NE(DRAW_MODE_NONE, current_draw_mode_);
188 current_draw_mode_ = DRAW_MODE_NONE;
[email protected]94f206c12012-08-25 00:09:14189}
190
reveman5be07ac82017-04-14 01:06:05191bool LayerImpl::ShowDebugBorders(DebugBorderType type) const {
192 return layer_tree_impl()->debug_state().show_debug_borders.test(type);
[email protected]3dce37232012-11-15 01:47:44193}
194
[email protected]7aba6662013-03-12 10:17:34195void LayerImpl::GetDebugBorderProperties(SkColor* color, float* width) const {
chrishtrac41ff92017-03-17 05:07:30196 float device_scale_factor =
197 layer_tree_impl() ? layer_tree_impl()->device_scale_factor() : 1;
198
[email protected]7aba6662013-03-12 10:17:34199 if (draws_content_) {
200 *color = DebugColors::ContentLayerBorderColor();
chrishtrac41ff92017-03-17 05:07:30201 *width = DebugColors::ContentLayerBorderWidth(device_scale_factor);
[email protected]7aba6662013-03-12 10:17:34202 return;
203 }
204
205 if (masks_to_bounds_) {
206 *color = DebugColors::MaskingLayerBorderColor();
chrishtrac41ff92017-03-17 05:07:30207 *width = DebugColors::MaskingLayerBorderWidth(device_scale_factor);
[email protected]7aba6662013-03-12 10:17:34208 return;
209 }
210
211 *color = DebugColors::ContainerLayerBorderColor();
chrishtrac41ff92017-03-17 05:07:30212 *width = DebugColors::ContainerLayerBorderWidth(device_scale_factor);
[email protected]7aba6662013-03-12 10:17:34213}
214
215void LayerImpl::AppendDebugBorderQuad(
[email protected]c6707fd2014-06-23 05:50:36216 RenderPass* render_pass,
Dana Jansensc46d3742015-06-18 01:33:14217 const gfx::Size& bounds,
[email protected]7aba6662013-03-12 10:17:34218 const SharedQuadState* shared_quad_state,
219 AppendQuadsData* append_quads_data) const {
[email protected]7aba6662013-03-12 10:17:34220 SkColor color;
221 float width;
222 GetDebugBorderProperties(&color, &width);
Dana Jansensc46d3742015-06-18 01:33:14223 AppendDebugBorderQuad(render_pass, bounds, shared_quad_state,
224 append_quads_data, color, width);
[email protected]bec084292013-05-21 21:31:44225}
226
[email protected]c6707fd2014-06-23 05:50:36227void LayerImpl::AppendDebugBorderQuad(RenderPass* render_pass,
Dana Jansensc46d3742015-06-18 01:33:14228 const gfx::Size& bounds,
[email protected]bec084292013-05-21 21:31:44229 const SharedQuadState* shared_quad_state,
230 AppendQuadsData* append_quads_data,
231 SkColor color,
232 float width) const {
reveman5be07ac82017-04-14 01:06:05233 if (!ShowDebugBorders(DebugBorderType::LAYER))
[email protected]bec084292013-05-21 21:31:44234 return;
[email protected]7aba6662013-03-12 10:17:34235
Dana Jansensc46d3742015-06-18 01:33:14236 gfx::Rect quad_rect(bounds);
[email protected]9bf06c72014-03-07 18:16:24237 gfx::Rect visible_quad_rect(quad_rect);
[email protected]f7030c32014-07-03 18:54:34238 DebugBorderDrawQuad* debug_border_quad =
239 render_pass->CreateAndAppendDrawQuad<DebugBorderDrawQuad>();
[email protected]9bf06c72014-03-07 18:16:24240 debug_border_quad->SetNew(
241 shared_quad_state, quad_rect, visible_quad_rect, color, width);
danakj069ac122015-02-12 00:59:22242 if (contents_opaque()) {
243 // When opaque, draw a second inner border that is thicker than the outer
244 // border, but more transparent.
245 static const float kFillOpacity = 0.3f;
246 SkColor fill_color = SkColorSetA(
247 color, static_cast<uint8_t>(SkColorGetA(color) * kFillOpacity));
248 float fill_width = width * 3;
249 gfx::Rect fill_rect = quad_rect;
250 fill_rect.Inset(fill_width / 2.f, fill_width / 2.f);
enneb79d5f142015-04-23 19:59:55251 if (fill_rect.IsEmpty())
252 return;
danakj069ac122015-02-12 00:59:22253 gfx::Rect visible_fill_rect =
254 gfx::IntersectRects(visible_quad_rect, fill_rect);
255 DebugBorderDrawQuad* fill_quad =
256 render_pass->CreateAndAppendDrawQuad<DebugBorderDrawQuad>();
257 fill_quad->SetNew(shared_quad_state, fill_rect, visible_fill_rect,
258 fill_color, fill_width);
259 }
[email protected]7aba6662013-03-12 10:17:34260}
261
jbaumanbbd425e2015-05-19 00:33:35262void LayerImpl::GetContentsResourceId(ResourceId* resource_id,
ennef6f3fbba42014-10-16 18:16:49263 gfx::Size* resource_size) const {
[email protected]7aba6662013-03-12 10:17:34264 NOTREACHED();
ennef6f3fbba42014-10-16 18:16:49265 *resource_id = 0;
[email protected]7aba6662013-03-12 10:17:34266}
267
[email protected]3244c9132014-01-23 10:39:12268gfx::Vector2dF LayerImpl::ScrollBy(const gfx::Vector2dF& scroll) {
wkorman5a126a52017-01-06 18:41:13269 ScrollTree& scroll_tree = GetScrollTree();
sunxd2668bea62016-03-17 00:49:47270 ScrollNode* scroll_node = scroll_tree.Node(scroll_tree_index());
271 return scroll_tree.ScrollBy(scroll_node, scroll, layer_tree_impl());
[email protected]7aba6662013-03-12 10:17:34272}
273
[email protected]adeda572014-01-31 00:49:47274void LayerImpl::SetScrollClipLayer(int scroll_clip_layer_id) {
aeliasa57c40d122015-10-08 00:20:09275 if (scroll_clip_layer_id_ == scroll_clip_layer_id)
276 return;
277
vollickcb3f6b12016-03-01 23:44:10278 layer_tree_impl()->UnregisterScrollLayer(this);
aeliasa57c40d122015-10-08 00:20:09279 scroll_clip_layer_id_ = scroll_clip_layer_id;
vollickcb3f6b12016-03-01 23:44:10280 layer_tree_impl()->RegisterScrollLayer(this);
aeliasa57c40d122015-10-08 00:20:09281}
282
283LayerImpl* LayerImpl::scroll_clip_layer() const {
vollickcb3f6b12016-03-01 23:44:10284 return layer_tree_impl()->LayerById(scroll_clip_layer_id_);
aeliasa57c40d122015-10-08 00:20:09285}
286
287bool LayerImpl::scrollable() const {
288 return scroll_clip_layer_id_ != Layer::INVALID_ID;
[email protected]adeda572014-01-31 00:49:47289}
290
sunxd2668bea62016-03-17 00:49:47291void LayerImpl::set_user_scrollable_horizontal(bool scrollable) {
292 user_scrollable_horizontal_ = scrollable;
293}
294
295void LayerImpl::set_user_scrollable_vertical(bool scrollable) {
296 user_scrollable_vertical_ = scrollable;
297}
298
timav3ca696932014-10-15 02:19:04299bool LayerImpl::user_scrollable(ScrollbarOrientation orientation) const {
300 return (orientation == HORIZONTAL) ? user_scrollable_horizontal_
301 : user_scrollable_vertical_;
302}
303
danakj60bc3bc2016-04-09 00:24:48304std::unique_ptr<LayerImpl> LayerImpl::CreateLayerImpl(
305 LayerTreeImpl* tree_impl) {
sunxdc36713a2016-03-03 22:31:10306 return LayerImpl::Create(tree_impl, layer_id_);
[email protected]94f206c12012-08-25 00:09:14307}
308
jaydasika2a1718b2016-10-26 22:58:02309bool LayerImpl::IsSnapped() {
310 return scrollable();
311}
312
[email protected]7aba6662013-03-12 10:17:34313void LayerImpl::PushPropertiesTo(LayerImpl* layer) {
vmpstre2672aa52016-06-20 21:05:06314 DCHECK(layer->IsActive());
315
pdrfaf2ee222017-04-19 03:11:04316 // The ElementId should be set first because other setters depend on it such
317 // as LayerImpl::SetScrollClipLayer.
318 layer->SetElementId(element_id_);
319
vmpstre2672aa52016-06-20 21:05:06320 layer->offset_to_transform_parent_ = offset_to_transform_parent_;
321 layer->main_thread_scrolling_reasons_ = main_thread_scrolling_reasons_;
322 layer->user_scrollable_horizontal_ = user_scrollable_horizontal_;
323 layer->user_scrollable_vertical_ = user_scrollable_vertical_;
324 layer->should_flatten_transform_from_property_tree_ =
325 should_flatten_transform_from_property_tree_;
326 layer->masks_to_bounds_ = masks_to_bounds_;
327 layer->contents_opaque_ = contents_opaque_;
sadrul32d10972016-07-30 05:26:21328 layer->may_contain_video_ = may_contain_video_;
vmpstre2672aa52016-06-20 21:05:06329 layer->use_parent_backface_visibility_ = use_parent_backface_visibility_;
330 layer->use_local_transform_for_backface_visibility_ =
331 use_local_transform_for_backface_visibility_;
332 layer->should_check_backface_visibility_ = should_check_backface_visibility_;
333 layer->draws_content_ = draws_content_;
334 layer->non_fast_scrollable_region_ = non_fast_scrollable_region_;
335 layer->touch_event_handler_region_ = touch_event_handler_region_;
336 layer->background_color_ = background_color_;
337 layer->safe_opaque_background_color_ = safe_opaque_background_color_;
vmpstre2672aa52016-06-20 21:05:06338 layer->position_ = position_;
vmpstre2672aa52016-06-20 21:05:06339 layer->transform_tree_index_ = transform_tree_index_;
340 layer->effect_tree_index_ = effect_tree_index_;
341 layer->clip_tree_index_ = clip_tree_index_;
342 layer->scroll_tree_index_ = scroll_tree_index_;
vmpstre2672aa52016-06-20 21:05:06343 layer->has_will_change_transform_hint_ = has_will_change_transform_hint_;
bokan169f5ad2016-10-30 16:32:48344 layer->scrollbars_hidden_ = scrollbars_hidden_;
skobes56451775d2017-03-28 18:46:38345 layer->needs_show_scrollbars_ = needs_show_scrollbars_;
vmpstre2672aa52016-06-20 21:05:06346
347 if (layer_property_changed_) {
348 layer->layer_tree_impl()->set_needs_update_draw_properties();
349 layer->layer_property_changed_ = true;
350 }
351
vmpstre2672aa52016-06-20 21:05:06352 layer->SetBounds(bounds_);
aeliasa57c40d122015-10-08 00:20:09353 layer->SetScrollClipLayer(scroll_clip_layer_id_);
vollick933f496e2015-12-08 04:22:05354 layer->SetMutableProperties(mutable_properties_);
ennee95b1542015-04-20 20:35:50355
[email protected]7aba6662013-03-12 10:17:34356 // If the main thread commits multiple times before the impl thread actually
357 // draws, then damage tracking will become incorrect if we simply clobber the
[email protected]ed511b8d2013-03-25 03:29:29358 // update_rect here. The LayerImpl's update_rect needs to accumulate (i.e.
[email protected]7aba6662013-03-12 10:17:34359 // union) any update changes that have occurred on the main thread.
360 update_rect_.Union(layer->update_rect());
[email protected]ad0250b2014-01-18 03:24:34361 layer->SetUpdateRect(update_rect_);
[email protected]7aba6662013-03-12 10:17:34362
primianocb1afb32016-02-29 20:46:05363 if (owned_debug_info_)
364 layer->SetDebugInfo(std::move(owned_debug_info_));
[email protected]7aba6662013-03-12 10:17:34365
[email protected]7aba6662013-03-12 10:17:34366 // Reset any state that should be cleared for the next update.
skobes56451775d2017-03-28 18:46:38367 needs_show_scrollbars_ = false;
jaydasika03a99c42016-02-11 21:07:08368 layer_property_changed_ = false;
vmpstr6e8dd7c2016-06-21 00:59:58369 needs_push_properties_ = false;
danakj19f0c9e2014-10-11 03:24:42370 update_rect_ = gfx::Rect();
jaydasikabb0409e52016-03-08 04:05:19371 layer_tree_impl()->RemoveLayerShouldPushProperties(this);
[email protected]caa567d2012-12-20 07:56:16372}
373
sunxdf66237552016-01-06 21:36:37374bool LayerImpl::IsAffectedByPageScale() const {
wkorman5a126a52017-01-06 18:41:13375 TransformTree& transform_tree = GetTransformTree();
sunxdf66237552016-01-06 21:36:37376 return transform_tree.Node(transform_tree_index())
trchendba8b1502016-07-08 09:47:01377 ->in_subtree_of_page_scale_layer;
sunxdf66237552016-01-06 21:36:37378}
379
jaydasikafc66cfb2016-06-10 04:34:22380std::unique_ptr<base::DictionaryValue> LayerImpl::LayerTreeAsJson() {
dcheng6223240a2016-05-31 19:48:01381 std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue);
r.kasibhatlafd17d0e2015-05-17 11:12:07382 result->SetInteger("LayerId", id());
[email protected]7aba6662013-03-12 10:17:34383 result->SetString("LayerType", LayerTypeAsString());
384
vabrbce355c2017-03-23 18:52:43385 auto list = base::MakeUnique<base::ListValue>();
bokancccfde72014-10-08 15:15:22386 list->AppendInteger(bounds().width());
387 list->AppendInteger(bounds().height());
vabrbce355c2017-03-23 18:52:43388 result->Set("Bounds", std::move(list));
[email protected]7aba6662013-03-12 10:17:34389
vabrbce355c2017-03-23 18:52:43390 list = base::MakeUnique<base::ListValue>();
[email protected]7aba6662013-03-12 10:17:34391 list->AppendDouble(position_.x());
392 list->AppendDouble(position_.y());
vabrbce355c2017-03-23 18:52:43393 result->Set("Position", std::move(list));
[email protected]7aba6662013-03-12 10:17:34394
jaydasika10d43fc2016-08-18 04:06:04395 const gfx::Transform& gfx_transform = test_properties()->transform;
[email protected]7aba6662013-03-12 10:17:34396 double transform[16];
397 gfx_transform.matrix().asColMajord(transform);
vabrbce355c2017-03-23 18:52:43398 list = base::MakeUnique<base::ListValue>();
[email protected]7aba6662013-03-12 10:17:34399 for (int i = 0; i < 16; ++i)
400 list->AppendDouble(transform[i]);
vabrbce355c2017-03-23 18:52:43401 result->Set("Transform", std::move(list));
[email protected]7aba6662013-03-12 10:17:34402
403 result->SetBoolean("DrawsContent", draws_content_);
[email protected]a9d4d4f2014-06-19 06:49:28404 result->SetBoolean("Is3dSorted", Is3dSorted());
jaydasikaab317e02016-06-01 00:53:18405 result->SetDouble("OPACITY", Opacity());
[email protected]46c76952013-07-10 00:21:45406 result->SetBoolean("ContentsOpaque", contents_opaque_);
[email protected]7aba6662013-03-12 10:17:34407
[email protected]adeda572014-01-31 00:49:47408 if (scrollable())
409 result->SetBoolean("Scrollable", true);
[email protected]d993e032013-06-07 00:16:16410
[email protected]9d161d22013-10-29 20:54:10411 if (!touch_event_handler_region_.IsEmpty()) {
danakj60bc3bc2016-04-09 00:24:48412 std::unique_ptr<base::Value> region = touch_event_handler_region_.AsValue();
vabrbce355c2017-03-23 18:52:43413 result->Set("TouchRegion", std::move(region));
[email protected]9d161d22013-10-29 20:54:10414 }
415
vabrbce355c2017-03-23 18:52:43416 list = base::MakeUnique<base::ListValue>();
jaydasikafc66cfb2016-06-10 04:34:22417 for (size_t i = 0; i < test_properties()->children.size(); ++i)
418 list->Append(test_properties()->children[i]->LayerTreeAsJson());
vabrbce355c2017-03-23 18:52:43419 result->Set("Children", std::move(list));
[email protected]7aba6662013-03-12 10:17:34420
421 return result;
[email protected]b9dcf43a2013-01-09 00:15:29422}
423
jaydasikaadfec8e2016-02-17 02:46:11424bool LayerImpl::LayerPropertyChanged() const {
wkormanf09921d2017-01-07 01:01:20425 if (layer_property_changed_ || GetPropertyTrees()->full_tree_damaged)
jaydasikaadfec8e2016-02-17 02:46:11426 return true;
jaydasikadba9f752016-07-26 20:35:34427 if (transform_tree_index() == TransformTree::kInvalidNodeId)
jaydasika16515f52016-03-01 00:28:35428 return false;
429 TransformNode* transform_node =
wkorman5a126a52017-01-06 18:41:13430 GetTransformTree().Node(transform_tree_index());
trchendba8b1502016-07-08 09:47:01431 if (transform_node && transform_node->transform_changed)
jaydasika16515f52016-03-01 00:28:35432 return true;
jaydasikadba9f752016-07-26 20:35:34433 if (effect_tree_index() == EffectTree::kInvalidNodeId)
jaydasika16515f52016-03-01 00:28:35434 return false;
wkorman5a126a52017-01-06 18:41:13435 EffectNode* effect_node = GetEffectTree().Node(effect_tree_index());
trchendba8b1502016-07-08 09:47:01436 if (effect_node && effect_node->effect_changed)
jaydasikaadfec8e2016-02-17 02:46:11437 return true;
438 return false;
439}
440
[email protected]7aba6662013-03-12 10:17:34441void LayerImpl::NoteLayerPropertyChanged() {
442 layer_property_changed_ = true;
443 layer_tree_impl()->set_needs_update_draw_properties();
[email protected]ad0250b2014-01-18 03:24:34444 SetNeedsPushProperties();
[email protected]48871fc2013-01-23 07:36:51445}
446
danakjf9427572015-04-24 22:19:02447void LayerImpl::ValidateQuadResourcesInternal(DrawQuad* quad) const {
448#if DCHECK_IS_ON()
vmpstr0eca2e82015-06-02 22:14:46449 const ResourceProvider* resource_provider =
450 layer_tree_impl_->resource_provider();
451 for (ResourceId resource_id : quad->resources)
452 resource_provider->ValidateResource(resource_id);
danakjf9427572015-04-24 22:19:02453#endif
454}
455
[email protected]7aba6662013-03-12 10:17:34456const char* LayerImpl::LayerTypeAsString() const {
[email protected]f256b7fd2013-05-15 01:49:30457 return "cc::LayerImpl";
[email protected]7aba6662013-03-12 10:17:34458}
[email protected]94f206c12012-08-25 00:09:14459
jaydasikaef64f9e42016-03-12 01:08:18460void LayerImpl::ResetChangeTracking() {
[email protected]7aba6662013-03-12 10:17:34461 layer_property_changed_ = false;
vmpstr6e8dd7c2016-06-21 00:59:58462 needs_push_properties_ = false;
[email protected]7aba6662013-03-12 10:17:34463
danakjd344ab92015-08-28 19:25:51464 update_rect_.SetRect(0, 0, 0, 0);
465 damage_rect_.SetRect(0, 0, 0, 0);
[email protected]7aba6662013-03-12 10:17:34466}
467
jaydasikaebc94282017-04-24 20:34:01468bool LayerImpl::has_copy_requests_in_target_subtree() {
469 return GetEffectTree().Node(effect_tree_index())->subtree_has_copy_request;
sunxded58688e2016-01-11 21:01:02470}
471
ajuma9db24fb2015-06-29 20:15:07472void LayerImpl::UpdatePropertyTreeForScrollingAndAnimationIfNeeded() {
473 if (scrollable())
474 UpdatePropertyTreeScrollOffset();
475
loyso0c8e4402016-02-25 04:12:30476 if (HasAnyAnimationTargetingProperty(TargetProperty::TRANSFORM)) {
weiliangc1f4b78a2017-03-24 20:16:42477 if (TransformNode* node =
478 GetTransformTree().FindNodeFromElementId(element_id())) {
479 bool has_potential_animation = HasPotentiallyRunningTransformAnimation();
480 if (node->has_potential_animation != has_potential_animation) {
481 node->has_potential_animation = has_potential_animation;
482 node->has_only_translation_animations = HasOnlyTranslationTransforms();
483 GetTransformTree().set_needs_update(true);
484 layer_tree_impl()->set_needs_update_draw_properties();
485 }
486 }
ajumacaaa9b32015-08-04 15:55:29487 }
ajuma9db24fb2015-06-29 20:15:07488}
489
miletusf57925d2014-10-01 19:38:13490gfx::ScrollOffset LayerImpl::ScrollOffsetForAnimation() const {
aeliasd0070ba2015-01-31 13:44:49491 return CurrentScrollOffset();
[email protected]b8384e22013-12-03 02:20:48492}
493
[email protected]7aba6662013-03-12 10:17:34494bool LayerImpl::IsActive() const {
495 return layer_tree_impl_->IsActiveTree();
496}
497
bokancccfde72014-10-08 15:15:22498gfx::Size LayerImpl::bounds() const {
pdr23d381fd2017-04-25 21:06:31499 auto viewport_bounds_delta = gfx::ToCeiledVector2d(ViewportBoundsDelta());
500 return gfx::Size(bounds_.width() + viewport_bounds_delta.x(),
501 bounds_.height() + viewport_bounds_delta.y());
bokanef971462014-10-13 22:58:32502}
503
504gfx::SizeF LayerImpl::BoundsForScrolling() const {
pdr23d381fd2017-04-25 21:06:31505 auto viewport_bounds_delta = ViewportBoundsDelta();
506 return gfx::SizeF(bounds_.width() + viewport_bounds_delta.x(),
507 bounds_.height() + viewport_bounds_delta.y());
[email protected]fef74fd2014-02-27 06:28:17508}
509
[email protected]64348ea2014-01-29 22:58:26510void LayerImpl::SetBounds(const gfx::Size& bounds) {
[email protected]7aba6662013-03-12 10:17:34511 if (bounds_ == bounds)
512 return;
513
514 bounds_ = bounds;
[email protected]fef74fd2014-02-27 06:28:17515
aeliasa57c40d122015-10-08 00:20:09516 layer_tree_impl()->DidUpdateScrollState(id());
sunxdcfccd1b32016-02-11 00:54:20517
jaydasikab311c9a2016-03-02 20:49:09518 NoteLayerPropertyChanged();
[email protected]fef74fd2014-02-27 06:28:17519}
520
pdr23d381fd2017-04-25 21:06:31521void LayerImpl::SetViewportBoundsDelta(const gfx::Vector2dF& bounds_delta) {
ajuma6b46da22015-06-25 21:53:02522 DCHECK(IsActive());
[email protected]fef74fd2014-02-27 06:28:17523
pdr23d381fd2017-04-25 21:06:31524 if (bounds_delta == ViewportBoundsDelta())
525 return;
[email protected]7aba6662013-03-12 10:17:34526
wkorman5a126a52017-01-06 18:41:13527 PropertyTrees* property_trees = GetPropertyTrees();
ajumadd2802e72015-06-30 20:28:29528 if (this == layer_tree_impl()->InnerViewportContainerLayer())
sunxdcfccd1b32016-02-11 00:54:20529 property_trees->SetInnerViewportContainerBoundsDelta(bounds_delta);
ajumadd2802e72015-06-30 20:28:29530 else if (this == layer_tree_impl()->OuterViewportContainerLayer())
sunxdcfccd1b32016-02-11 00:54:20531 property_trees->SetOuterViewportContainerBoundsDelta(bounds_delta);
532 else if (this == layer_tree_impl()->InnerViewportScrollLayer())
533 property_trees->SetInnerViewportScrollBoundsDelta(bounds_delta);
pdr23d381fd2017-04-25 21:06:31534 else
535 NOTREACHED();
ajuma6b46da22015-06-25 21:53:02536
aeliasa57c40d122015-10-08 00:20:09537 layer_tree_impl()->DidUpdateScrollState(id());
miletus8bd08a622015-06-16 18:44:52538
539 if (masks_to_bounds()) {
540 // If layer is clipping, then update the clip node using the new bounds.
weiliangc1c0802c32017-03-21 19:53:17541 if (ClipNode* clip_node =
542 property_trees->clip_tree.UpdateNodeFromOwningLayerId(id())) {
543 DCHECK_EQ(clip_node->id, clip_tree_index());
trchendba8b1502016-07-08 09:47:01544 clip_node->clip = gfx::RectF(gfx::PointF() + offset_to_transform_parent(),
545 gfx::SizeF(bounds()));
sunxdcfccd1b32016-02-11 00:54:20546 property_trees->clip_tree.set_needs_update(true);
miletus8bd08a622015-06-16 18:44:52547 }
jaydasikab311c9a2016-03-02 20:49:09548 property_trees->full_tree_damaged = true;
549 layer_tree_impl()->set_needs_update_draw_properties();
miletus8bd08a622015-06-16 18:44:52550 } else {
[email protected]7aba6662013-03-12 10:17:34551 NoteLayerPropertyChanged();
miletus8bd08a622015-06-16 18:44:52552 }
[email protected]7aba6662013-03-12 10:17:34553}
554
pdr23d381fd2017-04-25 21:06:31555gfx::Vector2dF LayerImpl::ViewportBoundsDelta() const {
556 if (this == layer_tree_impl()->InnerViewportContainerLayer())
557 return GetPropertyTrees()->inner_viewport_container_bounds_delta();
558 else if (this == layer_tree_impl()->OuterViewportContainerLayer())
559 return GetPropertyTrees()->outer_viewport_container_bounds_delta();
560 else if (this == layer_tree_impl()->InnerViewportScrollLayer())
561 return GetPropertyTrees()->inner_viewport_scroll_bounds_delta();
562 return gfx::Vector2dF();
563}
564
[email protected]80413d72013-08-30 20:25:33565ScrollbarLayerImplBase* LayerImpl::ToScrollbarLayer() {
kulkarni.a4015690f12014-10-10 13:50:06566 return nullptr;
[email protected]7aba6662013-03-12 10:17:34567}
568
569void LayerImpl::SetDrawsContent(bool draws_content) {
570 if (draws_content_ == draws_content)
571 return;
572
573 draws_content_ = draws_content;
574 NoteLayerPropertyChanged();
575}
576
[email protected]7aba6662013-03-12 10:17:34577void LayerImpl::SetBackgroundColor(SkColor background_color) {
578 if (background_color_ == background_color)
579 return;
580
581 background_color_ = background_color;
582 NoteLayerPropertyChanged();
583}
584
jaydasikac6326bb2016-03-03 03:46:14585void LayerImpl::SetSafeOpaqueBackgroundColor(SkColor background_color) {
jaydasikac6326bb2016-03-03 03:46:14586 safe_opaque_background_color_ = background_color;
jaydasikac6326bb2016-03-03 03:46:14587}
588
[email protected]2c4cbec2013-06-04 21:14:50589SkColor LayerImpl::SafeOpaqueBackgroundColor() const {
jaydasikac6326bb2016-03-03 03:46:14590 if (contents_opaque())
591 return safe_opaque_background_color_;
[email protected]2c4cbec2013-06-04 21:14:50592 SkColor color = background_color();
jaydasikac6326bb2016-03-03 03:46:14593 if (SkColorGetA(color) == 255)
[email protected]2c4cbec2013-06-04 21:14:50594 color = SK_ColorTRANSPARENT;
[email protected]2c4cbec2013-06-04 21:14:50595 return color;
596}
597
[email protected]b4c6d812013-10-03 15:48:56598bool LayerImpl::FilterIsAnimating() const {
loyso6d6356e2016-11-02 23:41:08599 return GetMutatorHost()->IsAnimatingFilterProperty(
khushalsagaraf222d92016-07-08 21:19:32600 element_id(), GetElementTypeForAnimation());
[email protected]b4c6d812013-10-03 15:48:56601}
602
ajuma315a4782015-07-24 21:16:34603bool LayerImpl::HasPotentiallyRunningFilterAnimation() const {
loyso6d6356e2016-11-02 23:41:08604 return GetMutatorHost()->HasPotentiallyRunningFilterAnimation(
khushalsagaraf222d92016-07-08 21:19:32605 element_id(), GetElementTypeForAnimation());
ajuma315a4782015-07-24 21:16:34606}
607
[email protected]7aba6662013-03-12 10:17:34608void LayerImpl::SetMasksToBounds(bool masks_to_bounds) {
[email protected]7aba6662013-03-12 10:17:34609 masks_to_bounds_ = masks_to_bounds;
[email protected]7aba6662013-03-12 10:17:34610}
611
612void LayerImpl::SetContentsOpaque(bool opaque) {
[email protected]7aba6662013-03-12 10:17:34613 contents_opaque_ = opaque;
[email protected]7aba6662013-03-12 10:17:34614}
615
jaydasikaab317e02016-06-01 00:53:18616float LayerImpl::Opacity() const {
weiliangc1c0802c32017-03-21 19:53:17617 if (const EffectNode* node = GetEffectTree().FindNodeFromOwningLayerId(id()))
weiliangc42c074f2017-03-17 19:28:30618 return node->opacity;
619 else
jaydasikaab317e02016-06-01 00:53:18620 return 1.f;
[email protected]7aba6662013-03-12 10:17:34621}
622
jaydasika10d43fc2016-08-18 04:06:04623const gfx::Transform& LayerImpl::Transform() const {
weiliangc42c074f2017-03-17 19:28:30624 DCHECK_NE(GetTransformTree().FindNodeFromOwningLayerId(id()), nullptr);
625 return GetTransformTree().FindNodeFromOwningLayerId(id())->local;
jaydasika10d43fc2016-08-18 04:06:04626}
627
vollickef2ae922016-06-29 17:54:27628void LayerImpl::SetElementId(ElementId element_id) {
vollick933f496e2015-12-08 04:22:05629 if (element_id == element_id_)
630 return;
631
632 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("compositor-worker"),
vollickef2ae922016-06-29 17:54:27633 "LayerImpl::SetElementId", "element",
634 element_id.AsValue().release());
vollick933f496e2015-12-08 04:22:05635
vollickcb3f6b12016-03-01 23:44:10636 layer_tree_impl_->RemoveFromElementMap(this);
vollick933f496e2015-12-08 04:22:05637 element_id_ = element_id;
vollickcb3f6b12016-03-01 23:44:10638 layer_tree_impl_->AddToElementMap(this);
vollickef2ae922016-06-29 17:54:27639
640 SetNeedsPushProperties();
vollick933f496e2015-12-08 04:22:05641}
642
643void LayerImpl::SetMutableProperties(uint32_t properties) {
644 if (mutable_properties_ == properties)
645 return;
646
647 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("compositor-worker"),
648 "LayerImpl::SetMutableProperties", "properties", properties);
649
650 mutable_properties_ = properties;
vollick9c7f6d02016-01-08 04:36:38651 // If this layer is already in the element map, update its properties.
vollickcb3f6b12016-03-01 23:44:10652 layer_tree_impl_->AddToElementMap(this);
vollick933f496e2015-12-08 04:22:05653}
654
[email protected]14bc5d682014-01-17 07:26:47655void LayerImpl::SetPosition(const gfx::PointF& position) {
[email protected]7aba6662013-03-12 10:17:34656 position_ = position;
[email protected]7aba6662013-03-12 10:17:34657}
658
[email protected]7aba6662013-03-12 10:17:34659bool LayerImpl::TransformIsAnimating() const {
loyso6d6356e2016-11-02 23:41:08660 return GetMutatorHost()->IsAnimatingTransformProperty(
khushalsagaraf222d92016-07-08 21:19:32661 element_id(), GetElementTypeForAnimation());
loysod71ece82015-07-03 13:48:50662}
663
664bool LayerImpl::HasPotentiallyRunningTransformAnimation() const {
loyso6d6356e2016-11-02 23:41:08665 return GetMutatorHost()->HasPotentiallyRunningTransformAnimation(
khushalsagaraf222d92016-07-08 21:19:32666 element_id(), GetElementTypeForAnimation());
[email protected]7aba6662013-03-12 10:17:34667}
668
loysod71ece82015-07-03 13:48:50669bool LayerImpl::HasOnlyTranslationTransforms() const {
loyso6d6356e2016-11-02 23:41:08670 return GetMutatorHost()->HasOnlyTranslationTransforms(
khushalsagaraf222d92016-07-08 21:19:32671 element_id(), GetElementTypeForAnimation());
loysod71ece82015-07-03 13:48:50672}
673
ajumae7425272015-07-13 18:37:34674bool LayerImpl::HasAnyAnimationTargetingProperty(
loyso0c8e4402016-02-25 04:12:30675 TargetProperty::Type property) const {
loyso6d6356e2016-11-02 23:41:08676 return GetMutatorHost()->HasAnyAnimationTargetingProperty(element_id(),
677 property);
ajumae7425272015-07-13 18:37:34678}
679
loysod71ece82015-07-03 13:48:50680bool LayerImpl::HasFilterAnimationThatInflatesBounds() const {
loyso6d6356e2016-11-02 23:41:08681 return GetMutatorHost()->HasFilterAnimationThatInflatesBounds(element_id());
loysod71ece82015-07-03 13:48:50682}
683
684bool LayerImpl::HasTransformAnimationThatInflatesBounds() const {
loyso6d6356e2016-11-02 23:41:08685 return GetMutatorHost()->HasTransformAnimationThatInflatesBounds(
khushalsagaraf222d92016-07-08 21:19:32686 element_id());
loysod71ece82015-07-03 13:48:50687}
688
689bool LayerImpl::HasAnimationThatInflatesBounds() const {
loyso6d6356e2016-11-02 23:41:08690 return GetMutatorHost()->HasAnimationThatInflatesBounds(element_id());
loysod71ece82015-07-03 13:48:50691}
692
693bool LayerImpl::FilterAnimationBoundsForBox(const gfx::BoxF& box,
694 gfx::BoxF* bounds) const {
loyso6d6356e2016-11-02 23:41:08695 return GetMutatorHost()->FilterAnimationBoundsForBox(element_id(), box,
696 bounds);
loysod71ece82015-07-03 13:48:50697}
698
699bool LayerImpl::TransformAnimationBoundsForBox(const gfx::BoxF& box,
700 gfx::BoxF* bounds) const {
loyso6d6356e2016-11-02 23:41:08701 return GetMutatorHost()->TransformAnimationBoundsForBox(element_id(), box,
702 bounds);
loysod71ece82015-07-03 13:48:50703}
704
danakj19f0c9e2014-10-11 03:24:42705void LayerImpl::SetUpdateRect(const gfx::Rect& update_rect) {
[email protected]ad0250b2014-01-18 03:24:34706 update_rect_ = update_rect;
707 SetNeedsPushProperties();
708}
709
danakjd344ab92015-08-28 19:25:51710void LayerImpl::AddDamageRect(const gfx::Rect& damage_rect) {
711 damage_rect_.Union(damage_rect);
[email protected]cfa7fd922014-04-29 11:50:03712}
713
aeliasd0070ba2015-01-31 13:44:49714void LayerImpl::SetCurrentScrollOffset(const gfx::ScrollOffset& scroll_offset) {
715 DCHECK(IsActive());
wkorman5a126a52017-01-06 18:41:13716 if (GetScrollTree().SetScrollOffset(id(), scroll_offset))
vollickc9696912016-09-16 16:02:47717 layer_tree_impl()->DidUpdateScrollOffset(id());
boliu7d5dbab2014-10-10 20:05:47718}
719
aeliasd0070ba2015-01-31 13:44:49720gfx::ScrollOffset LayerImpl::CurrentScrollOffset() const {
wkorman5a126a52017-01-06 18:41:13721 return GetScrollTree().current_scroll_offset(id());
[email protected]7aba6662013-03-12 10:17:34722}
723
ajuma9db24fb2015-06-29 20:15:07724void LayerImpl::UpdatePropertyTreeScrollOffset() {
enne1eb3a922015-06-17 17:37:50725 // TODO(enne): in the future, scrolling should update the scroll tree
726 // directly instead of going through layers.
wkorman5a126a52017-01-06 18:41:13727 TransformTree& transform_tree = GetTransformTree();
jaydasika5d9c03a02016-05-26 19:21:05728 TransformNode* node = transform_tree.Node(transform_tree_index_);
729 gfx::ScrollOffset current_offset = CurrentScrollOffset();
trchendba8b1502016-07-08 09:47:01730 if (node->scroll_offset != current_offset) {
731 node->scroll_offset = current_offset;
732 node->needs_local_transform_update = true;
jaydasika5d9c03a02016-05-26 19:21:05733 transform_tree.set_needs_update(true);
enne1eb3a922015-06-17 17:37:50734 }
735}
736
danakj64767d902015-06-19 00:10:43737SimpleEnclosedRegion LayerImpl::VisibleOpaqueRegion() const {
[email protected]7aba6662013-03-12 10:17:34738 if (contents_opaque())
danakj64767d902015-06-19 00:10:43739 return SimpleEnclosedRegion(visible_layer_rect());
[email protected]d5467eb72014-08-22 01:16:43740 return SimpleEnclosedRegion();
[email protected]7aba6662013-03-12 10:17:34741}
742
[email protected]37349bc2013-06-04 01:31:52743void LayerImpl::DidBeginTracing() {}
744
[email protected]9db24462014-01-14 02:25:50745void LayerImpl::ReleaseResources() {}
[email protected]7aba6662013-03-12 10:17:34746
ericrk7cedb542016-11-02 19:03:44747void LayerImpl::ReleaseTileResources() {}
748
749void LayerImpl::RecreateTileResources() {}
vmpstr9ce5c662015-02-05 23:29:26750
miletusf57925d2014-10-01 19:38:13751gfx::ScrollOffset LayerImpl::MaxScrollOffset() const {
wkorman5a126a52017-01-06 18:41:13752 return GetScrollTree().MaxScrollOffset(scroll_tree_index());
[email protected]adeda572014-01-31 00:49:47753}
754
aeliasd0070ba2015-01-31 13:44:49755gfx::ScrollOffset LayerImpl::ClampScrollOffsetToLimits(
756 gfx::ScrollOffset offset) const {
757 offset.SetToMin(MaxScrollOffset());
758 offset.SetToMax(gfx::ScrollOffset());
759 return offset;
760}
[email protected]adeda572014-01-31 00:49:47761
aeliasd0070ba2015-01-31 13:44:49762gfx::Vector2dF LayerImpl::ClampScrollToMaxScrollOffset() {
763 gfx::ScrollOffset old_offset = CurrentScrollOffset();
764 gfx::ScrollOffset clamped_offset = ClampScrollOffsetToLimits(old_offset);
miletusf57925d2014-10-01 19:38:13765 gfx::Vector2dF delta = clamped_offset.DeltaFrom(old_offset);
[email protected]adeda572014-01-31 00:49:47766 if (!delta.IsZero())
767 ScrollBy(delta);
[email protected]adeda572014-01-31 00:49:47768 return delta;
769}
770
[email protected]ad0250b2014-01-18 03:24:34771void LayerImpl::SetNeedsPushProperties() {
vmpstr6e8dd7c2016-06-21 00:59:58772 if (layer_tree_impl_ && !needs_push_properties_) {
773 needs_push_properties_ = true;
jaydasikabb0409e52016-03-08 04:05:19774 layer_tree_impl()->AddLayerShouldPushProperties(this);
vmpstr6e8dd7c2016-06-21 00:59:58775 }
[email protected]ad0250b2014-01-18 03:24:34776}
777
hendrikwc5e915852015-05-13 01:29:03778void LayerImpl::GetAllPrioritizedTilesForTracing(
779 std::vector<PrioritizedTile>* prioritized_tiles) const {
vmpstrd7de03c2014-08-27 18:11:01780}
781
ssid911e40e2015-02-09 17:55:20782void LayerImpl::AsValueInto(base::trace_event::TracedValue* state) const {
[email protected]f5ad4282014-02-15 14:23:16783 TracedValue::MakeDictIntoImplicitSnapshotWithCategory(
vollickcb3f6b12016-03-01 23:44:10784 TRACE_DISABLED_BY_DEFAULT("cc.debug"),
785 state,
786 "cc::LayerImpl",
787 LayerTypeAsString(),
788 this);
[email protected]f6742f52013-05-08 23:52:22789 state->SetInteger("layer_id", id());
jungjik.lee50f9c8e2015-01-21 14:06:16790 MathUtil::AddToTracedValue("bounds", bounds_, state);
[email protected]d12aa932014-08-01 13:10:38791
jaydasikaab317e02016-06-01 00:53:18792 state->SetDouble("opacity", Opacity());
danakj38955562014-09-13 02:56:43793
jungjik.lee50f9c8e2015-01-21 14:06:16794 MathUtil::AddToTracedValue("position", position_, state);
[email protected]d12aa932014-08-01 13:10:38795
[email protected]f6742f52013-05-08 23:52:22796 state->SetInteger("draws_content", DrawsContent());
vmpstr91e23092015-06-08 22:24:16797 state->SetInteger("gpu_memory_usage",
798 base::saturated_cast<int>(GPUMemoryUsageInBytes()));
[email protected]d12aa932014-08-01 13:10:38799
vollickef2ae922016-06-29 17:54:27800 if (element_id_)
801 element_id_.AddToTracedValue(state);
802
803 if (mutable_properties_ != MutableProperty::kNone)
vollick933f496e2015-12-08 04:22:05804 state->SetInteger("mutable_properties", mutable_properties_);
vollick933f496e2015-12-08 04:22:05805
sunxdc044b11a2016-03-16 16:23:20806 MathUtil::AddToTracedValue("scroll_offset", CurrentScrollOffset(), state);
aeliasd0070ba2015-01-31 13:44:49807
jaydasika10d43fc2016-08-18 04:06:04808 if (!ScreenSpaceTransform().IsIdentity())
809 MathUtil::AddToTracedValue("screen_space_transform", ScreenSpaceTransform(),
810 state);
vollick96b33a52016-03-30 20:11:53811
[email protected]7aba6662013-03-12 10:17:34812 bool clipped;
danakj5e6ff6d2015-09-05 04:43:44813 gfx::QuadF layer_quad =
ajumab6aa1c62015-12-01 21:01:10814 MathUtil::MapQuad(ScreenSpaceTransform(),
danakj5e6ff6d2015-09-05 04:43:44815 gfx::QuadF(gfx::RectF(gfx::Rect(bounds()))), &clipped);
jungjik.lee50f9c8e2015-01-21 14:06:16816 MathUtil::AddToTracedValue("layer_quad", layer_quad, state);
[email protected]78d78612013-09-12 18:04:04817 if (!touch_event_handler_region_.IsEmpty()) {
[email protected]d12aa932014-08-01 13:10:38818 state->BeginArray("touch_event_handler_region");
819 touch_event_handler_region_.AsValueInto(state);
820 state->EndArray();
[email protected]78d78612013-09-12 18:04:04821 }
[email protected]78d78612013-09-12 18:04:04822 if (!non_fast_scrollable_region_.IsEmpty()) {
[email protected]d12aa932014-08-01 13:10:38823 state->BeginArray("non_fast_scrollable_region");
824 non_fast_scrollable_region_.AsValueInto(state);
825 state->EndArray();
[email protected]78d78612013-09-12 18:04:04826 }
[email protected]0e98cdd2013-08-23 00:44:30827
sunxd5a7a4032016-06-01 18:49:22828 state->SetBoolean("can_use_lcd_text", CanUseLCDText());
[email protected]c2a56ff2013-10-14 19:32:51829 state->SetBoolean("contents_opaque", contents_opaque());
[email protected]a1286742013-11-13 17:11:40830
khushalsagaraf222d92016-07-08 21:19:32831 state->SetBoolean("has_animation_bounds", HasAnimationThatInflatesBounds());
[email protected]3d86dd7a2014-01-24 01:33:11832
vmpstrd6dce2602016-05-18 20:19:04833 state->SetBoolean("has_will_change_transform_hint",
834 has_will_change_transform_hint());
835
[email protected]3d86dd7a2014-01-24 01:33:11836 gfx::BoxF box;
jungjik.lee50f9c8e2015-01-21 14:06:16837 if (LayerUtils::GetAnimationBounds(*this, &box))
838 MathUtil::AddToTracedValue("animation_bounds", box, state);
[email protected]9f3be432013-12-03 03:53:22839
primianocb1afb32016-02-29 20:46:05840 if (debug_info_) {
[email protected]9f3be432013-12-03 03:53:22841 std::string str;
842 debug_info_->AppendAsTraceFormat(&str);
843 base::JSONReader json_reader;
danakj60bc3bc2016-04-09 00:24:48844 std::unique_ptr<base::Value> debug_info_value(json_reader.ReadToValue(str));
[email protected]685de6b12014-01-09 12:25:05845
jdoerriedc72ee942016-12-07 15:43:28846 if (debug_info_value->IsType(base::Value::Type::DICTIONARY)) {
kulkarni.a4015690f12014-10-10 13:50:06847 base::DictionaryValue* dictionary_value = nullptr;
[email protected]685de6b12014-01-09 12:25:05848 bool converted_to_dictionary =
849 debug_info_value->GetAsDictionary(&dictionary_value);
850 DCHECK(converted_to_dictionary);
[email protected]d12aa932014-08-01 13:10:38851 for (base::DictionaryValue::Iterator it(*dictionary_value); !it.IsAtEnd();
852 it.Advance()) {
estade7bc801fb2015-05-07 01:53:08853 state->SetValue(it.key().data(), it.value().CreateDeepCopy());
[email protected]d12aa932014-08-01 13:10:38854 }
[email protected]685de6b12014-01-09 12:25:05855 } else {
856 NOTREACHED();
857 }
[email protected]9f3be432013-12-03 03:53:22858 }
[email protected]8c5690222013-02-15 17:36:43859}
860
[email protected]cdf5b952013-05-15 15:39:29861size_t LayerImpl::GPUMemoryUsageInBytes() const { return 0; }
862
[email protected]5e5648a2013-11-18 00:39:33863void LayerImpl::RunMicroBenchmark(MicroBenchmarkImpl* benchmark) {
864 benchmark->RunOnLayer(this);
865}
[email protected]749cbc62014-07-10 01:06:35866
ajumad9432e32015-11-30 19:43:44867gfx::Transform LayerImpl::DrawTransform() const {
weiliangc15346d2c2016-02-19 01:38:49868 // Only drawn layers have up-to-date draw properties.
ajuma0adb5902016-04-28 16:32:38869 if (!is_drawn_render_surface_layer_list_member()) {
wkorman5a126a52017-01-06 18:41:13870 if (GetPropertyTrees()->non_root_surfaces_enabled) {
871 return draw_property_utils::DrawTransform(this, GetTransformTree(),
872 GetEffectTree());
ajumad9432e32015-11-30 19:43:44873 } else {
wkorman5a126a52017-01-06 18:41:13874 return draw_property_utils::ScreenSpaceTransform(this,
875 GetTransformTree());
ajumad9432e32015-11-30 19:43:44876 }
877 }
878
879 return draw_properties().target_space_transform;
880}
881
ajumab6aa1c62015-12-01 21:01:10882gfx::Transform LayerImpl::ScreenSpaceTransform() const {
weiliangc15346d2c2016-02-19 01:38:49883 // Only drawn layers have up-to-date draw properties.
ajuma0adb5902016-04-28 16:32:38884 if (!is_drawn_render_surface_layer_list_member()) {
wkorman5a126a52017-01-06 18:41:13885 return draw_property_utils::ScreenSpaceTransform(this, GetTransformTree());
ajumab6aa1c62015-12-01 21:01:10886 }
887
888 return draw_properties().screen_space_transform;
889}
890
sunxd5a7a4032016-06-01 18:49:22891bool LayerImpl::CanUseLCDText() const {
892 if (layer_tree_impl()->settings().layers_always_allowed_lcd_text)
893 return true;
894 if (!layer_tree_impl()->settings().can_use_lcd_text)
895 return false;
896 if (!contents_opaque())
897 return false;
898
wkorman5a126a52017-01-06 18:41:13899 if (GetEffectTree().Node(effect_tree_index())->screen_space_opacity != 1.f)
sunxd5a7a4032016-06-01 18:49:22900 return false;
wkorman5a126a52017-01-06 18:41:13901 if (!GetTransformTree()
902 .Node(transform_tree_index())
trchendba8b1502016-07-08 09:47:01903 ->node_and_ancestors_have_only_integer_translation)
sunxd5a7a4032016-06-01 18:49:22904 return false;
905 if (static_cast<int>(offset_to_transform_parent().x()) !=
906 offset_to_transform_parent().x())
907 return false;
908 if (static_cast<int>(offset_to_transform_parent().y()) !=
909 offset_to_transform_parent().y())
910 return false;
911 return true;
912}
913
wkormanf09921d2017-01-07 01:01:20914int LayerImpl::GetSortingContextId() const {
wkorman52602dd2017-01-10 03:14:47915 return GetTransformTree().Node(transform_tree_index())->sorting_context_id;
wkormanf09921d2017-01-07 01:01:20916}
917
chrishtrc41aca7b2016-03-18 15:44:29918Region LayerImpl::GetInvalidationRegionForDebugging() {
daplatz350219e2015-03-04 19:04:41919 return Region(update_rect_);
920}
921
vmpstrd46a7ac2015-03-18 01:11:12922gfx::Rect LayerImpl::GetEnclosingRectInTargetSpace() const {
ajumad9432e32015-11-30 19:43:44923 return MathUtil::MapEnclosingClippedRect(DrawTransform(),
924 gfx::Rect(bounds()));
vmpstrd46a7ac2015-03-18 01:11:12925}
926
927gfx::Rect LayerImpl::GetScaledEnclosingRectInTargetSpace(float scale) const {
ajumad9432e32015-11-30 19:43:44928 gfx::Transform scaled_draw_transform = DrawTransform();
vmpstrd46a7ac2015-03-18 01:11:12929 scaled_draw_transform.Scale(SK_MScalar1 / scale, SK_MScalar1 / scale);
danakjddaec912015-09-25 19:38:40930 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize(bounds(), scale);
vmpstrd46a7ac2015-03-18 01:11:12931 return MathUtil::MapEnclosingClippedRect(scaled_draw_transform,
Dana Jansensc46d3742015-06-18 01:33:14932 gfx::Rect(scaled_bounds));
vmpstrd46a7ac2015-03-18 01:11:12933}
934
ajumaac2d30792017-02-24 23:00:31935RenderSurfaceImpl* LayerImpl::GetRenderSurface() const {
apisarevbef3d072017-04-21 15:28:23936 DCHECK(effect_tree_index_ != EffectTree::kInvalidNodeId);
ajuma6b96f4cc42017-02-23 14:07:12937 EffectNode* effect_node = GetEffectTree().Node(effect_tree_index_);
938 if (effect_node->owning_layer_id == id())
939 return GetEffectTree().GetRenderSurface(effect_tree_index_);
940 return nullptr;
941}
942
weiliangc189c1a12016-04-11 16:16:25943RenderSurfaceImpl* LayerImpl::render_target() {
ajuma6b96f4cc42017-02-23 14:07:12944 return GetEffectTree().GetRenderSurface(render_target_effect_tree_index());
weiliangc189c1a12016-04-11 16:16:25945}
946
947const RenderSurfaceImpl* LayerImpl::render_target() const {
ajuma6b96f4cc42017-02-23 14:07:12948 return GetEffectTree().GetRenderSurface(render_target_effect_tree_index());
weiliangc189c1a12016-04-11 16:16:25949}
950
enne637715732015-07-07 02:05:26951float LayerImpl::GetIdealContentsScale() const {
952 float page_scale = IsAffectedByPageScale()
953 ? layer_tree_impl()->current_page_scale_factor()
954 : 1.f;
955 float device_scale = layer_tree_impl()->device_scale_factor();
956
957 float default_scale = page_scale * device_scale;
958 if (!layer_tree_impl()
959 ->settings()
960 .layer_transforms_should_scale_layer_contents) {
961 return default_scale;
962 }
963
enne637715732015-07-07 02:05:26964 gfx::Vector2dF transform_scales = MathUtil::ComputeTransform2dScaleComponents(
sunxdc5d4fb42016-05-27 04:40:09965 ScreenSpaceTransform(), default_scale);
enne637715732015-07-07 02:05:26966 return std::max(transform_scales.x(), transform_scales.y());
967}
968
wkorman5a126a52017-01-06 18:41:13969PropertyTrees* LayerImpl::GetPropertyTrees() const {
970 return layer_tree_impl_->property_trees();
971}
972
weiliangc42c074f2017-03-17 19:28:30973ClipTree& LayerImpl::GetClipTree() const {
974 return GetPropertyTrees()->clip_tree;
975}
976
wkorman5a126a52017-01-06 18:41:13977EffectTree& LayerImpl::GetEffectTree() const {
978 return GetPropertyTrees()->effect_tree;
979}
980
981ScrollTree& LayerImpl::GetScrollTree() const {
982 return GetPropertyTrees()->scroll_tree;
983}
984
985TransformTree& LayerImpl::GetTransformTree() const {
986 return GetPropertyTrees()->transform_tree;
987}
988
[email protected]bc5e77c2012-11-05 20:00:49989} // namespace cc