| OLD | NEW |
| 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" |
| (...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 } | 428 } |
| 429 | 429 |
| 430 EffectNodeData::EffectNodeData() | 430 EffectNodeData::EffectNodeData() |
| 431 : opacity(1.f), | 431 : opacity(1.f), |
| 432 screen_space_opacity(1.f), | 432 screen_space_opacity(1.f), |
| 433 has_render_surface(false), | 433 has_render_surface(false), |
| 434 has_copy_request(false), | 434 has_copy_request(false), |
| 435 has_background_filters(false), | 435 has_background_filters(false), |
| 436 is_drawn(true), | 436 is_drawn(true), |
| 437 has_animated_opacity(false), | 437 has_animated_opacity(false), |
| 438 opacity_changed(false), | 438 effect_changed(false), |
| 439 num_copy_requests_in_subtree(0), | 439 num_copy_requests_in_subtree(0), |
| 440 transform_id(0), | 440 transform_id(0), |
| 441 clip_id(0) {} | 441 clip_id(0) {} |
| 442 | 442 |
| 443 EffectNodeData::EffectNodeData(const EffectNodeData& other) = default; | 443 EffectNodeData::EffectNodeData(const EffectNodeData& other) = default; |
| 444 | 444 |
| 445 bool EffectNodeData::operator==(const EffectNodeData& other) const { | 445 bool EffectNodeData::operator==(const EffectNodeData& other) const { |
| 446 return opacity == other.opacity && | 446 return opacity == other.opacity && |
| 447 screen_space_opacity == other.screen_space_opacity && | 447 screen_space_opacity == other.screen_space_opacity && |
| 448 has_render_surface == other.has_render_surface && | 448 has_render_surface == other.has_render_surface && |
| 449 has_copy_request == other.has_copy_request && | 449 has_copy_request == other.has_copy_request && |
| 450 has_background_filters == other.has_background_filters && | 450 has_background_filters == other.has_background_filters && |
| 451 is_drawn == other.is_drawn && | 451 is_drawn == other.is_drawn && |
| 452 has_animated_opacity == other.has_animated_opacity && | 452 has_animated_opacity == other.has_animated_opacity && |
| 453 opacity_changed == other.opacity_changed && | 453 effect_changed == other.effect_changed && |
| 454 num_copy_requests_in_subtree == other.num_copy_requests_in_subtree && | 454 num_copy_requests_in_subtree == other.num_copy_requests_in_subtree && |
| 455 transform_id == other.transform_id && clip_id == other.clip_id; | 455 transform_id == other.transform_id && clip_id == other.clip_id; |
| 456 } | 456 } |
| 457 | 457 |
| 458 void EffectNodeData::ToProtobuf(proto::TreeNode* proto) const { | 458 void EffectNodeData::ToProtobuf(proto::TreeNode* proto) const { |
| 459 DCHECK(!proto->has_effect_node_data()); | 459 DCHECK(!proto->has_effect_node_data()); |
| 460 proto::EffectNodeData* data = proto->mutable_effect_node_data(); | 460 proto::EffectNodeData* data = proto->mutable_effect_node_data(); |
| 461 data->set_opacity(opacity); | 461 data->set_opacity(opacity); |
| 462 data->set_screen_space_opacity(screen_space_opacity); | 462 data->set_screen_space_opacity(screen_space_opacity); |
| 463 data->set_has_render_surface(has_render_surface); | 463 data->set_has_render_surface(has_render_surface); |
| 464 data->set_has_copy_request(has_copy_request); | 464 data->set_has_copy_request(has_copy_request); |
| 465 data->set_has_background_filters(has_background_filters); | 465 data->set_has_background_filters(has_background_filters); |
| 466 data->set_is_drawn(is_drawn); | 466 data->set_is_drawn(is_drawn); |
| 467 data->set_has_animated_opacity(has_animated_opacity); | 467 data->set_has_animated_opacity(has_animated_opacity); |
| 468 data->set_opacity_changed(opacity_changed); | 468 data->set_effect_changed(effect_changed); |
| 469 data->set_num_copy_requests_in_subtree(num_copy_requests_in_subtree); | 469 data->set_num_copy_requests_in_subtree(num_copy_requests_in_subtree); |
| 470 data->set_transform_id(transform_id); | 470 data->set_transform_id(transform_id); |
| 471 data->set_clip_id(clip_id); | 471 data->set_clip_id(clip_id); |
| 472 } | 472 } |
| 473 | 473 |
| 474 void EffectNodeData::FromProtobuf(const proto::TreeNode& proto) { | 474 void EffectNodeData::FromProtobuf(const proto::TreeNode& proto) { |
| 475 DCHECK(proto.has_effect_node_data()); | 475 DCHECK(proto.has_effect_node_data()); |
| 476 const proto::EffectNodeData& data = proto.effect_node_data(); | 476 const proto::EffectNodeData& data = proto.effect_node_data(); |
| 477 | 477 |
| 478 opacity = data.opacity(); | 478 opacity = data.opacity(); |
| 479 screen_space_opacity = data.screen_space_opacity(); | 479 screen_space_opacity = data.screen_space_opacity(); |
| 480 has_render_surface = data.has_render_surface(); | 480 has_render_surface = data.has_render_surface(); |
| 481 has_copy_request = data.has_copy_request(); | 481 has_copy_request = data.has_copy_request(); |
| 482 has_background_filters = data.has_background_filters(); | 482 has_background_filters = data.has_background_filters(); |
| 483 is_drawn = data.is_drawn(); | 483 is_drawn = data.is_drawn(); |
| 484 has_animated_opacity = data.has_animated_opacity(); | 484 has_animated_opacity = data.has_animated_opacity(); |
| 485 opacity_changed = data.opacity_changed(); | 485 effect_changed = data.effect_changed(); |
| 486 num_copy_requests_in_subtree = data.num_copy_requests_in_subtree(); | 486 num_copy_requests_in_subtree = data.num_copy_requests_in_subtree(); |
| 487 transform_id = data.transform_id(); | 487 transform_id = data.transform_id(); |
| 488 clip_id = data.clip_id(); | 488 clip_id = data.clip_id(); |
| 489 } | 489 } |
| 490 | 490 |
| 491 ScrollNodeData::ScrollNodeData() | 491 ScrollNodeData::ScrollNodeData() |
| 492 : scrollable(false), | 492 : scrollable(false), |
| 493 main_thread_scrolling_reasons( | 493 main_thread_scrolling_reasons( |
| 494 MainThreadScrollingReason::kNotScrollingOnMain), | 494 MainThreadScrollingReason::kNotScrollingOnMain), |
| 495 contains_non_fast_scrollable_region(false), | 495 contains_non_fast_scrollable_region(false), |
| (...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1171 if (node->data.has_copy_request || node->data.has_background_filters) | 1171 if (node->data.has_copy_request || node->data.has_background_filters) |
| 1172 node->data.is_drawn = true; | 1172 node->data.is_drawn = true; |
| 1173 else if (node->data.opacity == 0.f && !node->data.has_animated_opacity) | 1173 else if (node->data.opacity == 0.f && !node->data.has_animated_opacity) |
| 1174 node->data.is_drawn = false; | 1174 node->data.is_drawn = false; |
| 1175 else if (parent_node) | 1175 else if (parent_node) |
| 1176 node->data.is_drawn = parent_node->data.is_drawn; | 1176 node->data.is_drawn = parent_node->data.is_drawn; |
| 1177 else | 1177 else |
| 1178 node->data.is_drawn = true; | 1178 node->data.is_drawn = true; |
| 1179 } | 1179 } |
| 1180 | 1180 |
| 1181 void EffectTree::UpdateOpacityChanged(EffectNode* node, | 1181 void EffectTree::UpdateEffectChanged(EffectNode* node, |
| 1182 EffectNode* parent_node) { | 1182 EffectNode* parent_node) { |
| 1183 if (parent_node && parent_node->data.opacity_changed) { | 1183 if (parent_node && parent_node->data.effect_changed) { |
| 1184 node->data.opacity_changed = true; | 1184 node->data.effect_changed = true; |
| 1185 } | 1185 } |
| 1186 } | 1186 } |
| 1187 | 1187 |
| 1188 void EffectTree::UpdateEffects(int id) { | 1188 void EffectTree::UpdateEffects(int id) { |
| 1189 EffectNode* node = Node(id); | 1189 EffectNode* node = Node(id); |
| 1190 EffectNode* parent_node = parent(node); | 1190 EffectNode* parent_node = parent(node); |
| 1191 | 1191 |
| 1192 UpdateOpacities(node, parent_node); | 1192 UpdateOpacities(node, parent_node); |
| 1193 UpdateIsDrawn(node, parent_node); | 1193 UpdateIsDrawn(node, parent_node); |
| 1194 UpdateOpacityChanged(node, parent_node); | 1194 UpdateEffectChanged(node, parent_node); |
| 1195 } | 1195 } |
| 1196 | 1196 |
| 1197 void EffectTree::ClearCopyRequests() { | 1197 void EffectTree::ClearCopyRequests() { |
| 1198 for (auto& node : nodes()) { | 1198 for (auto& node : nodes()) { |
| 1199 node.data.num_copy_requests_in_subtree = 0; | 1199 node.data.num_copy_requests_in_subtree = 0; |
| 1200 node.data.has_copy_request = false; | 1200 node.data.has_copy_request = false; |
| 1201 } | 1201 } |
| 1202 set_needs_update(true); | 1202 set_needs_update(true); |
| 1203 } | 1203 } |
| 1204 | 1204 |
| 1205 bool EffectTree::ContributesToDrawnSurface(int id) { | 1205 bool EffectTree::ContributesToDrawnSurface(int id) { |
| 1206 // All drawn nodes contribute to drawn surface. | 1206 // All drawn nodes contribute to drawn surface. |
| 1207 // Exception : Nodes that are hidden and are drawn only for the sake of | 1207 // Exception : Nodes that are hidden and are drawn only for the sake of |
| 1208 // copy requests. | 1208 // copy requests. |
| 1209 EffectNode* node = Node(id); | 1209 EffectNode* node = Node(id); |
| 1210 EffectNode* parent_node = parent(node); | 1210 EffectNode* parent_node = parent(node); |
| 1211 bool contributes_to_drawn_surface = | 1211 bool contributes_to_drawn_surface = |
| 1212 node->data.is_drawn && | 1212 node->data.is_drawn && |
| 1213 (node->data.opacity != 0.f || node->data.has_animated_opacity || | 1213 (node->data.opacity != 0.f || node->data.has_animated_opacity || |
| 1214 node->data.has_background_filters); | 1214 node->data.has_background_filters); |
| 1215 if (parent_node && !parent_node->data.is_drawn) | 1215 if (parent_node && !parent_node->data.is_drawn) |
| 1216 contributes_to_drawn_surface = false; | 1216 contributes_to_drawn_surface = false; |
| 1217 return contributes_to_drawn_surface; | 1217 return contributes_to_drawn_surface; |
| 1218 } | 1218 } |
| 1219 | 1219 |
| 1220 void EffectTree::ResetChangeTracking() { | 1220 void EffectTree::ResetChangeTracking() { |
| 1221 for (int id = 1; id < static_cast<int>(size()); ++id) { | 1221 for (int id = 1; id < static_cast<int>(size()); ++id) { |
| 1222 EffectNode* node = Node(id); | 1222 EffectNode* node = Node(id); |
| 1223 node->data.opacity_changed = false; | 1223 node->data.effect_changed = false; |
| 1224 } | 1224 } |
| 1225 } | 1225 } |
| 1226 | 1226 |
| 1227 void TransformTree::UpdateNodeAndAncestorsHaveIntegerTranslations( | 1227 void TransformTree::UpdateNodeAndAncestorsHaveIntegerTranslations( |
| 1228 TransformNode* node, | 1228 TransformNode* node, |
| 1229 TransformNode* parent_node) { | 1229 TransformNode* parent_node) { |
| 1230 node->data.node_and_ancestors_have_only_integer_translation = | 1230 node->data.node_and_ancestors_have_only_integer_translation = |
| 1231 node->data.to_parent.IsIdentityOrIntegerTranslation(); | 1231 node->data.to_parent.IsIdentityOrIntegerTranslation(); |
| 1232 if (parent_node) | 1232 if (parent_node) |
| 1233 node->data.node_and_ancestors_have_only_integer_translation = | 1233 node->data.node_and_ancestors_have_only_integer_translation = |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1396 screen_space_transform.ConcatTransform(transform_node->data.to_screen); | 1396 screen_space_transform.ConcatTransform(transform_node->data.to_screen); |
| 1397 if (scroll_node->data.should_flatten) | 1397 if (scroll_node->data.should_flatten) |
| 1398 screen_space_transform.FlattenTo2d(); | 1398 screen_space_transform.FlattenTo2d(); |
| 1399 return screen_space_transform; | 1399 return screen_space_transform; |
| 1400 } | 1400 } |
| 1401 | 1401 |
| 1402 PropertyTrees::PropertyTrees() | 1402 PropertyTrees::PropertyTrees() |
| 1403 : needs_rebuild(true), | 1403 : needs_rebuild(true), |
| 1404 non_root_surfaces_enabled(true), | 1404 non_root_surfaces_enabled(true), |
| 1405 changed(false), | 1405 changed(false), |
| 1406 full_tree_damaged(false), |
| 1406 sequence_number(0) { | 1407 sequence_number(0) { |
| 1407 transform_tree.SetPropertyTrees(this); | 1408 transform_tree.SetPropertyTrees(this); |
| 1408 effect_tree.SetPropertyTrees(this); | 1409 effect_tree.SetPropertyTrees(this); |
| 1409 clip_tree.SetPropertyTrees(this); | 1410 clip_tree.SetPropertyTrees(this); |
| 1410 scroll_tree.SetPropertyTrees(this); | 1411 scroll_tree.SetPropertyTrees(this); |
| 1411 } | 1412 } |
| 1412 | 1413 |
| 1413 PropertyTrees::~PropertyTrees() {} | 1414 PropertyTrees::~PropertyTrees() {} |
| 1414 | 1415 |
| 1415 bool PropertyTrees::operator==(const PropertyTrees& other) const { | 1416 bool PropertyTrees::operator==(const PropertyTrees& other) const { |
| 1416 return transform_tree == other.transform_tree && | 1417 return transform_tree == other.transform_tree && |
| 1417 effect_tree == other.effect_tree && clip_tree == other.clip_tree && | 1418 effect_tree == other.effect_tree && clip_tree == other.clip_tree && |
| 1418 scroll_tree == other.scroll_tree && | 1419 scroll_tree == other.scroll_tree && |
| 1419 needs_rebuild == other.needs_rebuild && changed == other.changed && | 1420 needs_rebuild == other.needs_rebuild && changed == other.changed && |
| 1421 full_tree_damaged == other.full_tree_damaged && |
| 1420 non_root_surfaces_enabled == other.non_root_surfaces_enabled && | 1422 non_root_surfaces_enabled == other.non_root_surfaces_enabled && |
| 1421 sequence_number == other.sequence_number; | 1423 sequence_number == other.sequence_number; |
| 1422 } | 1424 } |
| 1423 | 1425 |
| 1424 PropertyTrees& PropertyTrees::operator=(const PropertyTrees& from) { | 1426 PropertyTrees& PropertyTrees::operator=(const PropertyTrees& from) { |
| 1425 transform_tree = from.transform_tree; | 1427 transform_tree = from.transform_tree; |
| 1426 effect_tree = from.effect_tree; | 1428 effect_tree = from.effect_tree; |
| 1427 clip_tree = from.clip_tree; | 1429 clip_tree = from.clip_tree; |
| 1428 scroll_tree = from.scroll_tree; | 1430 scroll_tree = from.scroll_tree; |
| 1429 needs_rebuild = from.needs_rebuild; | 1431 needs_rebuild = from.needs_rebuild; |
| 1430 changed = from.changed; | 1432 changed = from.changed; |
| 1433 full_tree_damaged = from.full_tree_damaged; |
| 1431 non_root_surfaces_enabled = from.non_root_surfaces_enabled; | 1434 non_root_surfaces_enabled = from.non_root_surfaces_enabled; |
| 1432 sequence_number = from.sequence_number; | 1435 sequence_number = from.sequence_number; |
| 1433 inner_viewport_container_bounds_delta_ = | 1436 inner_viewport_container_bounds_delta_ = |
| 1434 from.inner_viewport_container_bounds_delta(); | 1437 from.inner_viewport_container_bounds_delta(); |
| 1435 outer_viewport_container_bounds_delta_ = | 1438 outer_viewport_container_bounds_delta_ = |
| 1436 from.outer_viewport_container_bounds_delta(); | 1439 from.outer_viewport_container_bounds_delta(); |
| 1437 inner_viewport_scroll_bounds_delta_ = | 1440 inner_viewport_scroll_bounds_delta_ = |
| 1438 from.inner_viewport_scroll_bounds_delta(); | 1441 from.inner_viewport_scroll_bounds_delta(); |
| 1439 transform_tree.SetPropertyTrees(this); | 1442 transform_tree.SetPropertyTrees(this); |
| 1440 effect_tree.SetPropertyTrees(this); | 1443 effect_tree.SetPropertyTrees(this); |
| 1441 clip_tree.SetPropertyTrees(this); | 1444 clip_tree.SetPropertyTrees(this); |
| 1442 scroll_tree.SetPropertyTrees(this); | 1445 scroll_tree.SetPropertyTrees(this); |
| 1443 return *this; | 1446 return *this; |
| 1444 } | 1447 } |
| 1445 | 1448 |
| 1446 void PropertyTrees::ToProtobuf(proto::PropertyTrees* proto) const { | 1449 void PropertyTrees::ToProtobuf(proto::PropertyTrees* proto) const { |
| 1447 // TODO(khushalsagar): Add support for sending diffs when serializaing | 1450 // TODO(khushalsagar): Add support for sending diffs when serializaing |
| 1448 // property trees. See crbug/555370. | 1451 // property trees. See crbug/555370. |
| 1449 transform_tree.ToProtobuf(proto->mutable_transform_tree()); | 1452 transform_tree.ToProtobuf(proto->mutable_transform_tree()); |
| 1450 effect_tree.ToProtobuf(proto->mutable_effect_tree()); | 1453 effect_tree.ToProtobuf(proto->mutable_effect_tree()); |
| 1451 clip_tree.ToProtobuf(proto->mutable_clip_tree()); | 1454 clip_tree.ToProtobuf(proto->mutable_clip_tree()); |
| 1452 scroll_tree.ToProtobuf(proto->mutable_scroll_tree()); | 1455 scroll_tree.ToProtobuf(proto->mutable_scroll_tree()); |
| 1453 proto->set_needs_rebuild(needs_rebuild); | 1456 proto->set_needs_rebuild(needs_rebuild); |
| 1454 proto->set_changed(changed); | 1457 proto->set_changed(changed); |
| 1458 proto->set_full_tree_damaged(full_tree_damaged); |
| 1455 proto->set_non_root_surfaces_enabled(non_root_surfaces_enabled); | 1459 proto->set_non_root_surfaces_enabled(non_root_surfaces_enabled); |
| 1456 | 1460 |
| 1457 // TODO(khushalsagar): Consider using the sequence number to decide if | 1461 // TODO(khushalsagar): Consider using the sequence number to decide if |
| 1458 // property trees need to be serialized again for a commit. See crbug/555370. | 1462 // property trees need to be serialized again for a commit. See crbug/555370. |
| 1459 proto->set_sequence_number(sequence_number); | 1463 proto->set_sequence_number(sequence_number); |
| 1460 } | 1464 } |
| 1461 | 1465 |
| 1462 // static | 1466 // static |
| 1463 void PropertyTrees::FromProtobuf(const proto::PropertyTrees& proto) { | 1467 void PropertyTrees::FromProtobuf(const proto::PropertyTrees& proto) { |
| 1464 transform_tree.FromProtobuf(proto.transform_tree()); | 1468 transform_tree.FromProtobuf(proto.transform_tree()); |
| 1465 effect_tree.FromProtobuf(proto.effect_tree()); | 1469 effect_tree.FromProtobuf(proto.effect_tree()); |
| 1466 clip_tree.FromProtobuf(proto.clip_tree()); | 1470 clip_tree.FromProtobuf(proto.clip_tree()); |
| 1467 scroll_tree.FromProtobuf(proto.scroll_tree()); | 1471 scroll_tree.FromProtobuf(proto.scroll_tree()); |
| 1468 | 1472 |
| 1469 needs_rebuild = proto.needs_rebuild(); | 1473 needs_rebuild = proto.needs_rebuild(); |
| 1470 changed = proto.changed(); | 1474 changed = proto.changed(); |
| 1475 full_tree_damaged = proto.full_tree_damaged(); |
| 1471 non_root_surfaces_enabled = proto.non_root_surfaces_enabled(); | 1476 non_root_surfaces_enabled = proto.non_root_surfaces_enabled(); |
| 1472 sequence_number = proto.sequence_number(); | 1477 sequence_number = proto.sequence_number(); |
| 1473 | 1478 |
| 1474 transform_tree.SetPropertyTrees(this); | 1479 transform_tree.SetPropertyTrees(this); |
| 1475 effect_tree.SetPropertyTrees(this); | 1480 effect_tree.SetPropertyTrees(this); |
| 1476 clip_tree.SetPropertyTrees(this); | 1481 clip_tree.SetPropertyTrees(this); |
| 1477 scroll_tree.SetPropertyTrees(this); | 1482 scroll_tree.SetPropertyTrees(this); |
| 1478 } | 1483 } |
| 1479 | 1484 |
| 1480 void PropertyTrees::SetInnerViewportContainerBoundsDelta( | 1485 void PropertyTrees::SetInnerViewportContainerBoundsDelta( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1496 } | 1501 } |
| 1497 | 1502 |
| 1498 void PropertyTrees::SetInnerViewportScrollBoundsDelta( | 1503 void PropertyTrees::SetInnerViewportScrollBoundsDelta( |
| 1499 gfx::Vector2dF bounds_delta) { | 1504 gfx::Vector2dF bounds_delta) { |
| 1500 inner_viewport_scroll_bounds_delta_ = bounds_delta; | 1505 inner_viewport_scroll_bounds_delta_ = bounds_delta; |
| 1501 } | 1506 } |
| 1502 | 1507 |
| 1503 void PropertyTrees::PushChangeTrackingTo(PropertyTrees* tree) { | 1508 void PropertyTrees::PushChangeTrackingTo(PropertyTrees* tree) { |
| 1504 for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) { | 1509 for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) { |
| 1505 EffectNode* node = effect_tree.Node(id); | 1510 EffectNode* node = effect_tree.Node(id); |
| 1506 if (node->data.opacity_changed) { | 1511 if (node->data.effect_changed) { |
| 1507 EffectNode* target_node = tree->effect_tree.Node(node->id); | 1512 EffectNode* target_node = tree->effect_tree.Node(node->id); |
| 1508 target_node->data.opacity_changed = true; | 1513 target_node->data.effect_changed = true; |
| 1509 } | 1514 } |
| 1510 } | 1515 } |
| 1511 for (int id = 1; id < static_cast<int>(transform_tree.size()); ++id) { | 1516 for (int id = 1; id < static_cast<int>(transform_tree.size()); ++id) { |
| 1512 TransformNode* node = transform_tree.Node(id); | 1517 TransformNode* node = transform_tree.Node(id); |
| 1513 if (node->data.transform_changed) { | 1518 if (node->data.transform_changed) { |
| 1514 TransformNode* target_node = tree->transform_tree.Node(node->id); | 1519 TransformNode* target_node = tree->transform_tree.Node(node->id); |
| 1515 target_node->data.transform_changed = true; | 1520 target_node->data.transform_changed = true; |
| 1516 } | 1521 } |
| 1517 } | 1522 } |
| 1523 tree->full_tree_damaged = full_tree_damaged; |
| 1518 } | 1524 } |
| 1519 | 1525 |
| 1520 } // namespace cc | 1526 } // namespace cc |
| OLD | NEW |