Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Side by Side Diff: cc/layers/layer_impl.cc

Issue 1736073002: cc: Move SyncedScrollOffset to scroll tree (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add gyp dependency Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/layers/layer_impl.h" 5 #include "cc/layers/layer_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <utility> 10 #include <utility>
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 LayerImpl::LayerImpl(LayerTreeImpl* tree_impl, 49 LayerImpl::LayerImpl(LayerTreeImpl* tree_impl,
50 int id, 50 int id,
51 scoped_refptr<SyncedScrollOffset> scroll_offset) 51 scoped_refptr<SyncedScrollOffset> scroll_offset)
52 : parent_(nullptr), 52 : parent_(nullptr),
53 scroll_parent_(nullptr), 53 scroll_parent_(nullptr),
54 clip_parent_(nullptr), 54 clip_parent_(nullptr),
55 mask_layer_id_(-1), 55 mask_layer_id_(-1),
56 replica_layer_id_(-1), 56 replica_layer_id_(-1),
57 layer_id_(id), 57 layer_id_(id),
58 layer_tree_impl_(tree_impl), 58 layer_tree_impl_(tree_impl),
59 scroll_offset_(scroll_offset),
60 scroll_clip_layer_id_(Layer::INVALID_ID), 59 scroll_clip_layer_id_(Layer::INVALID_ID),
61 main_thread_scrolling_reasons_( 60 main_thread_scrolling_reasons_(
62 MainThreadScrollingReason::kNotScrollingOnMain), 61 MainThreadScrollingReason::kNotScrollingOnMain),
63 user_scrollable_horizontal_(true), 62 user_scrollable_horizontal_(true),
64 user_scrollable_vertical_(true), 63 user_scrollable_vertical_(true),
65 double_sided_(true), 64 double_sided_(true),
66 should_flatten_transform_(true), 65 should_flatten_transform_(true),
67 should_flatten_transform_from_property_tree_(false), 66 should_flatten_transform_from_property_tree_(false),
68 layer_property_changed_(false), 67 layer_property_changed_(false),
69 masks_to_bounds_(false), 68 masks_to_bounds_(false),
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 480
482 bool LayerImpl::scrollable() const { 481 bool LayerImpl::scrollable() const {
483 return scroll_clip_layer_id_ != Layer::INVALID_ID; 482 return scroll_clip_layer_id_ != Layer::INVALID_ID;
484 } 483 }
485 484
486 bool LayerImpl::user_scrollable(ScrollbarOrientation orientation) const { 485 bool LayerImpl::user_scrollable(ScrollbarOrientation orientation) const {
487 return (orientation == HORIZONTAL) ? user_scrollable_horizontal_ 486 return (orientation == HORIZONTAL) ? user_scrollable_horizontal_
488 : user_scrollable_vertical_; 487 : user_scrollable_vertical_;
489 } 488 }
490 489
491 void LayerImpl::ApplySentScrollDeltasFromAbortedCommit() {
492 DCHECK(layer_tree_impl()->IsActiveTree());
493 scroll_offset_->AbortCommit();
494 }
495
496 skia::RefPtr<SkPicture> LayerImpl::GetPicture() { 490 skia::RefPtr<SkPicture> LayerImpl::GetPicture() {
497 return skia::RefPtr<SkPicture>(); 491 return skia::RefPtr<SkPicture>();
498 } 492 }
499 493
500 scoped_ptr<LayerImpl> LayerImpl::CreateLayerImpl(LayerTreeImpl* tree_impl) { 494 scoped_ptr<LayerImpl> LayerImpl::CreateLayerImpl(LayerTreeImpl* tree_impl) {
501 return LayerImpl::Create(tree_impl, layer_id_, scroll_offset_); 495 return LayerImpl::Create(tree_impl, layer_id_);
502 } 496 }
503 497
504 void LayerImpl::PushPropertiesTo(LayerImpl* layer) { 498 void LayerImpl::PushPropertiesTo(LayerImpl* layer) {
505 layer->SetTransformOrigin(transform_origin_); 499 layer->SetTransformOrigin(transform_origin_);
506 layer->SetBackgroundColor(background_color_); 500 layer->SetBackgroundColor(background_color_);
507 layer->SetBounds(bounds_); 501 layer->SetBounds(bounds_);
508 layer->SetDoubleSided(double_sided_); 502 layer->SetDoubleSided(double_sided_);
509 layer->SetDrawsContent(DrawsContent()); 503 layer->SetDrawsContent(DrawsContent());
510 layer->SetHideLayerAndSubtree(hide_layer_and_subtree_); 504 layer->SetHideLayerAndSubtree(hide_layer_and_subtree_);
511 // If whether layer has render surface changes, we need to update draw 505 // If whether layer has render surface changes, we need to update draw
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 layer->NoteLayerPropertyChanged(); 537 layer->NoteLayerPropertyChanged();
544 538
545 layer->SetScrollClipLayer(scroll_clip_layer_id_); 539 layer->SetScrollClipLayer(scroll_clip_layer_id_);
546 layer->SetElementId(element_id_); 540 layer->SetElementId(element_id_);
547 layer->SetMutableProperties(mutable_properties_); 541 layer->SetMutableProperties(mutable_properties_);
548 layer->set_user_scrollable_horizontal(user_scrollable_horizontal_); 542 layer->set_user_scrollable_horizontal(user_scrollable_horizontal_);
549 layer->set_user_scrollable_vertical(user_scrollable_vertical_); 543 layer->set_user_scrollable_vertical(user_scrollable_vertical_);
550 544
551 layer->SetScrollCompensationAdjustment(scroll_compensation_adjustment_); 545 layer->SetScrollCompensationAdjustment(scroll_compensation_adjustment_);
552 546
553 layer->PushScrollOffset(nullptr);
554
555 layer->Set3dSortingContextId(sorting_context_id_); 547 layer->Set3dSortingContextId(sorting_context_id_);
556 layer->SetNumDescendantsThatDrawContent(num_descendants_that_draw_content_); 548 layer->SetNumDescendantsThatDrawContent(num_descendants_that_draw_content_);
557 549
558 layer->SetTransformTreeIndex(transform_tree_index_); 550 layer->SetTransformTreeIndex(transform_tree_index_);
559 layer->SetClipTreeIndex(clip_tree_index_); 551 layer->SetClipTreeIndex(clip_tree_index_);
560 layer->SetEffectTreeIndex(effect_tree_index_); 552 layer->SetEffectTreeIndex(effect_tree_index_);
561 layer->SetScrollTreeIndex(scroll_tree_index_); 553 layer->SetScrollTreeIndex(scroll_tree_index_);
562 layer->set_offset_to_transform_parent(offset_to_transform_parent_); 554 layer->set_offset_to_transform_parent(offset_to_transform_parent_);
563 555
564 LayerImpl* scroll_parent = nullptr; 556 LayerImpl* scroll_parent = nullptr;
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
887 if (node->owner_id != id() || node->data.opacity == effective_opacity) 879 if (node->owner_id != id() || node->data.opacity == effective_opacity)
888 return; 880 return;
889 node->data.opacity = effective_opacity; 881 node->data.opacity = effective_opacity;
890 node->data.opacity_changed = true; 882 node->data.opacity_changed = true;
891 layer_tree_impl()->property_trees()->changed = true; 883 layer_tree_impl()->property_trees()->changed = true;
892 effect_tree.set_needs_update(true); 884 effect_tree.set_needs_update(true);
893 } 885 }
894 } 886 }
895 887
896 void LayerImpl::UpdatePropertyTreeForScrollingAndAnimationIfNeeded() { 888 void LayerImpl::UpdatePropertyTreeForScrollingAndAnimationIfNeeded() {
897 if (scrollable()) 889 // if (scrollable())
898 UpdatePropertyTreeScrollOffset(); 890 // UpdatePropertyTreeScrollOffset();
899 891
900 if (HasAnyAnimationTargetingProperty(TargetProperty::OPACITY)) 892 if (HasAnyAnimationTargetingProperty(TargetProperty::OPACITY))
901 UpdatePropertyTreeOpacity(); 893 UpdatePropertyTreeOpacity();
902 894
903 if (HasAnyAnimationTargetingProperty(TargetProperty::TRANSFORM)) { 895 if (HasAnyAnimationTargetingProperty(TargetProperty::TRANSFORM)) {
904 UpdatePropertyTreeTransform(); 896 UpdatePropertyTreeTransform();
905 UpdatePropertyTreeTransformIsAnimated( 897 UpdatePropertyTreeTransformIsAnimated(
906 HasPotentiallyRunningTransformAnimation()); 898 HasPotentiallyRunningTransformAnimation());
907 } 899 }
908 } 900 }
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
1271 frame_timing_requests_ = requests; 1263 frame_timing_requests_ = requests;
1272 frame_timing_requests_dirty_ = true; 1264 frame_timing_requests_dirty_ = true;
1273 SetNeedsPushProperties(); 1265 SetNeedsPushProperties();
1274 } 1266 }
1275 1267
1276 void LayerImpl::GatherFrameTimingRequestIds(std::vector<int64_t>* request_ids) { 1268 void LayerImpl::GatherFrameTimingRequestIds(std::vector<int64_t>* request_ids) {
1277 for (const auto& request : frame_timing_requests_) 1269 for (const auto& request : frame_timing_requests_)
1278 request_ids->push_back(request.id()); 1270 request_ids->push_back(request.id());
1279 } 1271 }
1280 1272
1273 const SyncedScrollOffset* LayerImpl::synced_scroll_offset() const {
1274 return layer_tree_impl()->property_trees()->scroll_tree.synced_scroll_offset(
1275 id());
1276 }
1277
1278 SyncedScrollOffset* LayerImpl::synced_scroll_offset() {
1279 return layer_tree_impl()->property_trees()->scroll_tree.synced_scroll_offset(
1280 id());
1281 }
1282
1281 void LayerImpl::SetTransform(const gfx::Transform& transform) { 1283 void LayerImpl::SetTransform(const gfx::Transform& transform) {
1282 if (transform_ == transform) 1284 if (transform_ == transform)
1283 return; 1285 return;
1284 1286
1285 transform_ = transform; 1287 transform_ = transform;
1286 transform_is_invertible_ = transform_.IsInvertible(); 1288 transform_is_invertible_ = transform_.IsInvertible();
1287 NoteLayerPropertyChangedForSubtree(); 1289 NoteLayerPropertyChangedForSubtree();
1288 } 1290 }
1289 1291
1290 void LayerImpl::SetTransformAndInvertibility(const gfx::Transform& transform, 1292 void LayerImpl::SetTransformAndInvertibility(const gfx::Transform& transform,
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
1416 update_rect_ = update_rect; 1418 update_rect_ = update_rect;
1417 SetNeedsPushProperties(); 1419 SetNeedsPushProperties();
1418 } 1420 }
1419 1421
1420 void LayerImpl::AddDamageRect(const gfx::Rect& damage_rect) { 1422 void LayerImpl::AddDamageRect(const gfx::Rect& damage_rect) {
1421 damage_rect_.Union(damage_rect); 1423 damage_rect_.Union(damage_rect);
1422 } 1424 }
1423 1425
1424 void LayerImpl::SetCurrentScrollOffset(const gfx::ScrollOffset& scroll_offset) { 1426 void LayerImpl::SetCurrentScrollOffset(const gfx::ScrollOffset& scroll_offset) {
1425 DCHECK(IsActive()); 1427 DCHECK(IsActive());
1426 if (scroll_offset_->SetCurrent(scroll_offset)) 1428 if (synced_scroll_offset()->SetCurrent(scroll_offset))
1427 DidUpdateScrollOffset(); 1429 DidUpdateScrollOffset();
1428 } 1430 }
1429 1431
1430 void LayerImpl::PushScrollOffsetFromMainThread(
1431 const gfx::ScrollOffset& scroll_offset) {
1432 PushScrollOffset(&scroll_offset);
1433 }
1434
1435 void LayerImpl::PushScrollOffsetFromMainThreadAndClobberActiveValue(
1436 const gfx::ScrollOffset& scroll_offset) {
1437 scroll_offset_->set_clobber_active_value();
1438 PushScrollOffset(&scroll_offset);
1439 }
1440
1441 gfx::ScrollOffset LayerImpl::PullDeltaForMainThread() {
1442 // TODO(miletus): Remove all this temporary flooring machinery when
1443 // Blink fully supports fractional scrolls.
1444 gfx::ScrollOffset current_offset = CurrentScrollOffset();
1445 gfx::ScrollOffset current_delta = IsActive()
1446 ? scroll_offset_->Delta()
1447 : scroll_offset_->PendingDelta().get();
1448 gfx::ScrollOffset floored_delta(floor(current_delta.x()),
1449 floor(current_delta.y()));
1450 gfx::ScrollOffset diff_delta = floored_delta - current_delta;
1451 gfx::ScrollOffset tmp_offset = current_offset + diff_delta;
1452 scroll_offset_->SetCurrent(tmp_offset);
1453 gfx::ScrollOffset delta = scroll_offset_->PullDeltaForMainThread();
1454 scroll_offset_->SetCurrent(current_offset);
1455 return delta;
1456 }
1457
1458 gfx::ScrollOffset LayerImpl::CurrentScrollOffset() const { 1432 gfx::ScrollOffset LayerImpl::CurrentScrollOffset() const {
1459 return scroll_offset_->Current(IsActive()); 1433 return synced_scroll_offset()->Current(IsActive());
1460 } 1434 }
1461 1435
1462 gfx::Vector2dF LayerImpl::ScrollDelta() const { 1436 gfx::Vector2dF LayerImpl::ScrollDelta() const {
1463 if (IsActive()) 1437 if (IsActive())
1464 return gfx::Vector2dF(scroll_offset_->Delta().x(), 1438 return gfx::Vector2dF(synced_scroll_offset()->Delta().x(),
1465 scroll_offset_->Delta().y()); 1439 synced_scroll_offset()->Delta().y());
1466 else 1440 else
1467 return gfx::Vector2dF(scroll_offset_->PendingDelta().get().x(), 1441 return gfx::Vector2dF(synced_scroll_offset()->PendingDelta().get().x(),
1468 scroll_offset_->PendingDelta().get().y()); 1442 synced_scroll_offset()->PendingDelta().get().y());
1469 } 1443 }
1470 1444
1471 void LayerImpl::SetScrollDelta(const gfx::Vector2dF& delta) { 1445 void LayerImpl::SetScrollDelta(const gfx::Vector2dF& delta) {
1472 DCHECK(IsActive()); 1446 DCHECK(IsActive());
1473 DCHECK(scrollable() || delta.IsZero()); 1447 DCHECK(scrollable() || delta.IsZero());
1474 SetCurrentScrollOffset(scroll_offset_->ActiveBase() + 1448 SetCurrentScrollOffset(synced_scroll_offset()->ActiveBase() +
1475 gfx::ScrollOffset(delta)); 1449 gfx::ScrollOffset(delta));
1476 } 1450 }
1477 1451
1478 gfx::ScrollOffset LayerImpl::BaseScrollOffset() const { 1452 gfx::ScrollOffset LayerImpl::BaseScrollOffset() const {
1479 if (IsActive()) 1453 if (IsActive())
1480 return scroll_offset_->ActiveBase(); 1454 return synced_scroll_offset()->ActiveBase();
1481 else 1455 else
1482 return scroll_offset_->PendingBase(); 1456 return synced_scroll_offset()->PendingBase();
1483 } 1457 }
1484 1458
1485 void LayerImpl::PushScrollOffset(const gfx::ScrollOffset* scroll_offset) { 1459 void LayerImpl::PushScrollOffsetFromMainThread(
1486 DCHECK(scroll_offset || IsActive()); 1460 const gfx::ScrollOffset& scroll_offset) {
1461 DCHECK(&scroll_offset || IsActive());
1487 bool changed = false; 1462 bool changed = false;
1488 if (scroll_offset) { 1463 if (&scroll_offset) {
1489 DCHECK(!IsActive() || !layer_tree_impl_->FindPendingTreeLayerById(id())); 1464 DCHECK(!IsActive() || !layer_tree_impl_->FindPendingTreeLayerById(id()));
1490 changed |= scroll_offset_->PushFromMainThread(*scroll_offset); 1465 changed |= synced_scroll_offset()->PushFromMainThread(scroll_offset);
1491 } 1466 }
1467
1492 if (IsActive()) { 1468 if (IsActive()) {
1493 changed |= scroll_offset_->PushPendingToActive(); 1469 changed |= synced_scroll_offset()->PushPendingToActive();
1494 } 1470 }
1495 1471
1496 if (changed) 1472 if (changed)
1497 DidUpdateScrollOffset(); 1473 DidUpdateScrollOffset();
1498 } 1474 }
1499 1475
1500 void LayerImpl::UpdatePropertyTreeScrollOffset() { 1476 void LayerImpl::UpdatePropertyTreeScrollOffset() {
1501 // TODO(enne): in the future, scrolling should update the scroll tree 1477 // TODO(enne): in the future, scrolling should update the scroll tree
1502 // directly instead of going through layers. 1478 // directly instead of going through layers.
1503 if (transform_tree_index_ != -1) { 1479 if (transform_tree_index_ != -1) {
1504 TransformTree& transform_tree = 1480 TransformTree& transform_tree =
1505 layer_tree_impl()->property_trees()->transform_tree; 1481 layer_tree_impl()->property_trees()->transform_tree;
1482
1506 TransformNode* node = transform_tree.Node(transform_tree_index_); 1483 TransformNode* node = transform_tree.Node(transform_tree_index_);
1507 gfx::ScrollOffset current_offset = scroll_offset_->Current(IsActive()); 1484 gfx::ScrollOffset current_offset =
1485 synced_scroll_offset()->Current(IsActive());
1508 if (node->data.scroll_offset != current_offset) { 1486 if (node->data.scroll_offset != current_offset) {
1509 node->data.scroll_offset = current_offset; 1487 node->data.scroll_offset = current_offset;
1510 node->data.needs_local_transform_update = true; 1488 node->data.needs_local_transform_update = true;
1511 transform_tree.set_needs_update(true); 1489 transform_tree.set_needs_update(true);
1512 } 1490 }
1513 } 1491 }
1514 } 1492 }
1515 1493
1516 void LayerImpl::DidUpdateScrollOffset() { 1494 void LayerImpl::DidUpdateScrollOffset() {
1517 DCHECK(scroll_offset_);
1518
1519 layer_tree_impl()->DidUpdateScrollState(id()); 1495 layer_tree_impl()->DidUpdateScrollState(id());
1520 NoteLayerPropertyChangedForSubtree(); 1496 NoteLayerPropertyChangedForSubtree();
1521
1522 UpdatePropertyTreeScrollOffset(); 1497 UpdatePropertyTreeScrollOffset();
1523 1498
1524 // Inform the pending twin that a property changed. 1499 // Inform the pending twin that a property changed.
1525 if (layer_tree_impl()->IsActiveTree()) { 1500 if (layer_tree_impl()->IsActiveTree()) {
1526 LayerImpl* pending_twin = layer_tree_impl()->FindPendingTreeLayerById(id()); 1501 LayerImpl* pending_twin = layer_tree_impl()->FindPendingTreeLayerById(id());
1527 if (pending_twin) 1502 if (pending_twin)
1528 pending_twin->DidUpdateScrollOffset(); 1503 pending_twin->DidUpdateScrollOffset();
1529 } 1504 }
1530 } 1505 }
1531 1506
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1615 1590
1616 state->SetInteger("draws_content", DrawsContent()); 1591 state->SetInteger("draws_content", DrawsContent());
1617 state->SetInteger("gpu_memory_usage", 1592 state->SetInteger("gpu_memory_usage",
1618 base::saturated_cast<int>(GPUMemoryUsageInBytes())); 1593 base::saturated_cast<int>(GPUMemoryUsageInBytes()));
1619 1594
1620 if (mutable_properties_ != MutableProperty::kNone) { 1595 if (mutable_properties_ != MutableProperty::kNone) {
1621 state->SetInteger("element_id", base::saturated_cast<int>(element_id_)); 1596 state->SetInteger("element_id", base::saturated_cast<int>(element_id_));
1622 state->SetInteger("mutable_properties", mutable_properties_); 1597 state->SetInteger("mutable_properties", mutable_properties_);
1623 } 1598 }
1624 1599
1625 MathUtil::AddToTracedValue( 1600 MathUtil::AddToTracedValue("scroll_offset",
1626 "scroll_offset", scroll_offset_ ? scroll_offset_->Current(IsActive()) 1601 synced_scroll_offset()
1627 : gfx::ScrollOffset(), 1602 ? synced_scroll_offset()->Current(IsActive())
1628 state); 1603 : gfx::ScrollOffset(),
1604 state);
1629 1605
1630 MathUtil::AddToTracedValue("transform_origin", transform_origin_, state); 1606 MathUtil::AddToTracedValue("transform_origin", transform_origin_, state);
1631 1607
1632 bool clipped; 1608 bool clipped;
1633 gfx::QuadF layer_quad = 1609 gfx::QuadF layer_quad =
1634 MathUtil::MapQuad(ScreenSpaceTransform(), 1610 MathUtil::MapQuad(ScreenSpaceTransform(),
1635 gfx::QuadF(gfx::RectF(gfx::Rect(bounds()))), &clipped); 1611 gfx::QuadF(gfx::RectF(gfx::Rect(bounds()))), &clipped);
1636 MathUtil::AddToTracedValue("layer_quad", layer_quad, state); 1612 MathUtil::AddToTracedValue("layer_quad", layer_quad, state);
1637 if (!touch_event_handler_region_.IsEmpty()) { 1613 if (!touch_event_handler_region_.IsEmpty()) {
1638 state->BeginArray("touch_event_handler_region"); 1614 state->BeginArray("touch_event_handler_region");
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
1815 .layer_transforms_should_scale_layer_contents) { 1791 .layer_transforms_should_scale_layer_contents) {
1816 return default_scale; 1792 return default_scale;
1817 } 1793 }
1818 1794
1819 gfx::Vector2dF transform_scales = MathUtil::ComputeTransform2dScaleComponents( 1795 gfx::Vector2dF transform_scales = MathUtil::ComputeTransform2dScaleComponents(
1820 DrawTransform(), default_scale); 1796 DrawTransform(), default_scale);
1821 return std::max(transform_scales.x(), transform_scales.y()); 1797 return std::max(transform_scales.x(), transform_scales.y());
1822 } 1798 }
1823 1799
1824 } // namespace cc 1800 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698