blob: 8ef2c23df5fc950050c761fcbdd1a4a8ba3d31b9 [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"
danakj35904762016-01-21 20:49:4024#include "cc/input/main_thread_scrolling_reason.h"
tdresserd9e201472015-07-31 13:15:0725#include "cc/input/scroll_state.h"
aeliasa57c40d122015-10-08 00:20:0926#include "cc/layers/layer.h"
trchendba8b1502016-07-08 09:47:0127#include "cc/trees/clip_node.h"
ajumad9432e32015-11-30 19:43:4428#include "cc/trees/draw_property_utils.h"
trchendba8b1502016-07-08 09:47:0129#include "cc/trees/effect_node.h"
[email protected]3d86dd7a2014-01-24 01:33:1130#include "cc/trees/layer_tree_host_common.h"
[email protected]556fd292013-03-18 08:03:0431#include "cc/trees/layer_tree_impl.h"
32#include "cc/trees/layer_tree_settings.h"
loyso6bd8b612016-11-11 07:00:0233#include "cc/trees/mutable_properties.h"
loyso6d6356e2016-11-02 23:41:0834#include "cc/trees/mutator_host.h"
[email protected]556fd292013-03-18 08:03:0435#include "cc/trees/proxy.h"
trchendba8b1502016-07-08 09:47:0136#include "cc/trees/scroll_node.h"
37#include "cc/trees/transform_node.h"
danakjf20f4502017-09-26 17:13:3138#include "components/viz/common/frame_sinks/copy_output_request.h"
danakje5805be2017-09-15 19:24:5539#include "components/viz/common/quads/debug_border_draw_quad.h"
40#include "components/viz/common/quads/render_pass.h"
Alex Zhangdd188a12017-08-14 18:48:4441#include "components/viz/common/traced_value.h"
heejin.r.chungd28506ba2014-10-23 16:36:2042#include "ui/gfx/geometry/point_conversions.h"
43#include "ui/gfx/geometry/quad_f.h"
44#include "ui/gfx/geometry/rect_conversions.h"
45#include "ui/gfx/geometry/size_conversions.h"
[email protected]adeda572014-01-31 00:49:4746#include "ui/gfx/geometry/vector2d_conversions.h"
[email protected]94f206c12012-08-25 00:09:1447
[email protected]9c88e562012-09-14 22:21:3048namespace cc {
sunxdc36713a2016-03-03 22:31:1049LayerImpl::LayerImpl(LayerTreeImpl* tree_impl, int id)
jaydasikaf419bf72016-06-15 10:21:2150 : layer_id_(id),
[email protected]7aba6662013-03-12 10:17:3451 layer_tree_impl_(tree_impl),
jaydasika38be7a822016-04-21 16:07:0652 test_properties_(nullptr),
danakj35904762016-01-21 20:49:4053 main_thread_scrolling_reasons_(
54 MainThreadScrollingReason::kNotScrollingOnMain),
pdrbf2f6faf2017-06-06 18:00:4055 scrollable_(false),
ennee95b1542015-04-20 20:35:5056 should_flatten_transform_from_property_tree_(false),
wutaobb1af5a2017-08-16 17:35:3557 layer_property_changed_not_from_property_trees_(false),
58 layer_property_changed_from_property_trees_(false),
sadrul32d10972016-07-30 05:26:2159 may_contain_video_(false),
[email protected]7aba6662013-03-12 10:17:3460 masks_to_bounds_(false),
61 contents_opaque_(false),
[email protected]7aba6662013-03-12 10:17:3462 use_parent_backface_visibility_(false),
jaydasika62bd3dd2016-02-04 18:52:5563 should_check_backface_visibility_(false),
[email protected]7aba6662013-03-12 10:17:3464 draws_content_(false),
ajuma651848a2017-05-01 21:23:4565 contributes_to_drawn_render_surface_(false),
Hayley Ferr7bfdda32017-06-19 18:55:4666 should_hit_test_(false),
David Bokanff563332017-08-15 21:19:1967 is_resized_by_browser_controls_(false),
pdr6280cc12017-05-10 23:22:4768 viewport_layer_type_(NOT_VIEWPORT_LAYER),
[email protected]c55f3fc2013-12-10 05:48:4869 background_color_(0),
jaydasikac6326bb2016-03-03 03:46:1470 safe_opaque_background_color_(0),
jaydasikadba9f752016-07-26 20:35:3471 transform_tree_index_(TransformTree::kInvalidNodeId),
72 effect_tree_index_(EffectTree::kInvalidNodeId),
73 clip_tree_index_(ClipTree::kInvalidNodeId),
74 scroll_tree_index_(ScrollTree::kInvalidNodeId),
vmpstr3d1d72c2015-01-26 18:27:4075 current_draw_mode_(DRAW_MODE_NONE),
vollickfd6e4f4a2016-01-22 19:13:2976 mutable_properties_(MutableProperty::kNone),
primianocb1afb32016-02-29 20:46:0577 debug_info_(nullptr),
vmpstr6e8dd7c2016-06-21 00:59:5878 has_will_change_transform_hint_(false),
David Reveman0d1336342017-09-12 17:05:4079 trilinear_filtering_(false),
bokan169f5ad2016-10-30 16:32:4880 needs_push_properties_(false),
skobes56451775d2017-03-28 18:46:3881 scrollbars_hidden_(false),
jaydasikaaf0dcd172017-05-01 17:37:1782 needs_show_scrollbars_(false),
Chris Harrelsondaececa42017-06-16 20:42:0283 raster_even_if_not_drawn_(false),
84 has_transform_node_(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_);
vollickcb3f6b12016-03-01 23:44:1096 layer_tree_impl_->UnregisterLayer(this);
vollickcb3f6b12016-03-01 23:44:1097 layer_tree_impl_->RemoveFromElementMap(this);
[email protected]f5ad4282014-02-15 14:23:1698 TRACE_EVENT_OBJECT_DELETED_WITH_ID(
[email protected]b4dc36472014-02-26 02:48:2599 TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerImpl", this);
[email protected]94f206c12012-08-25 00:09:14100}
101
vmpstrd6dce2602016-05-18 20:19:04102void LayerImpl::SetHasWillChangeTransformHint(bool has_will_change) {
vmpstrd6dce2602016-05-18 20:19:04103 has_will_change_transform_hint_ = has_will_change;
vmpstrd6dce2602016-05-18 20:19:04104}
105
David Reveman0d1336342017-09-12 17:05:40106void LayerImpl::SetTrilinearFiltering(bool trilinear_filtering) {
107 trilinear_filtering_ = trilinear_filtering;
108}
chrishtrcde557b62016-10-19 19:04:01109
loyso6d6356e2016-11-02 23:41:08110MutatorHost* LayerImpl::GetMutatorHost() const {
111 return layer_tree_impl_ ? layer_tree_impl_->mutator_host() : nullptr;
khushalsagaraf222d92016-07-08 21:19:32112}
113
114ElementListType LayerImpl::GetElementTypeForAnimation() const {
115 return IsActive() ? ElementListType::ACTIVE : ElementListType::PENDING;
116}
117
[email protected]9f3be432013-12-03 03:53:22118void LayerImpl::SetDebugInfo(
danakj60bc3bc2016-04-09 00:24:48119 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> debug_info) {
primianocb1afb32016-02-29 20:46:05120 owned_debug_info_ = std::move(debug_info);
121 debug_info_ = owned_debug_info_.get();
[email protected]ad0250b2014-01-18 03:24:34122 SetNeedsPushProperties();
[email protected]9f3be432013-12-03 03:53:22123}
124
vollick692444f2015-05-20 15:39:14125void LayerImpl::SetTransformTreeIndex(int index) {
126 transform_tree_index_ = index;
vollick692444f2015-05-20 15:39:14127}
128
129void LayerImpl::SetClipTreeIndex(int index) {
130 clip_tree_index_ = index;
vollick692444f2015-05-20 15:39:14131}
132
weiliangc6a52f302015-08-18 16:29:35133void LayerImpl::SetEffectTreeIndex(int index) {
134 effect_tree_index_ = index;
vollick692444f2015-05-20 15:39:14135}
136
sunxd47c2a0e32016-07-25 15:34:10137int LayerImpl::render_target_effect_tree_index() const {
wkorman5a126a52017-01-06 18:41:13138 EffectNode* effect_node = GetEffectTree().Node(effect_tree_index_);
ajuma6b96f4cc42017-02-23 14:07:12139
140 return GetEffectTree().GetRenderSurface(effect_tree_index_)
141 ? effect_node->id
142 : effect_node->target_id;
sunxd47c2a0e32016-07-25 15:34:10143}
144
sunxdea1df782016-01-28 00:12:33145void LayerImpl::SetScrollTreeIndex(int index) {
146 scroll_tree_index_ = index;
sunxdea1df782016-01-28 00:12:33147}
148
yiyix10141eca2017-09-05 20:36:52149void LayerImpl::PopulateSharedQuadState(viz::SharedQuadState* state,
150 bool contents_opaque) 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,
yiyix10141eca2017-09-05 20:36:52153 draw_properties_.is_clipped, contents_opaque,
154 draw_properties_.opacity, SkBlendMode::kSrcOver,
155 GetSortingContextId());
[email protected]94f206c12012-08-25 00:09:14156}
157
yiyix10141eca2017-09-05 20:36:52158void LayerImpl::PopulateScaledSharedQuadState(viz::SharedQuadState* state,
159 float layer_to_content_scale_x,
160 float layer_to_content_scale_y,
161 bool contents_opaque) const {
enne467829b2015-02-13 02:39:34162 gfx::Transform scaled_draw_transform =
163 draw_properties_.target_space_transform;
xlai5e87e712016-12-16 02:10:25164 scaled_draw_transform.Scale(SK_MScalar1 / layer_to_content_scale_x,
165 SK_MScalar1 / layer_to_content_scale_y);
166 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize(
167 bounds(), layer_to_content_scale_x, layer_to_content_scale_y);
168 gfx::Rect scaled_visible_layer_rect = gfx::ScaleToEnclosingRect(
169 visible_layer_rect(), layer_to_content_scale_x, layer_to_content_scale_y);
danakj64767d902015-06-19 00:10:43170 scaled_visible_layer_rect.Intersect(gfx::Rect(scaled_bounds));
enne467829b2015-02-13 02:39:34171
sunxdf0866592017-04-21 17:01:57172 state->SetAll(scaled_draw_transform, gfx::Rect(scaled_bounds),
173 scaled_visible_layer_rect, draw_properties().clip_rect,
yiyix10141eca2017-09-05 20:36:52174 draw_properties().is_clipped, contents_opaque,
175 draw_properties().opacity, SkBlendMode::kSrcOver,
176 GetSortingContextId());
enne467829b2015-02-13 02:39:34177}
178
[email protected]ffbb2212013-06-02 23:47:59179bool LayerImpl::WillDraw(DrawMode draw_mode,
180 ResourceProvider* resource_provider) {
[email protected]ed511b8d2013-03-25 03:29:29181 // WillDraw/DidDraw must be matched.
[email protected]ffbb2212013-06-02 23:47:59182 DCHECK_NE(DRAW_MODE_NONE, draw_mode);
183 DCHECK_EQ(DRAW_MODE_NONE, current_draw_mode_);
184 current_draw_mode_ = draw_mode;
185 return true;
[email protected]94f206c12012-08-25 00:09:14186}
187
[email protected]7aba6662013-03-12 10:17:34188void LayerImpl::DidDraw(ResourceProvider* resource_provider) {
[email protected]ffbb2212013-06-02 23:47:59189 DCHECK_NE(DRAW_MODE_NONE, current_draw_mode_);
190 current_draw_mode_ = DRAW_MODE_NONE;
[email protected]94f206c12012-08-25 00:09:14191}
192
reveman5be07ac82017-04-14 01:06:05193bool LayerImpl::ShowDebugBorders(DebugBorderType type) const {
194 return layer_tree_impl()->debug_state().show_debug_borders.test(type);
[email protected]3dce37232012-11-15 01:47:44195}
196
[email protected]7aba6662013-03-12 10:17:34197void LayerImpl::GetDebugBorderProperties(SkColor* color, float* width) const {
chrishtrac41ff92017-03-17 05:07:30198 float device_scale_factor =
199 layer_tree_impl() ? layer_tree_impl()->device_scale_factor() : 1;
200
[email protected]7aba6662013-03-12 10:17:34201 if (draws_content_) {
202 *color = DebugColors::ContentLayerBorderColor();
chrishtrac41ff92017-03-17 05:07:30203 *width = DebugColors::ContentLayerBorderWidth(device_scale_factor);
[email protected]7aba6662013-03-12 10:17:34204 return;
205 }
206
207 if (masks_to_bounds_) {
208 *color = DebugColors::MaskingLayerBorderColor();
chrishtrac41ff92017-03-17 05:07:30209 *width = DebugColors::MaskingLayerBorderWidth(device_scale_factor);
[email protected]7aba6662013-03-12 10:17:34210 return;
211 }
212
213 *color = DebugColors::ContainerLayerBorderColor();
chrishtrac41ff92017-03-17 05:07:30214 *width = DebugColors::ContainerLayerBorderWidth(device_scale_factor);
[email protected]7aba6662013-03-12 10:17:34215}
216
217void LayerImpl::AppendDebugBorderQuad(
danakje5805be2017-09-15 19:24:55218 viz::RenderPass* render_pass,
Dana Jansensc46d3742015-06-18 01:33:14219 const gfx::Size& bounds,
Alex Zhangabad2292017-08-23 21:55:19220 const viz::SharedQuadState* shared_quad_state,
[email protected]7aba6662013-03-12 10:17:34221 AppendQuadsData* append_quads_data) const {
[email protected]7aba6662013-03-12 10:17:34222 SkColor color;
223 float width;
224 GetDebugBorderProperties(&color, &width);
Dana Jansensc46d3742015-06-18 01:33:14225 AppendDebugBorderQuad(render_pass, bounds, shared_quad_state,
226 append_quads_data, color, width);
[email protected]bec084292013-05-21 21:31:44227}
228
Alex Zhangabad2292017-08-23 21:55:19229void LayerImpl::AppendDebugBorderQuad(
danakje5805be2017-09-15 19:24:55230 viz::RenderPass* render_pass,
Alex Zhangabad2292017-08-23 21:55:19231 const gfx::Size& bounds,
232 const viz::SharedQuadState* shared_quad_state,
233 AppendQuadsData* append_quads_data,
234 SkColor color,
235 float width) const {
reveman5be07ac82017-04-14 01:06:05236 if (!ShowDebugBorders(DebugBorderType::LAYER))
[email protected]bec084292013-05-21 21:31:44237 return;
[email protected]7aba6662013-03-12 10:17:34238
Dana Jansensc46d3742015-06-18 01:33:14239 gfx::Rect quad_rect(bounds);
[email protected]9bf06c72014-03-07 18:16:24240 gfx::Rect visible_quad_rect(quad_rect);
danakje5805be2017-09-15 19:24:55241 auto* debug_border_quad =
242 render_pass->CreateAndAppendDrawQuad<viz::DebugBorderDrawQuad>();
[email protected]9bf06c72014-03-07 18:16:24243 debug_border_quad->SetNew(
244 shared_quad_state, quad_rect, visible_quad_rect, color, width);
danakj069ac122015-02-12 00:59:22245 if (contents_opaque()) {
246 // When opaque, draw a second inner border that is thicker than the outer
247 // border, but more transparent.
248 static const float kFillOpacity = 0.3f;
249 SkColor fill_color = SkColorSetA(
250 color, static_cast<uint8_t>(SkColorGetA(color) * kFillOpacity));
251 float fill_width = width * 3;
252 gfx::Rect fill_rect = quad_rect;
253 fill_rect.Inset(fill_width / 2.f, fill_width / 2.f);
enneb79d5f142015-04-23 19:59:55254 if (fill_rect.IsEmpty())
255 return;
danakj069ac122015-02-12 00:59:22256 gfx::Rect visible_fill_rect =
257 gfx::IntersectRects(visible_quad_rect, fill_rect);
danakje5805be2017-09-15 19:24:55258 auto* fill_quad =
259 render_pass->CreateAndAppendDrawQuad<viz::DebugBorderDrawQuad>();
danakj069ac122015-02-12 00:59:22260 fill_quad->SetNew(shared_quad_state, fill_rect, visible_fill_rect,
261 fill_color, fill_width);
262 }
[email protected]7aba6662013-03-12 10:17:34263}
264
Fady Samuelc80a4a862017-07-28 10:23:36265void LayerImpl::GetContentsResourceId(viz::ResourceId* resource_id,
ericrk664405a2017-05-04 20:58:37266 gfx::Size* resource_size,
267 gfx::SizeF* resource_uv_size) const {
[email protected]7aba6662013-03-12 10:17:34268 NOTREACHED();
ennef6f3fbba42014-10-16 18:16:49269 *resource_id = 0;
[email protected]7aba6662013-03-12 10:17:34270}
271
[email protected]3244c9132014-01-23 10:39:12272gfx::Vector2dF LayerImpl::ScrollBy(const gfx::Vector2dF& scroll) {
wkorman5a126a52017-01-06 18:41:13273 ScrollTree& scroll_tree = GetScrollTree();
sunxd2668bea62016-03-17 00:49:47274 ScrollNode* scroll_node = scroll_tree.Node(scroll_tree_index());
275 return scroll_tree.ScrollBy(scroll_node, scroll, layer_tree_impl());
[email protected]7aba6662013-03-12 10:17:34276}
277
pdrbbfd8822017-06-27 22:44:52278void LayerImpl::SetScrollable(const gfx::Size& bounds) {
279 if (scrollable_ && scroll_container_bounds_ == bounds)
aeliasa57c40d122015-10-08 00:20:09280 return;
pdrbbfd8822017-06-27 22:44:52281 scrollable_ = true;
282 scroll_container_bounds_ = bounds;
Philip Rogers5e563782017-06-02 01:37:20283
pdrbbfd8822017-06-27 22:44:52284 // Scrollbar positions depend on the bounds.
Philip Rogers5e563782017-06-02 01:37:20285 layer_tree_impl()->SetScrollbarGeometriesNeedUpdate();
pdrbf2f6faf2017-06-06 18:00:40286
pdrbbfd8822017-06-27 22:44:52287 if (layer_tree_impl()->settings().scrollbar_animator ==
288 LayerTreeSettings::AURA_OVERLAY) {
pdr74b07a12017-06-09 17:19:06289 set_needs_show_scrollbars(true);
290 }
pdrbbfd8822017-06-27 22:44:52291
292 NoteLayerPropertyChanged();
[email protected]adeda572014-01-31 00:49:47293}
294
danakj60bc3bc2016-04-09 00:24:48295std::unique_ptr<LayerImpl> LayerImpl::CreateLayerImpl(
296 LayerTreeImpl* tree_impl) {
sunxdc36713a2016-03-03 22:31:10297 return LayerImpl::Create(tree_impl, layer_id_);
[email protected]94f206c12012-08-25 00:09:14298}
299
jaydasika2a1718b2016-10-26 22:58:02300bool LayerImpl::IsSnapped() {
301 return scrollable();
302}
303
[email protected]7aba6662013-03-12 10:17:34304void LayerImpl::PushPropertiesTo(LayerImpl* layer) {
vmpstre2672aa52016-06-20 21:05:06305 DCHECK(layer->IsActive());
306
Walter Korman2f716052017-07-28 04:58:48307 // The element id should be set first because other setters may
308 // depend on it. Referencing element id on a layer is
309 // deprecated. http://crbug.com/709137
pdrfaf2ee222017-04-19 03:11:04310 layer->SetElementId(element_id_);
311
Chris Harrelsondaececa42017-06-16 20:42:02312 layer->has_transform_node_ = has_transform_node_;
vmpstre2672aa52016-06-20 21:05:06313 layer->offset_to_transform_parent_ = offset_to_transform_parent_;
314 layer->main_thread_scrolling_reasons_ = main_thread_scrolling_reasons_;
vmpstre2672aa52016-06-20 21:05:06315 layer->should_flatten_transform_from_property_tree_ =
316 should_flatten_transform_from_property_tree_;
317 layer->masks_to_bounds_ = masks_to_bounds_;
318 layer->contents_opaque_ = contents_opaque_;
sadrul32d10972016-07-30 05:26:21319 layer->may_contain_video_ = may_contain_video_;
vmpstre2672aa52016-06-20 21:05:06320 layer->use_parent_backface_visibility_ = use_parent_backface_visibility_;
vmpstre2672aa52016-06-20 21:05:06321 layer->should_check_backface_visibility_ = should_check_backface_visibility_;
322 layer->draws_content_ = draws_content_;
Hayley Ferr7bfdda32017-06-19 18:55:46323 layer->should_hit_test_ = should_hit_test_;
vmpstre2672aa52016-06-20 21:05:06324 layer->non_fast_scrollable_region_ = non_fast_scrollable_region_;
Hayley Ferrd9ee3a72017-06-16 14:16:09325 layer->touch_action_region_ = touch_action_region_;
vmpstre2672aa52016-06-20 21:05:06326 layer->background_color_ = background_color_;
327 layer->safe_opaque_background_color_ = safe_opaque_background_color_;
vmpstre2672aa52016-06-20 21:05:06328 layer->position_ = position_;
vmpstre2672aa52016-06-20 21:05:06329 layer->transform_tree_index_ = transform_tree_index_;
330 layer->effect_tree_index_ = effect_tree_index_;
331 layer->clip_tree_index_ = clip_tree_index_;
332 layer->scroll_tree_index_ = scroll_tree_index_;
vmpstre2672aa52016-06-20 21:05:06333 layer->has_will_change_transform_hint_ = has_will_change_transform_hint_;
David Reveman0d1336342017-09-12 17:05:40334 layer->trilinear_filtering_ = trilinear_filtering_;
bokan169f5ad2016-10-30 16:32:48335 layer->scrollbars_hidden_ = scrollbars_hidden_;
chaopengfe2cab762017-07-17 15:35:10336 if (needs_show_scrollbars_)
337 layer->needs_show_scrollbars_ = needs_show_scrollbars_;
vmpstre2672aa52016-06-20 21:05:06338
wutaobb1af5a2017-08-16 17:35:35339 if (layer_property_changed_not_from_property_trees_ ||
340 layer_property_changed_from_property_trees_)
vmpstre2672aa52016-06-20 21:05:06341 layer->layer_tree_impl()->set_needs_update_draw_properties();
wutaobb1af5a2017-08-16 17:35:35342 if (layer_property_changed_not_from_property_trees_)
343 layer->layer_property_changed_not_from_property_trees_ = true;
344 if (layer_property_changed_from_property_trees_)
345 layer->layer_property_changed_from_property_trees_ = true;
vmpstre2672aa52016-06-20 21:05:06346
vmpstre2672aa52016-06-20 21:05:06347 layer->SetBounds(bounds_);
pdrbbfd8822017-06-27 22:44:52348 if (scrollable_)
349 layer->SetScrollable(scroll_container_bounds_);
vollick933f496e2015-12-08 04:22:05350 layer->SetMutableProperties(mutable_properties_);
ennee95b1542015-04-20 20:35:50351
[email protected]7aba6662013-03-12 10:17:34352 // If the main thread commits multiple times before the impl thread actually
353 // draws, then damage tracking will become incorrect if we simply clobber the
[email protected]ed511b8d2013-03-25 03:29:29354 // update_rect here. The LayerImpl's update_rect needs to accumulate (i.e.
[email protected]7aba6662013-03-12 10:17:34355 // union) any update changes that have occurred on the main thread.
356 update_rect_.Union(layer->update_rect());
[email protected]ad0250b2014-01-18 03:24:34357 layer->SetUpdateRect(update_rect_);
[email protected]7aba6662013-03-12 10:17:34358
primianocb1afb32016-02-29 20:46:05359 if (owned_debug_info_)
360 layer->SetDebugInfo(std::move(owned_debug_info_));
[email protected]7aba6662013-03-12 10:17:34361
[email protected]7aba6662013-03-12 10:17:34362 // Reset any state that should be cleared for the next update.
skobes56451775d2017-03-28 18:46:38363 needs_show_scrollbars_ = false;
wutaobb1af5a2017-08-16 17:35:35364 layer_property_changed_not_from_property_trees_ = false;
365 layer_property_changed_from_property_trees_ = false;
vmpstr6e8dd7c2016-06-21 00:59:58366 needs_push_properties_ = false;
danakj19f0c9e2014-10-11 03:24:42367 update_rect_ = gfx::Rect();
jaydasikabb0409e52016-03-08 04:05:19368 layer_tree_impl()->RemoveLayerShouldPushProperties(this);
[email protected]caa567d2012-12-20 07:56:16369}
370
sunxdf66237552016-01-06 21:36:37371bool LayerImpl::IsAffectedByPageScale() const {
wkorman5a126a52017-01-06 18:41:13372 TransformTree& transform_tree = GetTransformTree();
sunxdf66237552016-01-06 21:36:37373 return transform_tree.Node(transform_tree_index())
trchendba8b1502016-07-08 09:47:01374 ->in_subtree_of_page_scale_layer;
sunxdf66237552016-01-06 21:36:37375}
376
David Bokanff563332017-08-15 21:19:19377bool LayerImpl::IsResizedByBrowserControls() const {
378 return is_resized_by_browser_controls_;
379}
380
381void LayerImpl::SetIsResizedByBrowserControls(bool resized) {
382 is_resized_by_browser_controls_ = resized;
383}
384
jaydasikafc66cfb2016-06-10 04:34:22385std::unique_ptr<base::DictionaryValue> LayerImpl::LayerTreeAsJson() {
dcheng6223240a2016-05-31 19:48:01386 std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue);
r.kasibhatlafd17d0e2015-05-17 11:12:07387 result->SetInteger("LayerId", id());
[email protected]7aba6662013-03-12 10:17:34388 result->SetString("LayerType", LayerTypeAsString());
389
Jeremy Roman909d927b2017-08-27 18:34:09390 auto list = std::make_unique<base::ListValue>();
bokancccfde72014-10-08 15:15:22391 list->AppendInteger(bounds().width());
392 list->AppendInteger(bounds().height());
vabrbce355c2017-03-23 18:52:43393 result->Set("Bounds", std::move(list));
[email protected]7aba6662013-03-12 10:17:34394
Jeremy Roman909d927b2017-08-27 18:34:09395 list = std::make_unique<base::ListValue>();
[email protected]7aba6662013-03-12 10:17:34396 list->AppendDouble(position_.x());
397 list->AppendDouble(position_.y());
vabrbce355c2017-03-23 18:52:43398 result->Set("Position", std::move(list));
[email protected]7aba6662013-03-12 10:17:34399
jaydasika10d43fc2016-08-18 04:06:04400 const gfx::Transform& gfx_transform = test_properties()->transform;
[email protected]7aba6662013-03-12 10:17:34401 double transform[16];
402 gfx_transform.matrix().asColMajord(transform);
Jeremy Roman909d927b2017-08-27 18:34:09403 list = std::make_unique<base::ListValue>();
[email protected]7aba6662013-03-12 10:17:34404 for (int i = 0; i < 16; ++i)
405 list->AppendDouble(transform[i]);
vabrbce355c2017-03-23 18:52:43406 result->Set("Transform", std::move(list));
[email protected]7aba6662013-03-12 10:17:34407
408 result->SetBoolean("DrawsContent", draws_content_);
[email protected]a9d4d4f2014-06-19 06:49:28409 result->SetBoolean("Is3dSorted", Is3dSorted());
jaydasikaab317e02016-06-01 00:53:18410 result->SetDouble("OPACITY", Opacity());
[email protected]46c76952013-07-10 00:21:45411 result->SetBoolean("ContentsOpaque", contents_opaque_);
[email protected]7aba6662013-03-12 10:17:34412
[email protected]adeda572014-01-31 00:49:47413 if (scrollable())
414 result->SetBoolean("Scrollable", true);
[email protected]d993e032013-06-07 00:16:16415
Hayley Ferrd9ee3a72017-06-16 14:16:09416 if (!touch_action_region_.region().IsEmpty()) {
417 std::unique_ptr<base::Value> region =
418 touch_action_region_.region().AsValue();
vabrbce355c2017-03-23 18:52:43419 result->Set("TouchRegion", std::move(region));
[email protected]9d161d22013-10-29 20:54:10420 }
421
Jeremy Roman909d927b2017-08-27 18:34:09422 list = std::make_unique<base::ListValue>();
jaydasikafc66cfb2016-06-10 04:34:22423 for (size_t i = 0; i < test_properties()->children.size(); ++i)
424 list->Append(test_properties()->children[i]->LayerTreeAsJson());
vabrbce355c2017-03-23 18:52:43425 result->Set("Children", std::move(list));
[email protected]7aba6662013-03-12 10:17:34426
427 return result;
[email protected]b9dcf43a2013-01-09 00:15:29428}
429
jaydasikaadfec8e2016-02-17 02:46:11430bool LayerImpl::LayerPropertyChanged() const {
wutaobb1af5a2017-08-16 17:35:35431 return layer_property_changed_not_from_property_trees_ ||
432 LayerPropertyChangedFromPropertyTrees();
433}
434
435bool LayerImpl::LayerPropertyChangedFromPropertyTrees() const {
436 if (layer_property_changed_from_property_trees_ ||
437 GetPropertyTrees()->full_tree_damaged)
jaydasikaadfec8e2016-02-17 02:46:11438 return true;
jaydasikadba9f752016-07-26 20:35:34439 if (transform_tree_index() == TransformTree::kInvalidNodeId)
jaydasika16515f52016-03-01 00:28:35440 return false;
441 TransformNode* transform_node =
wkorman5a126a52017-01-06 18:41:13442 GetTransformTree().Node(transform_tree_index());
trchendba8b1502016-07-08 09:47:01443 if (transform_node && transform_node->transform_changed)
jaydasika16515f52016-03-01 00:28:35444 return true;
jaydasikadba9f752016-07-26 20:35:34445 if (effect_tree_index() == EffectTree::kInvalidNodeId)
jaydasika16515f52016-03-01 00:28:35446 return false;
wkorman5a126a52017-01-06 18:41:13447 EffectNode* effect_node = GetEffectTree().Node(effect_tree_index());
trchendba8b1502016-07-08 09:47:01448 if (effect_node && effect_node->effect_changed)
jaydasikaadfec8e2016-02-17 02:46:11449 return true;
450 return false;
451}
452
wutao36850732017-07-29 20:24:07453bool LayerImpl::LayerPropertyChangedNotFromPropertyTrees() const {
wutaobb1af5a2017-08-16 17:35:35454 return layer_property_changed_not_from_property_trees_;
wutao36850732017-07-29 20:24:07455}
456
[email protected]7aba6662013-03-12 10:17:34457void LayerImpl::NoteLayerPropertyChanged() {
wutaobb1af5a2017-08-16 17:35:35458 layer_property_changed_not_from_property_trees_ = true;
459 layer_tree_impl()->set_needs_update_draw_properties();
460 SetNeedsPushProperties();
461}
462
463void LayerImpl::NoteLayerPropertyChangedFromPropertyTrees() {
464 layer_property_changed_from_property_trees_ = true;
[email protected]7aba6662013-03-12 10:17:34465 layer_tree_impl()->set_needs_update_draw_properties();
[email protected]ad0250b2014-01-18 03:24:34466 SetNeedsPushProperties();
[email protected]48871fc2013-01-23 07:36:51467}
468
danakj1a010682017-09-07 20:08:19469void LayerImpl::ValidateQuadResourcesInternal(viz::DrawQuad* quad) const {
danakjf9427572015-04-24 22:19:02470#if DCHECK_IS_ON()
vmpstr0eca2e82015-06-02 22:14:46471 const ResourceProvider* resource_provider =
472 layer_tree_impl_->resource_provider();
Fady Samuelc80a4a862017-07-28 10:23:36473 for (viz::ResourceId resource_id : quad->resources)
vmpstr0eca2e82015-06-02 22:14:46474 resource_provider->ValidateResource(resource_id);
danakjf9427572015-04-24 22:19:02475#endif
476}
477
[email protected]7aba6662013-03-12 10:17:34478const char* LayerImpl::LayerTypeAsString() const {
[email protected]f256b7fd2013-05-15 01:49:30479 return "cc::LayerImpl";
[email protected]7aba6662013-03-12 10:17:34480}
[email protected]94f206c12012-08-25 00:09:14481
jaydasikaef64f9e42016-03-12 01:08:18482void LayerImpl::ResetChangeTracking() {
wutaobb1af5a2017-08-16 17:35:35483 layer_property_changed_not_from_property_trees_ = false;
484 layer_property_changed_from_property_trees_ = false;
vmpstr6e8dd7c2016-06-21 00:59:58485 needs_push_properties_ = false;
[email protected]7aba6662013-03-12 10:17:34486
danakjd344ab92015-08-28 19:25:51487 update_rect_.SetRect(0, 0, 0, 0);
488 damage_rect_.SetRect(0, 0, 0, 0);
[email protected]7aba6662013-03-12 10:17:34489}
490
jaydasikaebc94282017-04-24 20:34:01491bool LayerImpl::has_copy_requests_in_target_subtree() {
492 return GetEffectTree().Node(effect_tree_index())->subtree_has_copy_request;
sunxded58688e2016-01-11 21:01:02493}
494
[email protected]7aba6662013-03-12 10:17:34495bool LayerImpl::IsActive() const {
496 return layer_tree_impl_->IsActiveTree();
497}
498
bokancccfde72014-10-08 15:15:22499gfx::Size LayerImpl::bounds() const {
pdr23d381fd2017-04-25 21:06:31500 auto viewport_bounds_delta = gfx::ToCeiledVector2d(ViewportBoundsDelta());
501 return gfx::Size(bounds_.width() + viewport_bounds_delta.x(),
502 bounds_.height() + viewport_bounds_delta.y());
bokanef971462014-10-13 22:58:32503}
504
505gfx::SizeF LayerImpl::BoundsForScrolling() const {
pdr23d381fd2017-04-25 21:06:31506 auto viewport_bounds_delta = ViewportBoundsDelta();
507 return gfx::SizeF(bounds_.width() + viewport_bounds_delta.x(),
508 bounds_.height() + viewport_bounds_delta.y());
[email protected]fef74fd2014-02-27 06:28:17509}
510
[email protected]64348ea2014-01-29 22:58:26511void LayerImpl::SetBounds(const gfx::Size& bounds) {
[email protected]7aba6662013-03-12 10:17:34512 if (bounds_ == bounds)
513 return;
514
515 bounds_ = bounds;
[email protected]fef74fd2014-02-27 06:28:17516
pdrbbfd8822017-06-27 22:44:52517 // Scrollbar positions depend on the scrolling layer bounds.
518 if (scrollable())
519 layer_tree_impl()->SetScrollbarGeometriesNeedUpdate();
sunxdcfccd1b32016-02-11 00:54:20520
jaydasikab311c9a2016-03-02 20:49:09521 NoteLayerPropertyChanged();
[email protected]fef74fd2014-02-27 06:28:17522}
523
pdr23d381fd2017-04-25 21:06:31524void LayerImpl::SetViewportBoundsDelta(const gfx::Vector2dF& bounds_delta) {
ajuma6b46da22015-06-25 21:53:02525 DCHECK(IsActive());
[email protected]fef74fd2014-02-27 06:28:17526
pdr23d381fd2017-04-25 21:06:31527 if (bounds_delta == ViewportBoundsDelta())
528 return;
[email protected]7aba6662013-03-12 10:17:34529
wkorman5a126a52017-01-06 18:41:13530 PropertyTrees* property_trees = GetPropertyTrees();
pdr6280cc12017-05-10 23:22:47531 switch (viewport_layer_type_) {
532 case (INNER_VIEWPORT_CONTAINER):
533 property_trees->SetInnerViewportContainerBoundsDelta(bounds_delta);
534 break;
535 case (OUTER_VIEWPORT_CONTAINER):
536 property_trees->SetOuterViewportContainerBoundsDelta(bounds_delta);
537 break;
538 case (INNER_VIEWPORT_SCROLL):
539 property_trees->SetInnerViewportScrollBoundsDelta(bounds_delta);
540 break;
541 case (OUTER_VIEWPORT_SCROLL):
542 // OUTER_VIEWPORT_SCROLL should not have viewport bounds deltas.
543 NOTREACHED();
544 }
ajuma6b46da22015-06-25 21:53:02545
Philip Rogers5e563782017-06-02 01:37:20546 // Viewport scrollbar positions are determined using the viewport bounds
547 // delta.
548 layer_tree_impl()->SetScrollbarGeometriesNeedUpdate();
miletus8bd08a622015-06-16 18:44:52549
550 if (masks_to_bounds()) {
551 // If layer is clipping, then update the clip node using the new bounds.
Chris Harrelson0f075b22017-06-14 23:45:36552 ClipNode* clip_node = property_trees->clip_tree.Node(clip_tree_index());
553 CHECK(clip_node);
554 DCHECK_EQ(clip_node->id, clip_tree_index());
555 clip_node->clip = gfx::RectF(gfx::PointF() + offset_to_transform_parent(),
556 gfx::SizeF(bounds()));
557 property_trees->clip_tree.set_needs_update(true);
558
jaydasikab311c9a2016-03-02 20:49:09559 property_trees->full_tree_damaged = true;
560 layer_tree_impl()->set_needs_update_draw_properties();
miletus8bd08a622015-06-16 18:44:52561 } else {
[email protected]7aba6662013-03-12 10:17:34562 NoteLayerPropertyChanged();
miletus8bd08a622015-06-16 18:44:52563 }
[email protected]7aba6662013-03-12 10:17:34564}
565
pdr23d381fd2017-04-25 21:06:31566gfx::Vector2dF LayerImpl::ViewportBoundsDelta() const {
pdr6280cc12017-05-10 23:22:47567 switch (viewport_layer_type_) {
568 case (INNER_VIEWPORT_CONTAINER):
569 return GetPropertyTrees()->inner_viewport_container_bounds_delta();
570 case (OUTER_VIEWPORT_CONTAINER):
571 return GetPropertyTrees()->outer_viewport_container_bounds_delta();
572 case (INNER_VIEWPORT_SCROLL):
573 return GetPropertyTrees()->inner_viewport_scroll_bounds_delta();
574 default:
575 return gfx::Vector2dF();
576 }
pdr23d381fd2017-04-25 21:06:31577}
578
[email protected]80413d72013-08-30 20:25:33579ScrollbarLayerImplBase* LayerImpl::ToScrollbarLayer() {
kulkarni.a4015690f12014-10-10 13:50:06580 return nullptr;
[email protected]7aba6662013-03-12 10:17:34581}
582
583void LayerImpl::SetDrawsContent(bool draws_content) {
584 if (draws_content_ == draws_content)
585 return;
586
587 draws_content_ = draws_content;
Hayley Ferr7bfdda32017-06-19 18:55:46588 if (draws_content)
589 SetShouldHitTest(true);
590 NoteLayerPropertyChanged();
591}
592
593void LayerImpl::SetShouldHitTest(bool should_hit_test) {
594 if (should_hit_test_ == should_hit_test)
595 return;
596
597 should_hit_test_ = should_hit_test;
[email protected]7aba6662013-03-12 10:17:34598 NoteLayerPropertyChanged();
599}
600
[email protected]7aba6662013-03-12 10:17:34601void LayerImpl::SetBackgroundColor(SkColor background_color) {
602 if (background_color_ == background_color)
603 return;
604
605 background_color_ = background_color;
606 NoteLayerPropertyChanged();
607}
608
jaydasikac6326bb2016-03-03 03:46:14609void LayerImpl::SetSafeOpaqueBackgroundColor(SkColor background_color) {
jaydasikac6326bb2016-03-03 03:46:14610 safe_opaque_background_color_ = background_color;
jaydasikac6326bb2016-03-03 03:46:14611}
612
[email protected]2c4cbec2013-06-04 21:14:50613SkColor LayerImpl::SafeOpaqueBackgroundColor() const {
jaydasikac6326bb2016-03-03 03:46:14614 if (contents_opaque())
615 return safe_opaque_background_color_;
[email protected]2c4cbec2013-06-04 21:14:50616 SkColor color = background_color();
jaydasikac6326bb2016-03-03 03:46:14617 if (SkColorGetA(color) == 255)
[email protected]2c4cbec2013-06-04 21:14:50618 color = SK_ColorTRANSPARENT;
[email protected]2c4cbec2013-06-04 21:14:50619 return color;
620}
621
[email protected]7aba6662013-03-12 10:17:34622void LayerImpl::SetMasksToBounds(bool masks_to_bounds) {
[email protected]7aba6662013-03-12 10:17:34623 masks_to_bounds_ = masks_to_bounds;
[email protected]7aba6662013-03-12 10:17:34624}
625
626void LayerImpl::SetContentsOpaque(bool opaque) {
[email protected]7aba6662013-03-12 10:17:34627 contents_opaque_ = opaque;
[email protected]7aba6662013-03-12 10:17:34628}
629
jaydasikaab317e02016-06-01 00:53:18630float LayerImpl::Opacity() const {
Chris Harrelson84670c92017-06-06 05:39:06631 if (const EffectNode* node = GetEffectTree().Node(effect_tree_index()))
weiliangc42c074f2017-03-17 19:28:30632 return node->opacity;
633 else
jaydasikaab317e02016-06-01 00:53:18634 return 1.f;
[email protected]7aba6662013-03-12 10:17:34635}
636
jaydasika10d43fc2016-08-18 04:06:04637const gfx::Transform& LayerImpl::Transform() const {
Chris Harrelsondfd95a12017-06-13 17:13:56638 return GetTransformTree().Node(transform_tree_index())->local;
jaydasika10d43fc2016-08-18 04:06:04639}
640
vollickef2ae922016-06-29 17:54:27641void LayerImpl::SetElementId(ElementId element_id) {
vollick933f496e2015-12-08 04:22:05642 if (element_id == element_id_)
643 return;
644
645 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("compositor-worker"),
vollickef2ae922016-06-29 17:54:27646 "LayerImpl::SetElementId", "element",
647 element_id.AsValue().release());
vollick933f496e2015-12-08 04:22:05648
vollickcb3f6b12016-03-01 23:44:10649 layer_tree_impl_->RemoveFromElementMap(this);
vollick933f496e2015-12-08 04:22:05650 element_id_ = element_id;
vollickcb3f6b12016-03-01 23:44:10651 layer_tree_impl_->AddToElementMap(this);
vollickef2ae922016-06-29 17:54:27652
653 SetNeedsPushProperties();
vollick933f496e2015-12-08 04:22:05654}
655
656void LayerImpl::SetMutableProperties(uint32_t properties) {
657 if (mutable_properties_ == properties)
658 return;
659
660 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("compositor-worker"),
661 "LayerImpl::SetMutableProperties", "properties", properties);
662
663 mutable_properties_ = properties;
vollick9c7f6d02016-01-08 04:36:38664 // If this layer is already in the element map, update its properties.
vollickcb3f6b12016-03-01 23:44:10665 layer_tree_impl_->AddToElementMap(this);
vollick933f496e2015-12-08 04:22:05666}
667
[email protected]14bc5d682014-01-17 07:26:47668void LayerImpl::SetPosition(const gfx::PointF& position) {
[email protected]7aba6662013-03-12 10:17:34669 position_ = position;
[email protected]7aba6662013-03-12 10:17:34670}
671
danakj19f0c9e2014-10-11 03:24:42672void LayerImpl::SetUpdateRect(const gfx::Rect& update_rect) {
[email protected]ad0250b2014-01-18 03:24:34673 update_rect_ = update_rect;
674 SetNeedsPushProperties();
675}
676
danakjd344ab92015-08-28 19:25:51677void LayerImpl::AddDamageRect(const gfx::Rect& damage_rect) {
678 damage_rect_.Union(damage_rect);
[email protected]cfa7fd922014-04-29 11:50:03679}
680
aeliasd0070ba2015-01-31 13:44:49681void LayerImpl::SetCurrentScrollOffset(const gfx::ScrollOffset& scroll_offset) {
682 DCHECK(IsActive());
pdr54d038192017-06-08 22:44:13683 if (GetScrollTree().SetScrollOffset(element_id(), scroll_offset))
684 layer_tree_impl()->DidUpdateScrollOffset(element_id());
boliu7d5dbab2014-10-10 20:05:47685}
686
aeliasd0070ba2015-01-31 13:44:49687gfx::ScrollOffset LayerImpl::CurrentScrollOffset() const {
pdr54d038192017-06-08 22:44:13688 return GetScrollTree().current_scroll_offset(element_id());
[email protected]7aba6662013-03-12 10:17:34689}
690
danakj64767d902015-06-19 00:10:43691SimpleEnclosedRegion LayerImpl::VisibleOpaqueRegion() const {
[email protected]7aba6662013-03-12 10:17:34692 if (contents_opaque())
danakj64767d902015-06-19 00:10:43693 return SimpleEnclosedRegion(visible_layer_rect());
[email protected]d5467eb72014-08-22 01:16:43694 return SimpleEnclosedRegion();
[email protected]7aba6662013-03-12 10:17:34695}
696
[email protected]37349bc2013-06-04 01:31:52697void LayerImpl::DidBeginTracing() {}
698
[email protected]9db24462014-01-14 02:25:50699void LayerImpl::ReleaseResources() {}
[email protected]7aba6662013-03-12 10:17:34700
ericrk7cedb542016-11-02 19:03:44701void LayerImpl::ReleaseTileResources() {}
702
703void LayerImpl::RecreateTileResources() {}
vmpstr9ce5c662015-02-05 23:29:26704
miletusf57925d2014-10-01 19:38:13705gfx::ScrollOffset LayerImpl::MaxScrollOffset() const {
wkorman5a126a52017-01-06 18:41:13706 return GetScrollTree().MaxScrollOffset(scroll_tree_index());
[email protected]adeda572014-01-31 00:49:47707}
708
aeliasd0070ba2015-01-31 13:44:49709gfx::ScrollOffset LayerImpl::ClampScrollOffsetToLimits(
710 gfx::ScrollOffset offset) const {
711 offset.SetToMin(MaxScrollOffset());
712 offset.SetToMax(gfx::ScrollOffset());
713 return offset;
714}
[email protected]adeda572014-01-31 00:49:47715
aeliasd0070ba2015-01-31 13:44:49716gfx::Vector2dF LayerImpl::ClampScrollToMaxScrollOffset() {
717 gfx::ScrollOffset old_offset = CurrentScrollOffset();
718 gfx::ScrollOffset clamped_offset = ClampScrollOffsetToLimits(old_offset);
miletusf57925d2014-10-01 19:38:13719 gfx::Vector2dF delta = clamped_offset.DeltaFrom(old_offset);
[email protected]adeda572014-01-31 00:49:47720 if (!delta.IsZero())
721 ScrollBy(delta);
[email protected]adeda572014-01-31 00:49:47722 return delta;
723}
724
[email protected]ad0250b2014-01-18 03:24:34725void LayerImpl::SetNeedsPushProperties() {
Philip Rogersc8cb2002017-05-31 02:14:36726 // There's no need to push layer properties on the active tree.
727 if (!needs_push_properties_ && !layer_tree_impl()->IsActiveTree()) {
vmpstr6e8dd7c2016-06-21 00:59:58728 needs_push_properties_ = true;
jaydasikabb0409e52016-03-08 04:05:19729 layer_tree_impl()->AddLayerShouldPushProperties(this);
vmpstr6e8dd7c2016-06-21 00:59:58730 }
[email protected]ad0250b2014-01-18 03:24:34731}
732
hendrikwc5e915852015-05-13 01:29:03733void LayerImpl::GetAllPrioritizedTilesForTracing(
734 std::vector<PrioritizedTile>* prioritized_tiles) const {
vmpstrd7de03c2014-08-27 18:11:01735}
736
ssid911e40e2015-02-09 17:55:20737void LayerImpl::AsValueInto(base::trace_event::TracedValue* state) const {
Alex Zhangdd188a12017-08-14 18:48:44738 viz::TracedValue::MakeDictIntoImplicitSnapshotWithCategory(
739 TRACE_DISABLED_BY_DEFAULT("cc.debug"), state, "cc::LayerImpl",
740 LayerTypeAsString(), this);
[email protected]f6742f52013-05-08 23:52:22741 state->SetInteger("layer_id", id());
jungjik.lee50f9c8e2015-01-21 14:06:16742 MathUtil::AddToTracedValue("bounds", bounds_, state);
[email protected]d12aa932014-08-01 13:10:38743
jaydasikaab317e02016-06-01 00:53:18744 state->SetDouble("opacity", Opacity());
danakj38955562014-09-13 02:56:43745
jungjik.lee50f9c8e2015-01-21 14:06:16746 MathUtil::AddToTracedValue("position", position_, state);
[email protected]d12aa932014-08-01 13:10:38747
[email protected]f6742f52013-05-08 23:52:22748 state->SetInteger("draws_content", DrawsContent());
vmpstr91e23092015-06-08 22:24:16749 state->SetInteger("gpu_memory_usage",
750 base::saturated_cast<int>(GPUMemoryUsageInBytes()));
[email protected]d12aa932014-08-01 13:10:38751
vollickef2ae922016-06-29 17:54:27752 if (element_id_)
753 element_id_.AddToTracedValue(state);
754
755 if (mutable_properties_ != MutableProperty::kNone)
vollick933f496e2015-12-08 04:22:05756 state->SetInteger("mutable_properties", mutable_properties_);
vollick933f496e2015-12-08 04:22:05757
sunxdc044b11a2016-03-16 16:23:20758 MathUtil::AddToTracedValue("scroll_offset", CurrentScrollOffset(), state);
aeliasd0070ba2015-01-31 13:44:49759
jaydasika10d43fc2016-08-18 04:06:04760 if (!ScreenSpaceTransform().IsIdentity())
761 MathUtil::AddToTracedValue("screen_space_transform", ScreenSpaceTransform(),
762 state);
vollick96b33a52016-03-30 20:11:53763
[email protected]7aba6662013-03-12 10:17:34764 bool clipped;
danakj5e6ff6d2015-09-05 04:43:44765 gfx::QuadF layer_quad =
ajumab6aa1c62015-12-01 21:01:10766 MathUtil::MapQuad(ScreenSpaceTransform(),
danakj5e6ff6d2015-09-05 04:43:44767 gfx::QuadF(gfx::RectF(gfx::Rect(bounds()))), &clipped);
jungjik.lee50f9c8e2015-01-21 14:06:16768 MathUtil::AddToTracedValue("layer_quad", layer_quad, state);
Hayley Ferrd9ee3a72017-06-16 14:16:09769 if (!touch_action_region_.region().IsEmpty()) {
770 state->BeginArray("touch_action_region_region");
771 touch_action_region_.region().AsValueInto(state);
[email protected]d12aa932014-08-01 13:10:38772 state->EndArray();
[email protected]78d78612013-09-12 18:04:04773 }
[email protected]78d78612013-09-12 18:04:04774 if (!non_fast_scrollable_region_.IsEmpty()) {
[email protected]d12aa932014-08-01 13:10:38775 state->BeginArray("non_fast_scrollable_region");
776 non_fast_scrollable_region_.AsValueInto(state);
777 state->EndArray();
[email protected]78d78612013-09-12 18:04:04778 }
[email protected]0e98cdd2013-08-23 00:44:30779
sunxd5a7a4032016-06-01 18:49:22780 state->SetBoolean("can_use_lcd_text", CanUseLCDText());
[email protected]c2a56ff2013-10-14 19:32:51781 state->SetBoolean("contents_opaque", contents_opaque());
[email protected]a1286742013-11-13 17:11:40782
vmpstrd6dce2602016-05-18 20:19:04783 state->SetBoolean("has_will_change_transform_hint",
784 has_will_change_transform_hint());
785
David Reveman0d1336342017-09-12 17:05:40786 state->SetBoolean("trilinear_filtering", trilinear_filtering());
787
primianocb1afb32016-02-29 20:46:05788 if (debug_info_) {
[email protected]9f3be432013-12-03 03:53:22789 std::string str;
790 debug_info_->AppendAsTraceFormat(&str);
791 base::JSONReader json_reader;
danakj60bc3bc2016-04-09 00:24:48792 std::unique_ptr<base::Value> debug_info_value(json_reader.ReadToValue(str));
[email protected]685de6b12014-01-09 12:25:05793
jdoerriedc72ee942016-12-07 15:43:28794 if (debug_info_value->IsType(base::Value::Type::DICTIONARY)) {
kulkarni.a4015690f12014-10-10 13:50:06795 base::DictionaryValue* dictionary_value = nullptr;
[email protected]685de6b12014-01-09 12:25:05796 bool converted_to_dictionary =
797 debug_info_value->GetAsDictionary(&dictionary_value);
798 DCHECK(converted_to_dictionary);
[email protected]d12aa932014-08-01 13:10:38799 for (base::DictionaryValue::Iterator it(*dictionary_value); !it.IsAtEnd();
800 it.Advance()) {
estade7bc801fb2015-05-07 01:53:08801 state->SetValue(it.key().data(), it.value().CreateDeepCopy());
[email protected]d12aa932014-08-01 13:10:38802 }
[email protected]685de6b12014-01-09 12:25:05803 } else {
804 NOTREACHED();
805 }
[email protected]9f3be432013-12-03 03:53:22806 }
[email protected]8c5690222013-02-15 17:36:43807}
808
[email protected]cdf5b952013-05-15 15:39:29809size_t LayerImpl::GPUMemoryUsageInBytes() const { return 0; }
810
[email protected]5e5648a2013-11-18 00:39:33811void LayerImpl::RunMicroBenchmark(MicroBenchmarkImpl* benchmark) {
812 benchmark->RunOnLayer(this);
813}
[email protected]749cbc62014-07-10 01:06:35814
ajumad9432e32015-11-30 19:43:44815gfx::Transform LayerImpl::DrawTransform() const {
weiliangc15346d2c2016-02-19 01:38:49816 // Only drawn layers have up-to-date draw properties.
ajuma651848a2017-05-01 21:23:45817 if (!contributes_to_drawn_render_surface()) {
wkorman5a126a52017-01-06 18:41:13818 return draw_property_utils::DrawTransform(this, GetTransformTree(),
819 GetEffectTree());
ajumad9432e32015-11-30 19:43:44820 }
821
822 return draw_properties().target_space_transform;
823}
824
ajumab6aa1c62015-12-01 21:01:10825gfx::Transform LayerImpl::ScreenSpaceTransform() const {
weiliangc15346d2c2016-02-19 01:38:49826 // Only drawn layers have up-to-date draw properties.
ajuma651848a2017-05-01 21:23:45827 if (!contributes_to_drawn_render_surface()) {
wkorman5a126a52017-01-06 18:41:13828 return draw_property_utils::ScreenSpaceTransform(this, GetTransformTree());
ajumab6aa1c62015-12-01 21:01:10829 }
830
831 return draw_properties().screen_space_transform;
832}
833
sunxd5a7a4032016-06-01 18:49:22834bool LayerImpl::CanUseLCDText() const {
835 if (layer_tree_impl()->settings().layers_always_allowed_lcd_text)
836 return true;
837 if (!layer_tree_impl()->settings().can_use_lcd_text)
838 return false;
839 if (!contents_opaque())
840 return false;
841
wkorman5a126a52017-01-06 18:41:13842 if (GetEffectTree().Node(effect_tree_index())->screen_space_opacity != 1.f)
sunxd5a7a4032016-06-01 18:49:22843 return false;
wkorman5a126a52017-01-06 18:41:13844 if (!GetTransformTree()
845 .Node(transform_tree_index())
trchendba8b1502016-07-08 09:47:01846 ->node_and_ancestors_have_only_integer_translation)
sunxd5a7a4032016-06-01 18:49:22847 return false;
848 if (static_cast<int>(offset_to_transform_parent().x()) !=
849 offset_to_transform_parent().x())
850 return false;
851 if (static_cast<int>(offset_to_transform_parent().y()) !=
852 offset_to_transform_parent().y())
853 return false;
854 return true;
855}
856
wkormanf09921d2017-01-07 01:01:20857int LayerImpl::GetSortingContextId() const {
wkorman52602dd2017-01-10 03:14:47858 return GetTransformTree().Node(transform_tree_index())->sorting_context_id;
wkormanf09921d2017-01-07 01:01:20859}
860
chrishtrc41aca7b2016-03-18 15:44:29861Region LayerImpl::GetInvalidationRegionForDebugging() {
daplatz350219e2015-03-04 19:04:41862 return Region(update_rect_);
863}
864
vmpstrd46a7ac2015-03-18 01:11:12865gfx::Rect LayerImpl::GetEnclosingRectInTargetSpace() const {
ajumad9432e32015-11-30 19:43:44866 return MathUtil::MapEnclosingClippedRect(DrawTransform(),
867 gfx::Rect(bounds()));
vmpstrd46a7ac2015-03-18 01:11:12868}
869
870gfx::Rect LayerImpl::GetScaledEnclosingRectInTargetSpace(float scale) const {
ajumad9432e32015-11-30 19:43:44871 gfx::Transform scaled_draw_transform = DrawTransform();
vmpstrd46a7ac2015-03-18 01:11:12872 scaled_draw_transform.Scale(SK_MScalar1 / scale, SK_MScalar1 / scale);
danakjddaec912015-09-25 19:38:40873 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize(bounds(), scale);
vmpstrd46a7ac2015-03-18 01:11:12874 return MathUtil::MapEnclosingClippedRect(scaled_draw_transform,
Dana Jansensc46d3742015-06-18 01:33:14875 gfx::Rect(scaled_bounds));
vmpstrd46a7ac2015-03-18 01:11:12876}
877
weiliangc189c1a12016-04-11 16:16:25878RenderSurfaceImpl* LayerImpl::render_target() {
ajuma6b96f4cc42017-02-23 14:07:12879 return GetEffectTree().GetRenderSurface(render_target_effect_tree_index());
weiliangc189c1a12016-04-11 16:16:25880}
881
882const RenderSurfaceImpl* LayerImpl::render_target() const {
ajuma6b96f4cc42017-02-23 14:07:12883 return GetEffectTree().GetRenderSurface(render_target_effect_tree_index());
weiliangc189c1a12016-04-11 16:16:25884}
885
enne637715732015-07-07 02:05:26886float LayerImpl::GetIdealContentsScale() const {
887 float page_scale = IsAffectedByPageScale()
888 ? layer_tree_impl()->current_page_scale_factor()
889 : 1.f;
890 float device_scale = layer_tree_impl()->device_scale_factor();
891
892 float default_scale = page_scale * device_scale;
893 if (!layer_tree_impl()
894 ->settings()
895 .layer_transforms_should_scale_layer_contents) {
896 return default_scale;
897 }
898
vmpstrdc5e1af2017-05-15 19:59:52899 const auto& transform = ScreenSpaceTransform();
900 if (transform.HasPerspective()) {
901 float scale = MathUtil::ComputeApproximateMaxScale(transform);
Vladimir Levin4b44a052017-08-08 19:29:07902
903 const int kMaxTilesToCoverLayerDimension = 5;
904 // Cap the scale in a way that it should be covered by at most
905 // |kMaxTilesToCoverLayerDimension|^2 default tile sizes. If this is left
906 // uncapped, then we can fairly easily use too much memory (or too many
907 // tiles). See crbug.com/752382 for an example of such a page. Note that
908 // because this is an approximation anyway, it's fine to use a smaller scale
909 // that desired. On top of this, the layer has a perspective transform so
910 // technically it could all be within the viewport, so it's important for us
911 // to have a reasonable scale here. The scale we use would also be at least
912 // |default_scale|, as checked below.
913 float scale_cap = std::min(
914 (layer_tree_impl()->settings().default_tile_size.width() - 2) *
915 kMaxTilesToCoverLayerDimension /
916 static_cast<float>(bounds().width()),
917 (layer_tree_impl()->settings().default_tile_size.height() - 2) *
918 kMaxTilesToCoverLayerDimension /
919 static_cast<float>(bounds().height()));
920 scale = std::min(scale, scale_cap);
921
vmpstrdc5e1af2017-05-15 19:59:52922 // Since we're approximating the scale anyway, round it to the nearest
923 // integer to prevent jitter when animating the transform.
924 scale = std::round(scale);
Vladimir Levin4b44a052017-08-08 19:29:07925
vmpstrdc5e1af2017-05-15 19:59:52926 // Don't let the scale fall below the default scale.
927 return std::max(scale, default_scale);
928 }
929
930 gfx::Vector2dF transform_scales =
931 MathUtil::ComputeTransform2dScaleComponents(transform, default_scale);
enne637715732015-07-07 02:05:26932 return std::max(transform_scales.x(), transform_scales.y());
933}
934
wkorman5a126a52017-01-06 18:41:13935PropertyTrees* LayerImpl::GetPropertyTrees() const {
936 return layer_tree_impl_->property_trees();
937}
938
weiliangc42c074f2017-03-17 19:28:30939ClipTree& LayerImpl::GetClipTree() const {
940 return GetPropertyTrees()->clip_tree;
941}
942
wkorman5a126a52017-01-06 18:41:13943EffectTree& LayerImpl::GetEffectTree() const {
944 return GetPropertyTrees()->effect_tree;
945}
946
947ScrollTree& LayerImpl::GetScrollTree() const {
948 return GetPropertyTrees()->scroll_tree;
949}
950
951TransformTree& LayerImpl::GetTransformTree() const {
952 return GetPropertyTrees()->transform_tree;
953}
954
Khushalb5b55e3f2017-07-19 00:24:31955void LayerImpl::EnsureValidPropertyTreeIndices() const {
956 DCHECK(GetTransformTree().Node(transform_tree_index()));
957 DCHECK(GetEffectTree().Node(effect_tree_index()));
958 DCHECK(GetClipTree().Node(clip_tree_index()));
959 DCHECK(GetScrollTree().Node(scroll_tree_index()));
khushalsagar58670682017-06-02 22:11:04960}
961
[email protected]bc5e77c2012-11-05 20:00:49962} // namespace cc