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

Side by Side Diff: cc/trees/property_tree.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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 <stddef.h> 5 #include <stddef.h>
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "cc/base/math_util.h" 11 #include "cc/base/math_util.h"
12 #include "cc/input/main_thread_scrolling_reason.h" 12 #include "cc/input/main_thread_scrolling_reason.h"
13 #include "cc/proto/gfx_conversions.h" 13 #include "cc/proto/gfx_conversions.h"
14 #include "cc/proto/property_tree.pb.h" 14 #include "cc/proto/property_tree.pb.h"
15 #include "cc/proto/scroll_offset.pb.h" 15 #include "cc/proto/scroll_offset.pb.h"
16 #include "cc/proto/synced_property_conversions.h"
16 #include "cc/proto/transform.pb.h" 17 #include "cc/proto/transform.pb.h"
17 #include "cc/proto/vector2df.pb.h" 18 #include "cc/proto/vector2df.pb.h"
19 #include "cc/trees/layer_tree_host_common.h"
20 #include "cc/trees/layer_tree_impl.h"
18 #include "cc/trees/property_tree.h" 21 #include "cc/trees/property_tree.h"
19 #include "ui/gfx/geometry/vector2d_conversions.h" 22 #include "ui/gfx/geometry/vector2d_conversions.h"
20 23
21 namespace cc { 24 namespace cc {
22 25
23 template <typename T> 26 template <typename T>
24 bool TreeNode<T>::operator==(const TreeNode<T>& other) const { 27 bool TreeNode<T>::operator==(const TreeNode<T>& other) const {
25 return id == other.id && parent_id == other.parent_id && 28 return id == other.id && parent_id == other.parent_id &&
26 owner_id == other.owner_id && data == other.data; 29 owner_id == other.owner_id && data == other.data;
27 } 30 }
(...skipping 1252 matching lines...) Expand 10 before | Expand all | Expand 10 after
1280 PropertyTree::ToProtobuf(proto); 1283 PropertyTree::ToProtobuf(proto);
1281 } 1284 }
1282 1285
1283 void EffectTree::FromProtobuf(const proto::PropertyTree& proto) { 1286 void EffectTree::FromProtobuf(const proto::PropertyTree& proto) {
1284 DCHECK(proto.has_property_type()); 1287 DCHECK(proto.has_property_type());
1285 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Effect); 1288 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Effect);
1286 1289
1287 PropertyTree::FromProtobuf(proto); 1290 PropertyTree::FromProtobuf(proto);
1288 } 1291 }
1289 1292
1290 ScrollTree::ScrollTree() : currently_scrolling_node_id_(-1) {} 1293 ScrollTree::ScrollTree()
1294 : currently_scrolling_node_id_(-1),
1295 layer_id_to_scroll_offset_map_(ScrollTree::ScrollOffsetMap()) {}
1291 1296
1292 ScrollTree::~ScrollTree() {} 1297 ScrollTree::~ScrollTree() {}
1293 1298
1299 ScrollTree& ScrollTree::operator=(const ScrollTree& from) {
1300 PropertyTree::operator=(from);
1301 currently_scrolling_node_id_ = -1;
1302 return *this;
1303 }
1304
1294 bool ScrollTree::operator==(const ScrollTree& other) const { 1305 bool ScrollTree::operator==(const ScrollTree& other) const {
1295 return PropertyTree::operator==(other) && 1306 const ScrollTree::ScrollOffsetMap& other_scroll_offset_map =
1296 CurrentlyScrollingNode() == other.CurrentlyScrollingNode(); 1307 other.scroll_offset_map();
1308 if (layer_id_to_scroll_offset_map_.size() != other_scroll_offset_map.size())
1309 return false;
1310
1311 for (auto map_entry : layer_id_to_scroll_offset_map_) {
1312 int key = map_entry.first;
1313 if (other_scroll_offset_map.find(key) == other_scroll_offset_map.end() ||
1314 map_entry.second != layer_id_to_scroll_offset_map_.at(key))
1315 return false;
1316 }
1317
1318 bool is_currently_scrolling_node_equal =
1319 (currently_scrolling_node_id_ == -1)
1320 ? (!other.CurrentlyScrollingNode())
1321 : (other.CurrentlyScrollingNode() &&
1322 currently_scrolling_node_id_ ==
1323 other.CurrentlyScrollingNode()->id);
1324
1325 return PropertyTree::operator==(other) && is_currently_scrolling_node_equal;
1297 } 1326 }
1298 1327
1299 void ScrollTree::ToProtobuf(proto::PropertyTree* proto) const { 1328 void ScrollTree::ToProtobuf(proto::PropertyTree* proto) const {
1300 DCHECK(!proto->has_property_type()); 1329 DCHECK(!proto->has_property_type());
1301 proto->set_property_type(proto::PropertyTree::Scroll); 1330 proto->set_property_type(proto::PropertyTree::Scroll);
1302 1331
1303 PropertyTree::ToProtobuf(proto); 1332 PropertyTree::ToProtobuf(proto);
1304 proto::ScrollTreeData* data = proto->mutable_scroll_tree_data(); 1333 proto::ScrollTreeData* data = proto->mutable_scroll_tree_data();
1305 1334
1306 data->set_currently_scrolling_node_id(currently_scrolling_node_id_); 1335 data->set_currently_scrolling_node_id(currently_scrolling_node_id_);
1336 for (auto i : layer_id_to_scroll_offset_map_) {
1337 data->add_layer_id_to_scroll_offset_map();
1338 proto::ScrollOffsetMapEntry* entry =
1339 data->mutable_layer_id_to_scroll_offset_map(
1340 data->layer_id_to_scroll_offset_map_size() - 1);
1341 entry->set_layer_id(i.first);
1342 SyncedScrollOffsetToProto(*i.second.get(), entry->mutable_scroll_offset());
1343 }
1307 } 1344 }
1308 1345
1309 void ScrollTree::FromProtobuf(const proto::PropertyTree& proto) { 1346 void ScrollTree::FromProtobuf(const proto::PropertyTree& proto) {
1310 DCHECK(proto.has_property_type()); 1347 DCHECK(proto.has_property_type());
1311 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll); 1348 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll);
1312 1349
1313 PropertyTree::FromProtobuf(proto); 1350 PropertyTree::FromProtobuf(proto);
1314 const proto::ScrollTreeData& data = proto.scroll_tree_data(); 1351 const proto::ScrollTreeData& data = proto.scroll_tree_data();
1315 1352
1316 currently_scrolling_node_id_ = data.currently_scrolling_node_id(); 1353 currently_scrolling_node_id_ = data.currently_scrolling_node_id();
1354
1355 for (int i = 0; i < data.layer_id_to_scroll_offset_map_size(); ++i) {
1356 const proto::ScrollOffsetMapEntry entry =
1357 data.layer_id_to_scroll_offset_map(i);
1358 layer_id_to_scroll_offset_map_[entry.layer_id()] = new SyncedScrollOffset();
1359 ProtoToSyncedScrollOffset(
1360 entry.scroll_offset(),
1361 layer_id_to_scroll_offset_map_[entry.layer_id()].get());
1362 }
1363 }
1364
1365 void ScrollTree::clear() {
1366 PropertyTree<ScrollNode>::clear();
1367
1368 if (property_trees()->is_main_thread) {
1369 currently_scrolling_node_id_ = -1;
1370 layer_id_to_scroll_offset_map_.clear();
1371 }
1317 } 1372 }
1318 1373
1319 gfx::ScrollOffset ScrollTree::MaxScrollOffset(int scroll_node_id) const { 1374 gfx::ScrollOffset ScrollTree::MaxScrollOffset(int scroll_node_id) const {
1320 const ScrollNode* scroll_node = Node(scroll_node_id); 1375 const ScrollNode* scroll_node = Node(scroll_node_id);
1321 gfx::SizeF scroll_bounds = gfx::SizeF(scroll_node->data.bounds.width(), 1376 gfx::SizeF scroll_bounds = gfx::SizeF(scroll_node->data.bounds.width(),
1322 scroll_node->data.bounds.height()); 1377 scroll_node->data.bounds.height());
1323 1378
1324 if (scroll_node->data.is_inner_viewport_scroll_layer) { 1379 if (scroll_node->data.is_inner_viewport_scroll_layer) {
1325 scroll_bounds.Enlarge( 1380 scroll_bounds.Enlarge(
1326 property_trees()->inner_viewport_scroll_bounds_delta().x(), 1381 property_trees()->inner_viewport_scroll_bounds_delta().x(),
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1392 property_trees()->transform_tree.Node(scroll_node->data.transform_id); 1447 property_trees()->transform_tree.Node(scroll_node->data.transform_id);
1393 gfx::Transform screen_space_transform( 1448 gfx::Transform screen_space_transform(
1394 1, 0, 0, 1, scroll_node->data.offset_to_transform_parent.x(), 1449 1, 0, 0, 1, scroll_node->data.offset_to_transform_parent.x(),
1395 scroll_node->data.offset_to_transform_parent.y()); 1450 scroll_node->data.offset_to_transform_parent.y());
1396 screen_space_transform.ConcatTransform(transform_node->data.to_screen); 1451 screen_space_transform.ConcatTransform(transform_node->data.to_screen);
1397 if (scroll_node->data.should_flatten) 1452 if (scroll_node->data.should_flatten)
1398 screen_space_transform.FlattenTo2d(); 1453 screen_space_transform.FlattenTo2d();
1399 return screen_space_transform; 1454 return screen_space_transform;
1400 } 1455 }
1401 1456
1457 SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) {
1458 if (layer_id_to_scroll_offset_map_.find(layer_id) ==
1459 layer_id_to_scroll_offset_map_.end()) {
1460 layer_id_to_scroll_offset_map_[layer_id] = new SyncedScrollOffset;
1461 }
1462 return layer_id_to_scroll_offset_map_[layer_id].get();
1463 }
1464
1465 gfx::ScrollOffset ScrollTree::PullDeltaForMainThread(
1466 SyncedScrollOffset* scroll_offset) {
1467 // TODO(miletus): Remove all this temporary flooring machinery when
1468 // Blink fully supports fractional scrolls.
1469 gfx::ScrollOffset current_offset =
1470 scroll_offset->Current(property_trees()->is_active);
1471 gfx::ScrollOffset current_delta = property_trees()->is_active
1472 ? scroll_offset->Delta()
1473 : scroll_offset->PendingDelta().get();
1474 gfx::ScrollOffset floored_delta(floor(current_delta.x()),
1475 floor(current_delta.y()));
1476 gfx::ScrollOffset diff_delta = floored_delta - current_delta;
1477 gfx::ScrollOffset tmp_offset = current_offset + diff_delta;
1478 scroll_offset->SetCurrent(tmp_offset);
1479 gfx::ScrollOffset delta = scroll_offset->PullDeltaForMainThread();
1480 scroll_offset->SetCurrent(current_offset);
1481 return delta;
1482 }
1483
1484 void ScrollTree::CollectScrollDeltas(ScrollAndScaleSet* scroll_info) {
1485 for (auto map_entry : layer_id_to_scroll_offset_map_) {
1486 gfx::ScrollOffset scroll_delta =
1487 PullDeltaForMainThread(map_entry.second.get());
1488
1489 if (!scroll_delta.IsZero()) {
1490 LayerTreeHostCommon::ScrollUpdateInfo scroll;
1491 scroll.layer_id = map_entry.first;
1492 scroll.scroll_delta = gfx::Vector2d(scroll_delta.x(), scroll_delta.y());
1493 scroll_info->scrolls.push_back(scroll);
1494 }
1495 }
1496 }
1497
1498 void ScrollTree::UpdateScrollOffsetMapEntry(
1499 int key,
1500 ScrollTree::ScrollOffsetMap* new_scroll_offset_map,
1501 LayerTreeImpl* layer_tree_impl) {
1502 bool changed = false;
1503 // If we are pushing scroll offset from main to pending tree, we create a new
1504 // instance of synced scroll offset; if we are pushing from pending to active,
1505 // we reuse the pending tree's value in the map.
1506 if (layer_tree_impl->IsPendingTree()) {
1507 changed = synced_scroll_offset(key)->PushFromMainThread(
1508 new_scroll_offset_map->at(key)->PendingBase());
1509
1510 if (new_scroll_offset_map->at(key)->clobber_active_value()) {
1511 synced_scroll_offset(key)->set_clobber_active_value();
1512 }
1513 if (changed)
1514 layer_tree_impl->LayerById(key)->DidUpdateScrollOffset();
1515 } else {
1516 layer_id_to_scroll_offset_map_[key] = new_scroll_offset_map->at(key);
1517 changed |= synced_scroll_offset(key)->PushPendingToActive();
1518 if (changed && layer_tree_impl)
1519 layer_tree_impl->LayerById(key)->DidUpdateScrollOffset();
1520 }
1521 }
1522
1523 void ScrollTree::UpdateScrollOffsetMap(
1524 ScrollTree::ScrollOffsetMap* new_scroll_offset_map,
1525 LayerTreeImpl* layer_tree_impl) {
1526 if (layer_tree_impl && !layer_tree_impl->root_layer()) {
1527 return;
1528 }
1529 DCHECK(!property_trees()->is_main_thread);
1530 for (auto map_entry = layer_id_to_scroll_offset_map_.begin();
1531 map_entry != layer_id_to_scroll_offset_map_.end();) {
1532 int key = map_entry->first;
1533 if (new_scroll_offset_map->find(key) != new_scroll_offset_map->end()) {
1534 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl);
1535 ++map_entry;
1536 } else {
1537 map_entry = layer_id_to_scroll_offset_map_.erase(map_entry);
1538 }
1539 }
1540
1541 for (auto& map_entry : *new_scroll_offset_map) {
1542 int key = map_entry.first;
1543 if (layer_id_to_scroll_offset_map_.find(key) ==
1544 layer_id_to_scroll_offset_map_.end())
1545 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl);
1546 }
1547 }
1548
1549 ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map() {
1550 return layer_id_to_scroll_offset_map_;
1551 }
1552
1553 const ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map() const {
1554 return layer_id_to_scroll_offset_map_;
1555 }
1556
1557 void ScrollTree::ApplySentScrollDeltasFromAbortedCommit() {
1558 DCHECK(property_trees()->is_active);
1559 for (auto& map_entry : layer_id_to_scroll_offset_map_)
1560 map_entry.second->AbortCommit();
1561 }
1562
1402 PropertyTrees::PropertyTrees() 1563 PropertyTrees::PropertyTrees()
1403 : needs_rebuild(true), 1564 : needs_rebuild(true),
1404 non_root_surfaces_enabled(true), 1565 non_root_surfaces_enabled(true),
1405 changed(false), 1566 changed(false),
1406 sequence_number(0) { 1567 sequence_number(0),
1568 is_main_thread(true),
1569 is_active(false) {
1407 transform_tree.SetPropertyTrees(this); 1570 transform_tree.SetPropertyTrees(this);
1408 effect_tree.SetPropertyTrees(this); 1571 effect_tree.SetPropertyTrees(this);
1409 clip_tree.SetPropertyTrees(this); 1572 clip_tree.SetPropertyTrees(this);
1410 scroll_tree.SetPropertyTrees(this); 1573 scroll_tree.SetPropertyTrees(this);
1411 } 1574 }
1412 1575
1413 PropertyTrees::~PropertyTrees() {} 1576 PropertyTrees::~PropertyTrees() {}
1414 1577
1415 bool PropertyTrees::operator==(const PropertyTrees& other) const { 1578 bool PropertyTrees::operator==(const PropertyTrees& other) const {
1416 return transform_tree == other.transform_tree && 1579 return transform_tree == other.transform_tree &&
1417 effect_tree == other.effect_tree && clip_tree == other.clip_tree && 1580 effect_tree == other.effect_tree && clip_tree == other.clip_tree &&
1418 scroll_tree == other.scroll_tree && 1581 scroll_tree == other.scroll_tree &&
1419 needs_rebuild == other.needs_rebuild && changed == other.changed && 1582 needs_rebuild == other.needs_rebuild &&
1583 is_main_thread == other.is_main_thread &&
1584 is_active == other.is_active &&
1420 non_root_surfaces_enabled == other.non_root_surfaces_enabled && 1585 non_root_surfaces_enabled == other.non_root_surfaces_enabled &&
1421 sequence_number == other.sequence_number; 1586 sequence_number == other.sequence_number;
1422 } 1587 }
1423 1588
1424 PropertyTrees& PropertyTrees::operator=(const PropertyTrees& from) { 1589 PropertyTrees& PropertyTrees::operator=(const PropertyTrees& from) {
1425 transform_tree = from.transform_tree; 1590 transform_tree = from.transform_tree;
1426 effect_tree = from.effect_tree; 1591 effect_tree = from.effect_tree;
1427 clip_tree = from.clip_tree; 1592 clip_tree = from.clip_tree;
1428 scroll_tree = from.scroll_tree; 1593 scroll_tree = from.scroll_tree;
1429 needs_rebuild = from.needs_rebuild; 1594 needs_rebuild = from.needs_rebuild;
1430 changed = from.changed; 1595 changed = from.changed;
1431 non_root_surfaces_enabled = from.non_root_surfaces_enabled; 1596 non_root_surfaces_enabled = from.non_root_surfaces_enabled;
1432 sequence_number = from.sequence_number; 1597 sequence_number = from.sequence_number;
1598 is_main_thread = from.is_main_thread;
1599 is_active = from.is_active;
1433 inner_viewport_container_bounds_delta_ = 1600 inner_viewport_container_bounds_delta_ =
1434 from.inner_viewport_container_bounds_delta(); 1601 from.inner_viewport_container_bounds_delta();
1435 outer_viewport_container_bounds_delta_ = 1602 outer_viewport_container_bounds_delta_ =
1436 from.outer_viewport_container_bounds_delta(); 1603 from.outer_viewport_container_bounds_delta();
1437 inner_viewport_scroll_bounds_delta_ = 1604 inner_viewport_scroll_bounds_delta_ =
1438 from.inner_viewport_scroll_bounds_delta(); 1605 from.inner_viewport_scroll_bounds_delta();
1439 transform_tree.SetPropertyTrees(this); 1606 transform_tree.SetPropertyTrees(this);
1440 effect_tree.SetPropertyTrees(this); 1607 effect_tree.SetPropertyTrees(this);
1441 clip_tree.SetPropertyTrees(this); 1608 clip_tree.SetPropertyTrees(this);
1442 scroll_tree.SetPropertyTrees(this); 1609 scroll_tree.SetPropertyTrees(this);
1443 return *this; 1610 return *this;
1444 } 1611 }
1445 1612
1446 void PropertyTrees::ToProtobuf(proto::PropertyTrees* proto) const { 1613 void PropertyTrees::ToProtobuf(proto::PropertyTrees* proto) const {
1447 // TODO(khushalsagar): Add support for sending diffs when serializaing 1614 // TODO(khushalsagar): Add support for sending diffs when serializaing
1448 // property trees. See crbug/555370. 1615 // property trees. See crbug/555370.
1449 transform_tree.ToProtobuf(proto->mutable_transform_tree()); 1616 transform_tree.ToProtobuf(proto->mutable_transform_tree());
1450 effect_tree.ToProtobuf(proto->mutable_effect_tree()); 1617 effect_tree.ToProtobuf(proto->mutable_effect_tree());
1451 clip_tree.ToProtobuf(proto->mutable_clip_tree()); 1618 clip_tree.ToProtobuf(proto->mutable_clip_tree());
1452 scroll_tree.ToProtobuf(proto->mutable_scroll_tree()); 1619 scroll_tree.ToProtobuf(proto->mutable_scroll_tree());
1453 proto->set_needs_rebuild(needs_rebuild); 1620 proto->set_needs_rebuild(needs_rebuild);
1454 proto->set_changed(changed); 1621 proto->set_changed(changed);
1455 proto->set_non_root_surfaces_enabled(non_root_surfaces_enabled); 1622 proto->set_non_root_surfaces_enabled(non_root_surfaces_enabled);
1623 proto->set_is_main_thread(is_main_thread);
1624 proto->set_is_active(is_active);
1456 1625
1457 // TODO(khushalsagar): Consider using the sequence number to decide if 1626 // TODO(khushalsagar): Consider using the sequence number to decide if
1458 // property trees need to be serialized again for a commit. See crbug/555370. 1627 // property trees need to be serialized again for a commit. See crbug/555370.
1459 proto->set_sequence_number(sequence_number); 1628 proto->set_sequence_number(sequence_number);
1460 } 1629 }
1461 1630
1462 // static 1631 // static
1463 void PropertyTrees::FromProtobuf(const proto::PropertyTrees& proto) { 1632 void PropertyTrees::FromProtobuf(const proto::PropertyTrees& proto) {
1464 transform_tree.FromProtobuf(proto.transform_tree()); 1633 transform_tree.FromProtobuf(proto.transform_tree());
1465 effect_tree.FromProtobuf(proto.effect_tree()); 1634 effect_tree.FromProtobuf(proto.effect_tree());
1466 clip_tree.FromProtobuf(proto.clip_tree()); 1635 clip_tree.FromProtobuf(proto.clip_tree());
1467 scroll_tree.FromProtobuf(proto.scroll_tree()); 1636 scroll_tree.FromProtobuf(proto.scroll_tree());
1468 1637
1469 needs_rebuild = proto.needs_rebuild(); 1638 needs_rebuild = proto.needs_rebuild();
1470 changed = proto.changed(); 1639 changed = proto.changed();
1471 non_root_surfaces_enabled = proto.non_root_surfaces_enabled(); 1640 non_root_surfaces_enabled = proto.non_root_surfaces_enabled();
1472 sequence_number = proto.sequence_number(); 1641 sequence_number = proto.sequence_number();
1642 is_main_thread = proto.is_main_thread();
1643 is_active = proto.is_active();
1473 1644
1474 transform_tree.SetPropertyTrees(this); 1645 transform_tree.SetPropertyTrees(this);
1475 effect_tree.SetPropertyTrees(this); 1646 effect_tree.SetPropertyTrees(this);
1476 clip_tree.SetPropertyTrees(this); 1647 clip_tree.SetPropertyTrees(this);
1477 scroll_tree.SetPropertyTrees(this); 1648 scroll_tree.SetPropertyTrees(this);
1478 } 1649 }
1479 1650
1480 void PropertyTrees::SetInnerViewportContainerBoundsDelta( 1651 void PropertyTrees::SetInnerViewportContainerBoundsDelta(
1481 gfx::Vector2dF bounds_delta) { 1652 gfx::Vector2dF bounds_delta) {
1482 if (inner_viewport_container_bounds_delta_ == bounds_delta) 1653 if (inner_viewport_container_bounds_delta_ == bounds_delta)
(...skipping 21 matching lines...) Expand all
1504 for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) { 1675 for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) {
1505 EffectNode* node = effect_tree.Node(id); 1676 EffectNode* node = effect_tree.Node(id);
1506 if (node->data.opacity_changed) { 1677 if (node->data.opacity_changed) {
1507 EffectNode* target_node = tree->effect_tree.Node(node->id); 1678 EffectNode* target_node = tree->effect_tree.Node(node->id);
1508 target_node->data.opacity_changed = true; 1679 target_node->data.opacity_changed = true;
1509 } 1680 }
1510 } 1681 }
1511 } 1682 }
1512 1683
1513 } // namespace cc 1684 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698