blob: 6e1dfe9bf902e31458c338af814380fa608cd774 [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"
danakjd66b8f552017-10-03 16:29:5327#include "cc/resources/layer_tree_resource_provider.h"
trchendba8b1502016-07-08 09:47:0128#include "cc/trees/clip_node.h"
ajumad9432e32015-11-30 19:43:4429#include "cc/trees/draw_property_utils.h"
trchendba8b1502016-07-08 09:47:0130#include "cc/trees/effect_node.h"
[email protected]3d86dd7a2014-01-24 01:33:1131#include "cc/trees/layer_tree_host_common.h"
[email protected]556fd292013-03-18 08:03:0432#include "cc/trees/layer_tree_impl.h"
33#include "cc/trees/layer_tree_settings.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),
Philip Rogers176756e92017-10-12 22:59:3966 hit_testable_without_draws_content_(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),
primianocb1afb32016-02-29 20:46:0576 debug_info_(nullptr),
vmpstr6e8dd7c2016-06-21 00:59:5877 has_will_change_transform_hint_(false),
David Reveman0d1336342017-09-12 17:05:4078 trilinear_filtering_(false),
bokan169f5ad2016-10-30 16:32:4879 needs_push_properties_(false),
skobes56451775d2017-03-28 18:46:3880 scrollbars_hidden_(false),
jaydasikaaf0dcd172017-05-01 17:37:1781 needs_show_scrollbars_(false),
Chris Harrelsondaececa42017-06-16 20:42:0282 raster_even_if_not_drawn_(false),
83 has_transform_node_(false) {
[email protected]bf691c22013-03-26 21:15:0684 DCHECK_GT(layer_id_, 0);
loyso9556c732016-03-11 07:54:5885
bokane1aab122017-03-09 20:03:5786 DCHECK(layer_tree_impl_);
vollickcb3f6b12016-03-01 23:44:1087 layer_tree_impl_->RegisterLayer(this);
vollickcb3f6b12016-03-01 23:44:1088 layer_tree_impl_->AddToElementMap(this);
vollick9c7f6d02016-01-08 04:36:3889
[email protected]ad0250b2014-01-18 03:24:3490 SetNeedsPushProperties();
[email protected]94f206c12012-08-25 00:09:1491}
92
[email protected]7aba6662013-03-12 10:17:3493LayerImpl::~LayerImpl() {
[email protected]ffbb2212013-06-02 23:47:5994 DCHECK_EQ(DRAW_MODE_NONE, current_draw_mode_);
vollickcb3f6b12016-03-01 23:44:1095 layer_tree_impl_->UnregisterLayer(this);
vollickcb3f6b12016-03-01 23:44:1096 layer_tree_impl_->RemoveFromElementMap(this);
[email protected]f5ad4282014-02-15 14:23:1697 TRACE_EVENT_OBJECT_DELETED_WITH_ID(
[email protected]b4dc36472014-02-26 02:48:2598 TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerImpl", this);
[email protected]94f206c12012-08-25 00:09:1499}
100
vmpstrd6dce2602016-05-18 20:19:04101void LayerImpl::SetHasWillChangeTransformHint(bool has_will_change) {
vmpstrd6dce2602016-05-18 20:19:04102 has_will_change_transform_hint_ = has_will_change;
vmpstrd6dce2602016-05-18 20:19:04103}
104
David Reveman0d1336342017-09-12 17:05:40105void LayerImpl::SetTrilinearFiltering(bool trilinear_filtering) {
106 trilinear_filtering_ = trilinear_filtering;
107}
chrishtrcde557b62016-10-19 19:04:01108
loyso6d6356e2016-11-02 23:41:08109MutatorHost* LayerImpl::GetMutatorHost() const {
110 return layer_tree_impl_ ? layer_tree_impl_->mutator_host() : nullptr;
khushalsagaraf222d92016-07-08 21:19:32111}
112
113ElementListType LayerImpl::GetElementTypeForAnimation() const {
114 return IsActive() ? ElementListType::ACTIVE : ElementListType::PENDING;
115}
116
[email protected]9f3be432013-12-03 03:53:22117void LayerImpl::SetDebugInfo(
danakj60bc3bc2016-04-09 00:24:48118 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> debug_info) {
primianocb1afb32016-02-29 20:46:05119 owned_debug_info_ = std::move(debug_info);
120 debug_info_ = owned_debug_info_.get();
[email protected]ad0250b2014-01-18 03:24:34121 SetNeedsPushProperties();
[email protected]9f3be432013-12-03 03:53:22122}
123
vollick692444f2015-05-20 15:39:14124void LayerImpl::SetTransformTreeIndex(int index) {
125 transform_tree_index_ = index;
vollick692444f2015-05-20 15:39:14126}
127
128void LayerImpl::SetClipTreeIndex(int index) {
129 clip_tree_index_ = index;
vollick692444f2015-05-20 15:39:14130}
131
weiliangc6a52f302015-08-18 16:29:35132void LayerImpl::SetEffectTreeIndex(int index) {
133 effect_tree_index_ = index;
vollick692444f2015-05-20 15:39:14134}
135
sunxd47c2a0e32016-07-25 15:34:10136int LayerImpl::render_target_effect_tree_index() const {
wkorman5a126a52017-01-06 18:41:13137 EffectNode* effect_node = GetEffectTree().Node(effect_tree_index_);
ajuma6b96f4cc42017-02-23 14:07:12138
139 return GetEffectTree().GetRenderSurface(effect_tree_index_)
140 ? effect_node->id
141 : effect_node->target_id;
sunxd47c2a0e32016-07-25 15:34:10142}
143
sunxdea1df782016-01-28 00:12:33144void LayerImpl::SetScrollTreeIndex(int index) {
145 scroll_tree_index_ = index;
sunxdea1df782016-01-28 00:12:33146}
147
yiyix10141eca2017-09-05 20:36:52148void LayerImpl::PopulateSharedQuadState(viz::SharedQuadState* state,
149 bool contents_opaque) const {
sunxdf0866592017-04-21 17:01:57150 state->SetAll(draw_properties_.target_space_transform, gfx::Rect(bounds()),
danakj64767d902015-06-19 00:10:43151 draw_properties_.visible_layer_rect, draw_properties_.clip_rect,
yiyix10141eca2017-09-05 20:36:52152 draw_properties_.is_clipped, contents_opaque,
153 draw_properties_.opacity, SkBlendMode::kSrcOver,
154 GetSortingContextId());
[email protected]94f206c12012-08-25 00:09:14155}
156
yiyix10141eca2017-09-05 20:36:52157void LayerImpl::PopulateScaledSharedQuadState(viz::SharedQuadState* state,
158 float layer_to_content_scale_x,
159 float layer_to_content_scale_y,
160 bool contents_opaque) 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,
yiyix10141eca2017-09-05 20:36:52173 draw_properties().is_clipped, contents_opaque,
174 draw_properties().opacity, SkBlendMode::kSrcOver,
175 GetSortingContextId());
enne467829b2015-02-13 02:39:34176}
177
[email protected]ffbb2212013-06-02 23:47:59178bool LayerImpl::WillDraw(DrawMode draw_mode,
danakjd66b8f552017-10-03 16:29:53179 LayerTreeResourceProvider* resource_provider) {
[email protected]ed511b8d2013-03-25 03:29:29180 // WillDraw/DidDraw must be matched.
[email protected]ffbb2212013-06-02 23:47:59181 DCHECK_NE(DRAW_MODE_NONE, draw_mode);
182 DCHECK_EQ(DRAW_MODE_NONE, current_draw_mode_);
183 current_draw_mode_ = draw_mode;
184 return true;
[email protected]94f206c12012-08-25 00:09:14185}
186
danakjd66b8f552017-10-03 16:29:53187void LayerImpl::DidDraw(LayerTreeResourceProvider* resource_provider) {
[email protected]ffbb2212013-06-02 23:47:59188 DCHECK_NE(DRAW_MODE_NONE, current_draw_mode_);
189 current_draw_mode_ = DRAW_MODE_NONE;
[email protected]94f206c12012-08-25 00:09:14190}
191
reveman5be07ac82017-04-14 01:06:05192bool LayerImpl::ShowDebugBorders(DebugBorderType type) const {
193 return layer_tree_impl()->debug_state().show_debug_borders.test(type);
[email protected]3dce37232012-11-15 01:47:44194}
195
[email protected]7aba6662013-03-12 10:17:34196void LayerImpl::GetDebugBorderProperties(SkColor* color, float* width) const {
chrishtrac41ff92017-03-17 05:07:30197 float device_scale_factor =
198 layer_tree_impl() ? layer_tree_impl()->device_scale_factor() : 1;
199
[email protected]7aba6662013-03-12 10:17:34200 if (draws_content_) {
201 *color = DebugColors::ContentLayerBorderColor();
chrishtrac41ff92017-03-17 05:07:30202 *width = DebugColors::ContentLayerBorderWidth(device_scale_factor);
[email protected]7aba6662013-03-12 10:17:34203 return;
204 }
205
206 if (masks_to_bounds_) {
207 *color = DebugColors::MaskingLayerBorderColor();
chrishtrac41ff92017-03-17 05:07:30208 *width = DebugColors::MaskingLayerBorderWidth(device_scale_factor);
[email protected]7aba6662013-03-12 10:17:34209 return;
210 }
211
212 *color = DebugColors::ContainerLayerBorderColor();
chrishtrac41ff92017-03-17 05:07:30213 *width = DebugColors::ContainerLayerBorderWidth(device_scale_factor);
[email protected]7aba6662013-03-12 10:17:34214}
215
216void LayerImpl::AppendDebugBorderQuad(
danakje5805be2017-09-15 19:24:55217 viz::RenderPass* render_pass,
Vladimir Levin88f611ff2017-09-29 17:54:15218 const gfx::Rect& quad_rect,
Alex Zhangabad2292017-08-23 21:55:19219 const viz::SharedQuadState* shared_quad_state,
[email protected]7aba6662013-03-12 10:17:34220 AppendQuadsData* append_quads_data) const {
[email protected]7aba6662013-03-12 10:17:34221 SkColor color;
222 float width;
223 GetDebugBorderProperties(&color, &width);
Vladimir Levin88f611ff2017-09-29 17:54:15224 AppendDebugBorderQuad(render_pass, quad_rect, shared_quad_state,
Dana Jansensc46d3742015-06-18 01:33:14225 append_quads_data, color, width);
[email protected]bec084292013-05-21 21:31:44226}
227
Alex Zhangabad2292017-08-23 21:55:19228void LayerImpl::AppendDebugBorderQuad(
danakje5805be2017-09-15 19:24:55229 viz::RenderPass* render_pass,
Vladimir Levin88f611ff2017-09-29 17:54:15230 const gfx::Rect& quad_rect,
Alex Zhangabad2292017-08-23 21:55:19231 const viz::SharedQuadState* shared_quad_state,
232 AppendQuadsData* append_quads_data,
233 SkColor color,
234 float width) const {
reveman5be07ac82017-04-14 01:06:05235 if (!ShowDebugBorders(DebugBorderType::LAYER))
[email protected]bec084292013-05-21 21:31:44236 return;
[email protected]7aba6662013-03-12 10:17:34237
[email protected]9bf06c72014-03-07 18:16:24238 gfx::Rect visible_quad_rect(quad_rect);
danakje5805be2017-09-15 19:24:55239 auto* debug_border_quad =
240 render_pass->CreateAndAppendDrawQuad<viz::DebugBorderDrawQuad>();
[email protected]9bf06c72014-03-07 18:16:24241 debug_border_quad->SetNew(
242 shared_quad_state, quad_rect, visible_quad_rect, color, width);
danakj069ac122015-02-12 00:59:22243 if (contents_opaque()) {
244 // When opaque, draw a second inner border that is thicker than the outer
245 // border, but more transparent.
246 static const float kFillOpacity = 0.3f;
247 SkColor fill_color = SkColorSetA(
248 color, static_cast<uint8_t>(SkColorGetA(color) * kFillOpacity));
249 float fill_width = width * 3;
250 gfx::Rect fill_rect = quad_rect;
251 fill_rect.Inset(fill_width / 2.f, fill_width / 2.f);
enneb79d5f142015-04-23 19:59:55252 if (fill_rect.IsEmpty())
253 return;
danakj069ac122015-02-12 00:59:22254 gfx::Rect visible_fill_rect =
255 gfx::IntersectRects(visible_quad_rect, fill_rect);
danakje5805be2017-09-15 19:24:55256 auto* fill_quad =
257 render_pass->CreateAndAppendDrawQuad<viz::DebugBorderDrawQuad>();
danakj069ac122015-02-12 00:59:22258 fill_quad->SetNew(shared_quad_state, fill_rect, visible_fill_rect,
259 fill_color, fill_width);
260 }
[email protected]7aba6662013-03-12 10:17:34261}
262
Fady Samuelc80a4a862017-07-28 10:23:36263void LayerImpl::GetContentsResourceId(viz::ResourceId* resource_id,
ericrk664405a2017-05-04 20:58:37264 gfx::Size* resource_size,
265 gfx::SizeF* resource_uv_size) const {
[email protected]7aba6662013-03-12 10:17:34266 NOTREACHED();
ennef6f3fbba42014-10-16 18:16:49267 *resource_id = 0;
[email protected]7aba6662013-03-12 10:17:34268}
269
[email protected]3244c9132014-01-23 10:39:12270gfx::Vector2dF LayerImpl::ScrollBy(const gfx::Vector2dF& scroll) {
wkorman5a126a52017-01-06 18:41:13271 ScrollTree& scroll_tree = GetScrollTree();
sunxd2668bea62016-03-17 00:49:47272 ScrollNode* scroll_node = scroll_tree.Node(scroll_tree_index());
273 return scroll_tree.ScrollBy(scroll_node, scroll, layer_tree_impl());
[email protected]7aba6662013-03-12 10:17:34274}
275
pdrbbfd8822017-06-27 22:44:52276void LayerImpl::SetScrollable(const gfx::Size& bounds) {
277 if (scrollable_ && scroll_container_bounds_ == bounds)
aeliasa57c40d122015-10-08 00:20:09278 return;
pdrbbfd8822017-06-27 22:44:52279 scrollable_ = true;
280 scroll_container_bounds_ = bounds;
Philip Rogers5e563782017-06-02 01:37:20281
pdrbbfd8822017-06-27 22:44:52282 // Scrollbar positions depend on the bounds.
Philip Rogers5e563782017-06-02 01:37:20283 layer_tree_impl()->SetScrollbarGeometriesNeedUpdate();
pdrbf2f6faf2017-06-06 18:00:40284
pdrbbfd8822017-06-27 22:44:52285 if (layer_tree_impl()->settings().scrollbar_animator ==
286 LayerTreeSettings::AURA_OVERLAY) {
pdr74b07a12017-06-09 17:19:06287 set_needs_show_scrollbars(true);
288 }
pdrbbfd8822017-06-27 22:44:52289
290 NoteLayerPropertyChanged();
[email protected]adeda572014-01-31 00:49:47291}
292
danakj60bc3bc2016-04-09 00:24:48293std::unique_ptr<LayerImpl> LayerImpl::CreateLayerImpl(
294 LayerTreeImpl* tree_impl) {
sunxdc36713a2016-03-03 22:31:10295 return LayerImpl::Create(tree_impl, layer_id_);
[email protected]94f206c12012-08-25 00:09:14296}
297
jaydasika2a1718b2016-10-26 22:58:02298bool LayerImpl::IsSnapped() {
299 return scrollable();
300}
301
[email protected]7aba6662013-03-12 10:17:34302void LayerImpl::PushPropertiesTo(LayerImpl* layer) {
vmpstre2672aa52016-06-20 21:05:06303 DCHECK(layer->IsActive());
304
Walter Korman2f716052017-07-28 04:58:48305 // The element id should be set first because other setters may
306 // depend on it. Referencing element id on a layer is
307 // deprecated. http://crbug.com/709137
pdrfaf2ee222017-04-19 03:11:04308 layer->SetElementId(element_id_);
309
Chris Harrelsondaececa42017-06-16 20:42:02310 layer->has_transform_node_ = has_transform_node_;
vmpstre2672aa52016-06-20 21:05:06311 layer->offset_to_transform_parent_ = offset_to_transform_parent_;
312 layer->main_thread_scrolling_reasons_ = main_thread_scrolling_reasons_;
vmpstre2672aa52016-06-20 21:05:06313 layer->should_flatten_transform_from_property_tree_ =
314 should_flatten_transform_from_property_tree_;
315 layer->masks_to_bounds_ = masks_to_bounds_;
316 layer->contents_opaque_ = contents_opaque_;
sadrul32d10972016-07-30 05:26:21317 layer->may_contain_video_ = may_contain_video_;
vmpstre2672aa52016-06-20 21:05:06318 layer->use_parent_backface_visibility_ = use_parent_backface_visibility_;
vmpstre2672aa52016-06-20 21:05:06319 layer->should_check_backface_visibility_ = should_check_backface_visibility_;
320 layer->draws_content_ = draws_content_;
Philip Rogers176756e92017-10-12 22:59:39321 layer->hit_testable_without_draws_content_ =
322 hit_testable_without_draws_content_;
vmpstre2672aa52016-06-20 21:05:06323 layer->non_fast_scrollable_region_ = non_fast_scrollable_region_;
Hayley Ferrd9ee3a72017-06-16 14:16:09324 layer->touch_action_region_ = touch_action_region_;
vmpstre2672aa52016-06-20 21:05:06325 layer->background_color_ = background_color_;
326 layer->safe_opaque_background_color_ = safe_opaque_background_color_;
vmpstre2672aa52016-06-20 21:05:06327 layer->position_ = position_;
vmpstre2672aa52016-06-20 21:05:06328 layer->transform_tree_index_ = transform_tree_index_;
329 layer->effect_tree_index_ = effect_tree_index_;
330 layer->clip_tree_index_ = clip_tree_index_;
331 layer->scroll_tree_index_ = scroll_tree_index_;
vmpstre2672aa52016-06-20 21:05:06332 layer->has_will_change_transform_hint_ = has_will_change_transform_hint_;
David Reveman0d1336342017-09-12 17:05:40333 layer->trilinear_filtering_ = trilinear_filtering_;
bokan169f5ad2016-10-30 16:32:48334 layer->scrollbars_hidden_ = scrollbars_hidden_;
chaopengfe2cab762017-07-17 15:35:10335 if (needs_show_scrollbars_)
336 layer->needs_show_scrollbars_ = needs_show_scrollbars_;
vmpstre2672aa52016-06-20 21:05:06337
wutaobb1af5a2017-08-16 17:35:35338 if (layer_property_changed_not_from_property_trees_ ||
339 layer_property_changed_from_property_trees_)
vmpstre2672aa52016-06-20 21:05:06340 layer->layer_tree_impl()->set_needs_update_draw_properties();
wutaobb1af5a2017-08-16 17:35:35341 if (layer_property_changed_not_from_property_trees_)
342 layer->layer_property_changed_not_from_property_trees_ = true;
343 if (layer_property_changed_from_property_trees_)
344 layer->layer_property_changed_from_property_trees_ = true;
vmpstre2672aa52016-06-20 21:05:06345
vmpstre2672aa52016-06-20 21:05:06346 layer->SetBounds(bounds_);
pdrbbfd8822017-06-27 22:44:52347 if (scrollable_)
348 layer->SetScrollable(scroll_container_bounds_);
ennee95b1542015-04-20 20:35:50349
[email protected]7aba6662013-03-12 10:17:34350 // If the main thread commits multiple times before the impl thread actually
351 // draws, then damage tracking will become incorrect if we simply clobber the
[email protected]ed511b8d2013-03-25 03:29:29352 // update_rect here. The LayerImpl's update_rect needs to accumulate (i.e.
[email protected]7aba6662013-03-12 10:17:34353 // union) any update changes that have occurred on the main thread.
354 update_rect_.Union(layer->update_rect());
[email protected]ad0250b2014-01-18 03:24:34355 layer->SetUpdateRect(update_rect_);
[email protected]7aba6662013-03-12 10:17:34356
primianocb1afb32016-02-29 20:46:05357 if (owned_debug_info_)
358 layer->SetDebugInfo(std::move(owned_debug_info_));
[email protected]7aba6662013-03-12 10:17:34359
[email protected]7aba6662013-03-12 10:17:34360 // Reset any state that should be cleared for the next update.
skobes56451775d2017-03-28 18:46:38361 needs_show_scrollbars_ = false;
wutaobb1af5a2017-08-16 17:35:35362 layer_property_changed_not_from_property_trees_ = false;
363 layer_property_changed_from_property_trees_ = false;
vmpstr6e8dd7c2016-06-21 00:59:58364 needs_push_properties_ = false;
danakj19f0c9e2014-10-11 03:24:42365 update_rect_ = gfx::Rect();
jaydasikabb0409e52016-03-08 04:05:19366 layer_tree_impl()->RemoveLayerShouldPushProperties(this);
[email protected]caa567d2012-12-20 07:56:16367}
368
sunxdf66237552016-01-06 21:36:37369bool LayerImpl::IsAffectedByPageScale() const {
wkorman5a126a52017-01-06 18:41:13370 TransformTree& transform_tree = GetTransformTree();
sunxdf66237552016-01-06 21:36:37371 return transform_tree.Node(transform_tree_index())
trchendba8b1502016-07-08 09:47:01372 ->in_subtree_of_page_scale_layer;
sunxdf66237552016-01-06 21:36:37373}
374
David Bokanff563332017-08-15 21:19:19375bool LayerImpl::IsResizedByBrowserControls() const {
376 return is_resized_by_browser_controls_;
377}
378
379void LayerImpl::SetIsResizedByBrowserControls(bool resized) {
380 is_resized_by_browser_controls_ = resized;
381}
382
Philip Rogers80890552017-10-12 02:42:19383std::unique_ptr<base::DictionaryValue> LayerImpl::LayerAsJson() {
dcheng6223240a2016-05-31 19:48:01384 std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue);
r.kasibhatlafd17d0e2015-05-17 11:12:07385 result->SetInteger("LayerId", id());
[email protected]7aba6662013-03-12 10:17:34386 result->SetString("LayerType", LayerTypeAsString());
387
Jeremy Roman909d927b2017-08-27 18:34:09388 auto list = std::make_unique<base::ListValue>();
bokancccfde72014-10-08 15:15:22389 list->AppendInteger(bounds().width());
390 list->AppendInteger(bounds().height());
vabrbce355c2017-03-23 18:52:43391 result->Set("Bounds", std::move(list));
[email protected]7aba6662013-03-12 10:17:34392
Jeremy Roman909d927b2017-08-27 18:34:09393 list = std::make_unique<base::ListValue>();
[email protected]7aba6662013-03-12 10:17:34394 list->AppendDouble(position_.x());
395 list->AppendDouble(position_.y());
vabrbce355c2017-03-23 18:52:43396 result->Set("Position", std::move(list));
[email protected]7aba6662013-03-12 10:17:34397
jaydasika10d43fc2016-08-18 04:06:04398 const gfx::Transform& gfx_transform = test_properties()->transform;
[email protected]7aba6662013-03-12 10:17:34399 double transform[16];
400 gfx_transform.matrix().asColMajord(transform);
Jeremy Roman909d927b2017-08-27 18:34:09401 list = std::make_unique<base::ListValue>();
[email protected]7aba6662013-03-12 10:17:34402 for (int i = 0; i < 16; ++i)
403 list->AppendDouble(transform[i]);
vabrbce355c2017-03-23 18:52:43404 result->Set("Transform", std::move(list));
[email protected]7aba6662013-03-12 10:17:34405
406 result->SetBoolean("DrawsContent", draws_content_);
Philip Rogers176756e92017-10-12 22:59:39407 result->SetBoolean("HitTestableWithoutDrawsContent",
408 hit_testable_without_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
Philip Rogers80890552017-10-12 02:42:19422 return result;
423}
424
425std::unique_ptr<base::DictionaryValue> LayerImpl::LayerTreeAsJson() {
426 std::unique_ptr<base::DictionaryValue> result = LayerAsJson();
427
428 auto list = std::make_unique<base::ListValue>();
jaydasikafc66cfb2016-06-10 04:34:22429 for (size_t i = 0; i < test_properties()->children.size(); ++i)
430 list->Append(test_properties()->children[i]->LayerTreeAsJson());
vabrbce355c2017-03-23 18:52:43431 result->Set("Children", std::move(list));
[email protected]7aba6662013-03-12 10:17:34432
433 return result;
[email protected]b9dcf43a2013-01-09 00:15:29434}
435
jaydasikaadfec8e2016-02-17 02:46:11436bool LayerImpl::LayerPropertyChanged() const {
wutaobb1af5a2017-08-16 17:35:35437 return layer_property_changed_not_from_property_trees_ ||
438 LayerPropertyChangedFromPropertyTrees();
439}
440
441bool LayerImpl::LayerPropertyChangedFromPropertyTrees() const {
442 if (layer_property_changed_from_property_trees_ ||
443 GetPropertyTrees()->full_tree_damaged)
jaydasikaadfec8e2016-02-17 02:46:11444 return true;
jaydasikadba9f752016-07-26 20:35:34445 if (transform_tree_index() == TransformTree::kInvalidNodeId)
jaydasika16515f52016-03-01 00:28:35446 return false;
447 TransformNode* transform_node =
wkorman5a126a52017-01-06 18:41:13448 GetTransformTree().Node(transform_tree_index());
trchendba8b1502016-07-08 09:47:01449 if (transform_node && transform_node->transform_changed)
jaydasika16515f52016-03-01 00:28:35450 return true;
jaydasikadba9f752016-07-26 20:35:34451 if (effect_tree_index() == EffectTree::kInvalidNodeId)
jaydasika16515f52016-03-01 00:28:35452 return false;
wkorman5a126a52017-01-06 18:41:13453 EffectNode* effect_node = GetEffectTree().Node(effect_tree_index());
trchendba8b1502016-07-08 09:47:01454 if (effect_node && effect_node->effect_changed)
jaydasikaadfec8e2016-02-17 02:46:11455 return true;
456 return false;
457}
458
wutao36850732017-07-29 20:24:07459bool LayerImpl::LayerPropertyChangedNotFromPropertyTrees() const {
wutaobb1af5a2017-08-16 17:35:35460 return layer_property_changed_not_from_property_trees_;
wutao36850732017-07-29 20:24:07461}
462
[email protected]7aba6662013-03-12 10:17:34463void LayerImpl::NoteLayerPropertyChanged() {
wutaobb1af5a2017-08-16 17:35:35464 layer_property_changed_not_from_property_trees_ = true;
465 layer_tree_impl()->set_needs_update_draw_properties();
466 SetNeedsPushProperties();
467}
468
469void LayerImpl::NoteLayerPropertyChangedFromPropertyTrees() {
470 layer_property_changed_from_property_trees_ = true;
[email protected]7aba6662013-03-12 10:17:34471 layer_tree_impl()->set_needs_update_draw_properties();
[email protected]ad0250b2014-01-18 03:24:34472 SetNeedsPushProperties();
[email protected]48871fc2013-01-23 07:36:51473}
474
danakj1a010682017-09-07 20:08:19475void LayerImpl::ValidateQuadResourcesInternal(viz::DrawQuad* quad) const {
danakjf9427572015-04-24 22:19:02476#if DCHECK_IS_ON()
danakjc0bb5ec12017-11-15 03:49:38477 const LayerTreeResourceProvider* resource_provider =
vmpstr0eca2e82015-06-02 22:14:46478 layer_tree_impl_->resource_provider();
Fady Samuelc80a4a862017-07-28 10:23:36479 for (viz::ResourceId resource_id : quad->resources)
vmpstr0eca2e82015-06-02 22:14:46480 resource_provider->ValidateResource(resource_id);
danakjf9427572015-04-24 22:19:02481#endif
482}
483
[email protected]7aba6662013-03-12 10:17:34484const char* LayerImpl::LayerTypeAsString() const {
[email protected]f256b7fd2013-05-15 01:49:30485 return "cc::LayerImpl";
[email protected]7aba6662013-03-12 10:17:34486}
[email protected]94f206c12012-08-25 00:09:14487
jaydasikaef64f9e42016-03-12 01:08:18488void LayerImpl::ResetChangeTracking() {
wutaobb1af5a2017-08-16 17:35:35489 layer_property_changed_not_from_property_trees_ = false;
490 layer_property_changed_from_property_trees_ = false;
vmpstr6e8dd7c2016-06-21 00:59:58491 needs_push_properties_ = false;
[email protected]7aba6662013-03-12 10:17:34492
danakjd344ab92015-08-28 19:25:51493 update_rect_.SetRect(0, 0, 0, 0);
494 damage_rect_.SetRect(0, 0, 0, 0);
[email protected]7aba6662013-03-12 10:17:34495}
496
jaydasikaebc94282017-04-24 20:34:01497bool LayerImpl::has_copy_requests_in_target_subtree() {
498 return GetEffectTree().Node(effect_tree_index())->subtree_has_copy_request;
sunxded58688e2016-01-11 21:01:02499}
500
[email protected]7aba6662013-03-12 10:17:34501bool LayerImpl::IsActive() const {
502 return layer_tree_impl_->IsActiveTree();
503}
504
bokancccfde72014-10-08 15:15:22505gfx::Size LayerImpl::bounds() const {
pdr23d381fd2017-04-25 21:06:31506 auto viewport_bounds_delta = gfx::ToCeiledVector2d(ViewportBoundsDelta());
507 return gfx::Size(bounds_.width() + viewport_bounds_delta.x(),
508 bounds_.height() + viewport_bounds_delta.y());
bokanef971462014-10-13 22:58:32509}
510
511gfx::SizeF LayerImpl::BoundsForScrolling() const {
pdr23d381fd2017-04-25 21:06:31512 auto viewport_bounds_delta = ViewportBoundsDelta();
513 return gfx::SizeF(bounds_.width() + viewport_bounds_delta.x(),
514 bounds_.height() + viewport_bounds_delta.y());
[email protected]fef74fd2014-02-27 06:28:17515}
516
[email protected]64348ea2014-01-29 22:58:26517void LayerImpl::SetBounds(const gfx::Size& bounds) {
[email protected]7aba6662013-03-12 10:17:34518 if (bounds_ == bounds)
519 return;
520
521 bounds_ = bounds;
[email protected]fef74fd2014-02-27 06:28:17522
pdrbbfd8822017-06-27 22:44:52523 // Scrollbar positions depend on the scrolling layer bounds.
524 if (scrollable())
525 layer_tree_impl()->SetScrollbarGeometriesNeedUpdate();
sunxdcfccd1b32016-02-11 00:54:20526
jaydasikab311c9a2016-03-02 20:49:09527 NoteLayerPropertyChanged();
[email protected]fef74fd2014-02-27 06:28:17528}
529
pdr23d381fd2017-04-25 21:06:31530void LayerImpl::SetViewportBoundsDelta(const gfx::Vector2dF& bounds_delta) {
ajuma6b46da22015-06-25 21:53:02531 DCHECK(IsActive());
[email protected]fef74fd2014-02-27 06:28:17532
pdr23d381fd2017-04-25 21:06:31533 if (bounds_delta == ViewportBoundsDelta())
534 return;
[email protected]7aba6662013-03-12 10:17:34535
wkorman5a126a52017-01-06 18:41:13536 PropertyTrees* property_trees = GetPropertyTrees();
pdr6280cc12017-05-10 23:22:47537 switch (viewport_layer_type_) {
538 case (INNER_VIEWPORT_CONTAINER):
539 property_trees->SetInnerViewportContainerBoundsDelta(bounds_delta);
540 break;
541 case (OUTER_VIEWPORT_CONTAINER):
542 property_trees->SetOuterViewportContainerBoundsDelta(bounds_delta);
543 break;
544 case (INNER_VIEWPORT_SCROLL):
545 property_trees->SetInnerViewportScrollBoundsDelta(bounds_delta);
546 break;
547 case (OUTER_VIEWPORT_SCROLL):
548 // OUTER_VIEWPORT_SCROLL should not have viewport bounds deltas.
549 NOTREACHED();
550 }
ajuma6b46da22015-06-25 21:53:02551
Philip Rogers5e563782017-06-02 01:37:20552 // Viewport scrollbar positions are determined using the viewport bounds
553 // delta.
554 layer_tree_impl()->SetScrollbarGeometriesNeedUpdate();
miletus8bd08a622015-06-16 18:44:52555
556 if (masks_to_bounds()) {
557 // If layer is clipping, then update the clip node using the new bounds.
Chris Harrelson0f075b22017-06-14 23:45:36558 ClipNode* clip_node = property_trees->clip_tree.Node(clip_tree_index());
559 CHECK(clip_node);
560 DCHECK_EQ(clip_node->id, clip_tree_index());
561 clip_node->clip = gfx::RectF(gfx::PointF() + offset_to_transform_parent(),
562 gfx::SizeF(bounds()));
563 property_trees->clip_tree.set_needs_update(true);
564
jaydasikab311c9a2016-03-02 20:49:09565 property_trees->full_tree_damaged = true;
566 layer_tree_impl()->set_needs_update_draw_properties();
miletus8bd08a622015-06-16 18:44:52567 } else {
[email protected]7aba6662013-03-12 10:17:34568 NoteLayerPropertyChanged();
miletus8bd08a622015-06-16 18:44:52569 }
[email protected]7aba6662013-03-12 10:17:34570}
571
pdr23d381fd2017-04-25 21:06:31572gfx::Vector2dF LayerImpl::ViewportBoundsDelta() const {
pdr6280cc12017-05-10 23:22:47573 switch (viewport_layer_type_) {
574 case (INNER_VIEWPORT_CONTAINER):
575 return GetPropertyTrees()->inner_viewport_container_bounds_delta();
576 case (OUTER_VIEWPORT_CONTAINER):
577 return GetPropertyTrees()->outer_viewport_container_bounds_delta();
578 case (INNER_VIEWPORT_SCROLL):
579 return GetPropertyTrees()->inner_viewport_scroll_bounds_delta();
580 default:
581 return gfx::Vector2dF();
582 }
pdr23d381fd2017-04-25 21:06:31583}
584
[email protected]80413d72013-08-30 20:25:33585ScrollbarLayerImplBase* LayerImpl::ToScrollbarLayer() {
kulkarni.a4015690f12014-10-10 13:50:06586 return nullptr;
[email protected]7aba6662013-03-12 10:17:34587}
588
589void LayerImpl::SetDrawsContent(bool draws_content) {
590 if (draws_content_ == draws_content)
591 return;
592
593 draws_content_ = draws_content;
Hayley Ferr7bfdda32017-06-19 18:55:46594 NoteLayerPropertyChanged();
595}
596
Philip Rogers176756e92017-10-12 22:59:39597void LayerImpl::SetHitTestableWithoutDrawsContent(bool should_hit_test) {
598 if (hit_testable_without_draws_content_ == should_hit_test)
Hayley Ferr7bfdda32017-06-19 18:55:46599 return;
600
Philip Rogers176756e92017-10-12 22:59:39601 hit_testable_without_draws_content_ = should_hit_test;
[email protected]7aba6662013-03-12 10:17:34602 NoteLayerPropertyChanged();
603}
604
[email protected]7aba6662013-03-12 10:17:34605void LayerImpl::SetBackgroundColor(SkColor background_color) {
606 if (background_color_ == background_color)
607 return;
608
609 background_color_ = background_color;
610 NoteLayerPropertyChanged();
611}
612
jaydasikac6326bb2016-03-03 03:46:14613void LayerImpl::SetSafeOpaqueBackgroundColor(SkColor background_color) {
jaydasikac6326bb2016-03-03 03:46:14614 safe_opaque_background_color_ = background_color;
jaydasikac6326bb2016-03-03 03:46:14615}
616
[email protected]2c4cbec2013-06-04 21:14:50617SkColor LayerImpl::SafeOpaqueBackgroundColor() const {
jaydasikac6326bb2016-03-03 03:46:14618 if (contents_opaque())
619 return safe_opaque_background_color_;
[email protected]2c4cbec2013-06-04 21:14:50620 SkColor color = background_color();
jaydasikac6326bb2016-03-03 03:46:14621 if (SkColorGetA(color) == 255)
[email protected]2c4cbec2013-06-04 21:14:50622 color = SK_ColorTRANSPARENT;
[email protected]2c4cbec2013-06-04 21:14:50623 return color;
624}
625
[email protected]7aba6662013-03-12 10:17:34626void LayerImpl::SetMasksToBounds(bool masks_to_bounds) {
[email protected]7aba6662013-03-12 10:17:34627 masks_to_bounds_ = masks_to_bounds;
[email protected]7aba6662013-03-12 10:17:34628}
629
630void LayerImpl::SetContentsOpaque(bool opaque) {
[email protected]7aba6662013-03-12 10:17:34631 contents_opaque_ = opaque;
[email protected]7aba6662013-03-12 10:17:34632}
633
jaydasikaab317e02016-06-01 00:53:18634float LayerImpl::Opacity() const {
Chris Harrelson84670c92017-06-06 05:39:06635 if (const EffectNode* node = GetEffectTree().Node(effect_tree_index()))
weiliangc42c074f2017-03-17 19:28:30636 return node->opacity;
637 else
jaydasikaab317e02016-06-01 00:53:18638 return 1.f;
[email protected]7aba6662013-03-12 10:17:34639}
640
jaydasika10d43fc2016-08-18 04:06:04641const gfx::Transform& LayerImpl::Transform() const {
Chris Harrelsondfd95a12017-06-13 17:13:56642 return GetTransformTree().Node(transform_tree_index())->local;
jaydasika10d43fc2016-08-18 04:06:04643}
644
vollickef2ae922016-06-29 17:54:27645void LayerImpl::SetElementId(ElementId element_id) {
vollick933f496e2015-12-08 04:22:05646 if (element_id == element_id_)
647 return;
648
Peter Mayob75ee382017-09-27 22:56:01649 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug"), "LayerImpl::SetElementId",
650 "element", element_id.AsValue().release());
vollick933f496e2015-12-08 04:22:05651
vollickcb3f6b12016-03-01 23:44:10652 layer_tree_impl_->RemoveFromElementMap(this);
vollick933f496e2015-12-08 04:22:05653 element_id_ = element_id;
vollickcb3f6b12016-03-01 23:44:10654 layer_tree_impl_->AddToElementMap(this);
vollickef2ae922016-06-29 17:54:27655
656 SetNeedsPushProperties();
vollick933f496e2015-12-08 04:22:05657}
658
[email protected]14bc5d682014-01-17 07:26:47659void LayerImpl::SetPosition(const gfx::PointF& position) {
[email protected]7aba6662013-03-12 10:17:34660 position_ = position;
[email protected]7aba6662013-03-12 10:17:34661}
662
danakj19f0c9e2014-10-11 03:24:42663void LayerImpl::SetUpdateRect(const gfx::Rect& update_rect) {
[email protected]ad0250b2014-01-18 03:24:34664 update_rect_ = update_rect;
665 SetNeedsPushProperties();
666}
667
danakjd344ab92015-08-28 19:25:51668void LayerImpl::AddDamageRect(const gfx::Rect& damage_rect) {
669 damage_rect_.Union(damage_rect);
[email protected]cfa7fd922014-04-29 11:50:03670}
671
aeliasd0070ba2015-01-31 13:44:49672void LayerImpl::SetCurrentScrollOffset(const gfx::ScrollOffset& scroll_offset) {
673 DCHECK(IsActive());
pdr54d038192017-06-08 22:44:13674 if (GetScrollTree().SetScrollOffset(element_id(), scroll_offset))
675 layer_tree_impl()->DidUpdateScrollOffset(element_id());
boliu7d5dbab2014-10-10 20:05:47676}
677
aeliasd0070ba2015-01-31 13:44:49678gfx::ScrollOffset LayerImpl::CurrentScrollOffset() const {
pdr54d038192017-06-08 22:44:13679 return GetScrollTree().current_scroll_offset(element_id());
[email protected]7aba6662013-03-12 10:17:34680}
681
danakj64767d902015-06-19 00:10:43682SimpleEnclosedRegion LayerImpl::VisibleOpaqueRegion() const {
[email protected]7aba6662013-03-12 10:17:34683 if (contents_opaque())
danakj64767d902015-06-19 00:10:43684 return SimpleEnclosedRegion(visible_layer_rect());
[email protected]d5467eb72014-08-22 01:16:43685 return SimpleEnclosedRegion();
[email protected]7aba6662013-03-12 10:17:34686}
687
[email protected]37349bc2013-06-04 01:31:52688void LayerImpl::DidBeginTracing() {}
689
[email protected]9db24462014-01-14 02:25:50690void LayerImpl::ReleaseResources() {}
[email protected]7aba6662013-03-12 10:17:34691
ericrk7cedb542016-11-02 19:03:44692void LayerImpl::ReleaseTileResources() {}
693
694void LayerImpl::RecreateTileResources() {}
vmpstr9ce5c662015-02-05 23:29:26695
miletusf57925d2014-10-01 19:38:13696gfx::ScrollOffset LayerImpl::MaxScrollOffset() const {
wkorman5a126a52017-01-06 18:41:13697 return GetScrollTree().MaxScrollOffset(scroll_tree_index());
[email protected]adeda572014-01-31 00:49:47698}
699
aeliasd0070ba2015-01-31 13:44:49700gfx::ScrollOffset LayerImpl::ClampScrollOffsetToLimits(
701 gfx::ScrollOffset offset) const {
702 offset.SetToMin(MaxScrollOffset());
703 offset.SetToMax(gfx::ScrollOffset());
704 return offset;
705}
[email protected]adeda572014-01-31 00:49:47706
aeliasd0070ba2015-01-31 13:44:49707gfx::Vector2dF LayerImpl::ClampScrollToMaxScrollOffset() {
708 gfx::ScrollOffset old_offset = CurrentScrollOffset();
709 gfx::ScrollOffset clamped_offset = ClampScrollOffsetToLimits(old_offset);
miletusf57925d2014-10-01 19:38:13710 gfx::Vector2dF delta = clamped_offset.DeltaFrom(old_offset);
[email protected]adeda572014-01-31 00:49:47711 if (!delta.IsZero())
712 ScrollBy(delta);
[email protected]adeda572014-01-31 00:49:47713 return delta;
714}
715
[email protected]ad0250b2014-01-18 03:24:34716void LayerImpl::SetNeedsPushProperties() {
Philip Rogersc8cb2002017-05-31 02:14:36717 // There's no need to push layer properties on the active tree.
718 if (!needs_push_properties_ && !layer_tree_impl()->IsActiveTree()) {
vmpstr6e8dd7c2016-06-21 00:59:58719 needs_push_properties_ = true;
jaydasikabb0409e52016-03-08 04:05:19720 layer_tree_impl()->AddLayerShouldPushProperties(this);
vmpstr6e8dd7c2016-06-21 00:59:58721 }
[email protected]ad0250b2014-01-18 03:24:34722}
723
hendrikwc5e915852015-05-13 01:29:03724void LayerImpl::GetAllPrioritizedTilesForTracing(
725 std::vector<PrioritizedTile>* prioritized_tiles) const {
vmpstrd7de03c2014-08-27 18:11:01726}
727
ssid911e40e2015-02-09 17:55:20728void LayerImpl::AsValueInto(base::trace_event::TracedValue* state) const {
Alex Zhangdd188a12017-08-14 18:48:44729 viz::TracedValue::MakeDictIntoImplicitSnapshotWithCategory(
730 TRACE_DISABLED_BY_DEFAULT("cc.debug"), state, "cc::LayerImpl",
731 LayerTypeAsString(), this);
[email protected]f6742f52013-05-08 23:52:22732 state->SetInteger("layer_id", id());
jungjik.lee50f9c8e2015-01-21 14:06:16733 MathUtil::AddToTracedValue("bounds", bounds_, state);
[email protected]d12aa932014-08-01 13:10:38734
jaydasikaab317e02016-06-01 00:53:18735 state->SetDouble("opacity", Opacity());
danakj38955562014-09-13 02:56:43736
jungjik.lee50f9c8e2015-01-21 14:06:16737 MathUtil::AddToTracedValue("position", position_, state);
[email protected]d12aa932014-08-01 13:10:38738
[email protected]f6742f52013-05-08 23:52:22739 state->SetInteger("draws_content", DrawsContent());
vmpstr91e23092015-06-08 22:24:16740 state->SetInteger("gpu_memory_usage",
741 base::saturated_cast<int>(GPUMemoryUsageInBytes()));
[email protected]d12aa932014-08-01 13:10:38742
vollickef2ae922016-06-29 17:54:27743 if (element_id_)
744 element_id_.AddToTracedValue(state);
745
sunxdc044b11a2016-03-16 16:23:20746 MathUtil::AddToTracedValue("scroll_offset", CurrentScrollOffset(), state);
aeliasd0070ba2015-01-31 13:44:49747
jaydasika10d43fc2016-08-18 04:06:04748 if (!ScreenSpaceTransform().IsIdentity())
749 MathUtil::AddToTracedValue("screen_space_transform", ScreenSpaceTransform(),
750 state);
vollick96b33a52016-03-30 20:11:53751
[email protected]7aba6662013-03-12 10:17:34752 bool clipped;
danakj5e6ff6d2015-09-05 04:43:44753 gfx::QuadF layer_quad =
ajumab6aa1c62015-12-01 21:01:10754 MathUtil::MapQuad(ScreenSpaceTransform(),
danakj5e6ff6d2015-09-05 04:43:44755 gfx::QuadF(gfx::RectF(gfx::Rect(bounds()))), &clipped);
jungjik.lee50f9c8e2015-01-21 14:06:16756 MathUtil::AddToTracedValue("layer_quad", layer_quad, state);
Hayley Ferrd9ee3a72017-06-16 14:16:09757 if (!touch_action_region_.region().IsEmpty()) {
758 state->BeginArray("touch_action_region_region");
759 touch_action_region_.region().AsValueInto(state);
[email protected]d12aa932014-08-01 13:10:38760 state->EndArray();
[email protected]78d78612013-09-12 18:04:04761 }
[email protected]78d78612013-09-12 18:04:04762 if (!non_fast_scrollable_region_.IsEmpty()) {
[email protected]d12aa932014-08-01 13:10:38763 state->BeginArray("non_fast_scrollable_region");
764 non_fast_scrollable_region_.AsValueInto(state);
765 state->EndArray();
[email protected]78d78612013-09-12 18:04:04766 }
[email protected]0e98cdd2013-08-23 00:44:30767
sunxd5a7a4032016-06-01 18:49:22768 state->SetBoolean("can_use_lcd_text", CanUseLCDText());
[email protected]c2a56ff2013-10-14 19:32:51769 state->SetBoolean("contents_opaque", contents_opaque());
[email protected]a1286742013-11-13 17:11:40770
vmpstrd6dce2602016-05-18 20:19:04771 state->SetBoolean("has_will_change_transform_hint",
772 has_will_change_transform_hint());
773
David Reveman0d1336342017-09-12 17:05:40774 state->SetBoolean("trilinear_filtering", trilinear_filtering());
775
primianocb1afb32016-02-29 20:46:05776 if (debug_info_) {
[email protected]9f3be432013-12-03 03:53:22777 std::string str;
778 debug_info_->AppendAsTraceFormat(&str);
779 base::JSONReader json_reader;
danakj60bc3bc2016-04-09 00:24:48780 std::unique_ptr<base::Value> debug_info_value(json_reader.ReadToValue(str));
[email protected]685de6b12014-01-09 12:25:05781
jdoerriee48b26a2017-12-09 14:19:08782 if (debug_info_value->is_dict()) {
kulkarni.a4015690f12014-10-10 13:50:06783 base::DictionaryValue* dictionary_value = nullptr;
[email protected]685de6b12014-01-09 12:25:05784 bool converted_to_dictionary =
785 debug_info_value->GetAsDictionary(&dictionary_value);
786 DCHECK(converted_to_dictionary);
[email protected]d12aa932014-08-01 13:10:38787 for (base::DictionaryValue::Iterator it(*dictionary_value); !it.IsAtEnd();
788 it.Advance()) {
estade7bc801fb2015-05-07 01:53:08789 state->SetValue(it.key().data(), it.value().CreateDeepCopy());
[email protected]d12aa932014-08-01 13:10:38790 }
[email protected]685de6b12014-01-09 12:25:05791 } else {
792 NOTREACHED();
793 }
[email protected]9f3be432013-12-03 03:53:22794 }
[email protected]8c5690222013-02-15 17:36:43795}
796
[email protected]cdf5b952013-05-15 15:39:29797size_t LayerImpl::GPUMemoryUsageInBytes() const { return 0; }
798
[email protected]5e5648a2013-11-18 00:39:33799void LayerImpl::RunMicroBenchmark(MicroBenchmarkImpl* benchmark) {
800 benchmark->RunOnLayer(this);
801}
[email protected]749cbc62014-07-10 01:06:35802
ajumad9432e32015-11-30 19:43:44803gfx::Transform LayerImpl::DrawTransform() const {
weiliangc15346d2c2016-02-19 01:38:49804 // Only drawn layers have up-to-date draw properties.
ajuma651848a2017-05-01 21:23:45805 if (!contributes_to_drawn_render_surface()) {
wkorman5a126a52017-01-06 18:41:13806 return draw_property_utils::DrawTransform(this, GetTransformTree(),
807 GetEffectTree());
ajumad9432e32015-11-30 19:43:44808 }
809
810 return draw_properties().target_space_transform;
811}
812
ajumab6aa1c62015-12-01 21:01:10813gfx::Transform LayerImpl::ScreenSpaceTransform() const {
weiliangc15346d2c2016-02-19 01:38:49814 // Only drawn layers have up-to-date draw properties.
ajuma651848a2017-05-01 21:23:45815 if (!contributes_to_drawn_render_surface()) {
wkorman5a126a52017-01-06 18:41:13816 return draw_property_utils::ScreenSpaceTransform(this, GetTransformTree());
ajumab6aa1c62015-12-01 21:01:10817 }
818
819 return draw_properties().screen_space_transform;
820}
821
sunxd5a7a4032016-06-01 18:49:22822bool LayerImpl::CanUseLCDText() const {
823 if (layer_tree_impl()->settings().layers_always_allowed_lcd_text)
824 return true;
825 if (!layer_tree_impl()->settings().can_use_lcd_text)
826 return false;
827 if (!contents_opaque())
828 return false;
829
wkorman5a126a52017-01-06 18:41:13830 if (GetEffectTree().Node(effect_tree_index())->screen_space_opacity != 1.f)
sunxd5a7a4032016-06-01 18:49:22831 return false;
wkorman5a126a52017-01-06 18:41:13832 if (!GetTransformTree()
833 .Node(transform_tree_index())
trchendba8b1502016-07-08 09:47:01834 ->node_and_ancestors_have_only_integer_translation)
sunxd5a7a4032016-06-01 18:49:22835 return false;
836 if (static_cast<int>(offset_to_transform_parent().x()) !=
837 offset_to_transform_parent().x())
838 return false;
839 if (static_cast<int>(offset_to_transform_parent().y()) !=
840 offset_to_transform_parent().y())
841 return false;
842 return true;
843}
844
wkormanf09921d2017-01-07 01:01:20845int LayerImpl::GetSortingContextId() const {
wkorman52602dd2017-01-10 03:14:47846 return GetTransformTree().Node(transform_tree_index())->sorting_context_id;
wkormanf09921d2017-01-07 01:01:20847}
848
chrishtrc41aca7b2016-03-18 15:44:29849Region LayerImpl::GetInvalidationRegionForDebugging() {
daplatz350219e2015-03-04 19:04:41850 return Region(update_rect_);
851}
852
vmpstrd46a7ac2015-03-18 01:11:12853gfx::Rect LayerImpl::GetEnclosingRectInTargetSpace() const {
ajumad9432e32015-11-30 19:43:44854 return MathUtil::MapEnclosingClippedRect(DrawTransform(),
855 gfx::Rect(bounds()));
vmpstrd46a7ac2015-03-18 01:11:12856}
857
858gfx::Rect LayerImpl::GetScaledEnclosingRectInTargetSpace(float scale) const {
ajumad9432e32015-11-30 19:43:44859 gfx::Transform scaled_draw_transform = DrawTransform();
vmpstrd46a7ac2015-03-18 01:11:12860 scaled_draw_transform.Scale(SK_MScalar1 / scale, SK_MScalar1 / scale);
danakjddaec912015-09-25 19:38:40861 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize(bounds(), scale);
vmpstrd46a7ac2015-03-18 01:11:12862 return MathUtil::MapEnclosingClippedRect(scaled_draw_transform,
Dana Jansensc46d3742015-06-18 01:33:14863 gfx::Rect(scaled_bounds));
vmpstrd46a7ac2015-03-18 01:11:12864}
865
weiliangc189c1a12016-04-11 16:16:25866RenderSurfaceImpl* LayerImpl::render_target() {
ajuma6b96f4cc42017-02-23 14:07:12867 return GetEffectTree().GetRenderSurface(render_target_effect_tree_index());
weiliangc189c1a12016-04-11 16:16:25868}
869
870const RenderSurfaceImpl* LayerImpl::render_target() const {
ajuma6b96f4cc42017-02-23 14:07:12871 return GetEffectTree().GetRenderSurface(render_target_effect_tree_index());
weiliangc189c1a12016-04-11 16:16:25872}
873
enne637715732015-07-07 02:05:26874float LayerImpl::GetIdealContentsScale() const {
875 float page_scale = IsAffectedByPageScale()
876 ? layer_tree_impl()->current_page_scale_factor()
877 : 1.f;
878 float device_scale = layer_tree_impl()->device_scale_factor();
879
880 float default_scale = page_scale * device_scale;
881 if (!layer_tree_impl()
882 ->settings()
883 .layer_transforms_should_scale_layer_contents) {
884 return default_scale;
885 }
886
vmpstrdc5e1af2017-05-15 19:59:52887 const auto& transform = ScreenSpaceTransform();
888 if (transform.HasPerspective()) {
889 float scale = MathUtil::ComputeApproximateMaxScale(transform);
Vladimir Levin4b44a052017-08-08 19:29:07890
891 const int kMaxTilesToCoverLayerDimension = 5;
892 // Cap the scale in a way that it should be covered by at most
893 // |kMaxTilesToCoverLayerDimension|^2 default tile sizes. If this is left
894 // uncapped, then we can fairly easily use too much memory (or too many
895 // tiles). See crbug.com/752382 for an example of such a page. Note that
896 // because this is an approximation anyway, it's fine to use a smaller scale
897 // that desired. On top of this, the layer has a perspective transform so
898 // technically it could all be within the viewport, so it's important for us
899 // to have a reasonable scale here. The scale we use would also be at least
900 // |default_scale|, as checked below.
901 float scale_cap = std::min(
902 (layer_tree_impl()->settings().default_tile_size.width() - 2) *
903 kMaxTilesToCoverLayerDimension /
904 static_cast<float>(bounds().width()),
905 (layer_tree_impl()->settings().default_tile_size.height() - 2) *
906 kMaxTilesToCoverLayerDimension /
907 static_cast<float>(bounds().height()));
908 scale = std::min(scale, scale_cap);
909
vmpstrdc5e1af2017-05-15 19:59:52910 // Since we're approximating the scale anyway, round it to the nearest
911 // integer to prevent jitter when animating the transform.
912 scale = std::round(scale);
Vladimir Levin4b44a052017-08-08 19:29:07913
vmpstrdc5e1af2017-05-15 19:59:52914 // Don't let the scale fall below the default scale.
915 return std::max(scale, default_scale);
916 }
917
918 gfx::Vector2dF transform_scales =
919 MathUtil::ComputeTransform2dScaleComponents(transform, default_scale);
enne637715732015-07-07 02:05:26920 return std::max(transform_scales.x(), transform_scales.y());
921}
922
wkorman5a126a52017-01-06 18:41:13923PropertyTrees* LayerImpl::GetPropertyTrees() const {
924 return layer_tree_impl_->property_trees();
925}
926
weiliangc42c074f2017-03-17 19:28:30927ClipTree& LayerImpl::GetClipTree() const {
928 return GetPropertyTrees()->clip_tree;
929}
930
wkorman5a126a52017-01-06 18:41:13931EffectTree& LayerImpl::GetEffectTree() const {
932 return GetPropertyTrees()->effect_tree;
933}
934
935ScrollTree& LayerImpl::GetScrollTree() const {
936 return GetPropertyTrees()->scroll_tree;
937}
938
939TransformTree& LayerImpl::GetTransformTree() const {
940 return GetPropertyTrees()->transform_tree;
941}
942
Khushalb5b55e3f2017-07-19 00:24:31943void LayerImpl::EnsureValidPropertyTreeIndices() const {
944 DCHECK(GetTransformTree().Node(transform_tree_index()));
945 DCHECK(GetEffectTree().Node(effect_tree_index()));
946 DCHECK(GetClipTree().Node(clip_tree_index()));
947 DCHECK(GetScrollTree().Node(scroll_tree_index()));
khushalsagar58670682017-06-02 22:11:04948}
949
[email protected]bc5e77c2012-11-05 20:00:49950} // namespace cc