OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/picture_layer_impl.h" | 5 #include "cc/layers/picture_layer_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <set> | 9 #include <set> |
10 #include <utility> | 10 #include <utility> |
(...skipping 1171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1182 mask->SetContentBounds(layer_bounds); | 1182 mask->SetContentBounds(layer_bounds); |
1183 mask->SetDrawsContent(true); | 1183 mask->SetDrawsContent(true); |
1184 | 1184 |
1185 SetupDrawPropertiesAndUpdateTiles(mask.get(), contents_scale, device_scale, | 1185 SetupDrawPropertiesAndUpdateTiles(mask.get(), contents_scale, device_scale, |
1186 page_scale, maximum_animation_scale, | 1186 page_scale, maximum_animation_scale, |
1187 animating_transform); | 1187 animating_transform); |
1188 EXPECT_EQ(mask->HighResTiling()->contents_scale(), contents_scale); | 1188 EXPECT_EQ(mask->HighResTiling()->contents_scale(), contents_scale); |
1189 EXPECT_EQ(mask->num_tilings(), 1u); | 1189 EXPECT_EQ(mask->num_tilings(), 1u); |
1190 } | 1190 } |
1191 | 1191 |
1192 TEST_F(PictureLayerImplTest, HugeMasksDontGetTiles) { | 1192 TEST_F(PictureLayerImplTest, HugeMasksGetScaledDown) { |
1193 base::TimeTicks time_ticks; | 1193 base::TimeTicks time_ticks; |
1194 time_ticks += base::TimeDelta::FromMilliseconds(1); | 1194 time_ticks += base::TimeDelta::FromMilliseconds(1); |
1195 host_impl_.SetCurrentBeginFrameArgs( | 1195 host_impl_.SetCurrentBeginFrameArgs( |
1196 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); | 1196 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
1197 | 1197 |
1198 gfx::Size tile_size(100, 100); | 1198 gfx::Size tile_size(100, 100); |
1199 gfx::Size layer_bounds(1000, 1000); | 1199 gfx::Size layer_bounds(1000, 1000); |
1200 | 1200 |
1201 scoped_refptr<FakePicturePileImpl> valid_pile = | 1201 scoped_refptr<FakePicturePileImpl> valid_pile = |
1202 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); | 1202 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
(...skipping 26 matching lines...) Expand all Loading... |
1229 FakePictureLayerImpl* active_mask = | 1229 FakePictureLayerImpl* active_mask = |
1230 static_cast<FakePictureLayerImpl*>(active_layer_->mask_layer()); | 1230 static_cast<FakePictureLayerImpl*>(active_layer_->mask_layer()); |
1231 | 1231 |
1232 // Mask layers have a tiling with a single tile in it. | 1232 // Mask layers have a tiling with a single tile in it. |
1233 EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size()); | 1233 EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size()); |
1234 // The mask resource exists. | 1234 // The mask resource exists. |
1235 ResourceProvider::ResourceId mask_resource_id; | 1235 ResourceProvider::ResourceId mask_resource_id; |
1236 gfx::Size mask_texture_size; | 1236 gfx::Size mask_texture_size; |
1237 active_mask->GetContentsResourceId(&mask_resource_id, &mask_texture_size); | 1237 active_mask->GetContentsResourceId(&mask_resource_id, &mask_texture_size); |
1238 EXPECT_NE(0u, mask_resource_id); | 1238 EXPECT_NE(0u, mask_resource_id); |
1239 EXPECT_EQ(mask_texture_size, active_mask->bounds()); | 1239 EXPECT_EQ(active_mask->bounds(), mask_texture_size); |
1240 | 1240 |
1241 // Drop resources and recreate them, still the same. | 1241 // Drop resources and recreate them, still the same. |
1242 pending_mask->ReleaseResources(); | 1242 pending_mask->ReleaseResources(); |
1243 active_mask->ReleaseResources(); | 1243 active_mask->ReleaseResources(); |
1244 SetupDrawPropertiesAndUpdateTiles(active_mask, 1.f, 1.f, 1.f, 1.f, false); | 1244 SetupDrawPropertiesAndUpdateTiles(active_mask, 1.f, 1.f, 1.f, 1.f, false); |
1245 active_mask->HighResTiling()->CreateAllTilesForTesting(); | 1245 active_mask->HighResTiling()->CreateAllTilesForTesting(); |
1246 EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size()); | 1246 EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size()); |
1247 EXPECT_NE(0u, mask_resource_id); | 1247 EXPECT_NE(0u, mask_resource_id); |
1248 EXPECT_EQ(mask_texture_size, active_layer_->bounds()); | 1248 EXPECT_EQ(active_mask->bounds(), mask_texture_size); |
1249 | |
1250 // Drop resources and recreate them, still the same. | |
1251 pending_mask->ReleaseResources(); | |
1252 active_mask->ReleaseResources(); | |
1253 SetupDrawPropertiesAndUpdateTiles(active_mask, 1.f, 1.f, 1.f, 1.f, false); | |
1254 active_mask->HighResTiling()->CreateAllTilesForTesting(); | |
1255 EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size()); | |
1256 EXPECT_NE(0u, mask_resource_id); | |
1257 EXPECT_EQ(mask_texture_size, active_mask->bounds()); | |
1258 | 1249 |
1259 // Resize larger than the max texture size. | 1250 // Resize larger than the max texture size. |
1260 int max_texture_size = host_impl_.GetRendererCapabilities().max_texture_size; | 1251 int max_texture_size = host_impl_.GetRendererCapabilities().max_texture_size; |
1261 gfx::Size huge_bounds(max_texture_size + 1, 10); | 1252 gfx::Size huge_bounds(max_texture_size + 1, 10); |
1262 scoped_refptr<FakePicturePileImpl> huge_pile = | 1253 scoped_refptr<FakePicturePileImpl> huge_pile = |
1263 FakePicturePileImpl::CreateFilledPile(tile_size, huge_bounds); | 1254 FakePicturePileImpl::CreateFilledPile(tile_size, huge_bounds); |
1264 | 1255 |
1265 SetupPendingTree(huge_pile); | 1256 SetupPendingTree(huge_pile); |
1266 pending_mask->SetBounds(huge_bounds); | 1257 pending_mask->SetBounds(huge_bounds); |
1267 pending_mask->SetContentBounds(huge_bounds); | 1258 pending_mask->SetContentBounds(huge_bounds); |
1268 pending_mask->SetRasterSourceOnPending(huge_pile, Region()); | 1259 pending_mask->SetRasterSourceOnPending(huge_pile, Region()); |
1269 | 1260 |
1270 time_ticks += base::TimeDelta::FromMilliseconds(1); | 1261 time_ticks += base::TimeDelta::FromMilliseconds(1); |
1271 host_impl_.SetCurrentBeginFrameArgs( | 1262 host_impl_.SetCurrentBeginFrameArgs( |
1272 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); | 1263 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
1273 host_impl_.pending_tree()->UpdateDrawProperties(); | 1264 host_impl_.pending_tree()->UpdateDrawProperties(); |
1274 | 1265 |
1275 EXPECT_EQ(1.f, pending_mask->HighResTiling()->contents_scale()); | 1266 // The mask tiling gets scaled down. |
| 1267 EXPECT_LT(pending_mask->HighResTiling()->contents_scale(), 1.f); |
1276 EXPECT_EQ(1u, pending_mask->num_tilings()); | 1268 EXPECT_EQ(1u, pending_mask->num_tilings()); |
1277 | 1269 |
1278 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting( | 1270 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting( |
1279 pending_mask->HighResTiling()->AllTilesForTesting()); | 1271 pending_mask->HighResTiling()->AllTilesForTesting()); |
1280 | 1272 |
1281 ActivateTree(); | 1273 ActivateTree(); |
1282 | 1274 |
1283 // Mask layers have a tiling, but there should be no tiles in it. | 1275 // Mask layers have a tiling with a single tile in it. |
1284 EXPECT_EQ(0u, active_mask->HighResTiling()->AllTilesForTesting().size()); | 1276 EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size()); |
1285 // The mask resource is empty. | 1277 // The mask resource exists. |
1286 active_layer_->GetContentsResourceId(&mask_resource_id, &mask_texture_size); | 1278 active_mask->GetContentsResourceId(&mask_resource_id, &mask_texture_size); |
1287 EXPECT_EQ(0u, mask_resource_id); | 1279 EXPECT_NE(0u, mask_resource_id); |
| 1280 gfx::Size expected_size = active_mask->bounds(); |
| 1281 expected_size.SetToMin(gfx::Size(max_texture_size, max_texture_size)); |
| 1282 EXPECT_EQ(expected_size, mask_texture_size); |
1288 | 1283 |
1289 // Drop resources and recreate them, still the same. | 1284 // Drop resources and recreate them, still the same. |
1290 pending_mask->ReleaseResources(); | 1285 pending_mask->ReleaseResources(); |
1291 active_mask->ReleaseResources(); | 1286 active_mask->ReleaseResources(); |
1292 SetupDrawPropertiesAndUpdateTiles(active_mask, 1.f, 1.f, 1.f, 1.f, false); | 1287 SetupDrawPropertiesAndUpdateTiles(active_mask, 1.f, 1.f, 1.f, 1.f, false); |
1293 active_mask->HighResTiling()->CreateAllTilesForTesting(); | 1288 active_mask->HighResTiling()->CreateAllTilesForTesting(); |
1294 EXPECT_EQ(0u, active_mask->HighResTiling()->AllTilesForTesting().size()); | 1289 EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size()); |
1295 active_mask->GetContentsResourceId(&mask_resource_id, &mask_texture_size); | 1290 EXPECT_NE(0u, mask_resource_id); |
1296 EXPECT_EQ(0u, mask_resource_id); | 1291 EXPECT_EQ(expected_size, mask_texture_size); |
1297 | 1292 |
1298 // Do another activate, the same holds. | 1293 // Do another activate, the same holds. |
1299 SetupPendingTree(huge_pile); | 1294 SetupPendingTree(huge_pile); |
1300 ActivateTree(); | 1295 ActivateTree(); |
1301 EXPECT_EQ(0u, active_mask->HighResTiling()->AllTilesForTesting().size()); | 1296 EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size()); |
1302 active_layer_->GetContentsResourceId(&mask_resource_id, &mask_texture_size); | 1297 active_layer_->GetContentsResourceId(&mask_resource_id, &mask_texture_size); |
| 1298 EXPECT_EQ(expected_size, mask_texture_size); |
1303 EXPECT_EQ(0u, mask_resource_id); | 1299 EXPECT_EQ(0u, mask_resource_id); |
| 1300 |
| 1301 // Resize even larger, so that the scale would be smaller than the minimum |
| 1302 // contents scale. Then the layer should no longer have any tiling. |
| 1303 float min_contents_scale = host_impl_.settings().minimum_contents_scale; |
| 1304 gfx::Size extra_huge_bounds(max_texture_size / min_contents_scale + 1, 10); |
| 1305 scoped_refptr<FakePicturePileImpl> extra_huge_pile = |
| 1306 FakePicturePileImpl::CreateFilledPile(tile_size, extra_huge_bounds); |
| 1307 |
| 1308 SetupPendingTree(extra_huge_pile); |
| 1309 pending_mask->SetBounds(extra_huge_bounds); |
| 1310 pending_mask->SetContentBounds(extra_huge_bounds); |
| 1311 pending_mask->SetRasterSourceOnPending(extra_huge_pile, Region()); |
| 1312 |
| 1313 EXPECT_FALSE(pending_mask->CanHaveTilings()); |
| 1314 |
| 1315 time_ticks += base::TimeDelta::FromMilliseconds(1); |
| 1316 host_impl_.SetCurrentBeginFrameArgs( |
| 1317 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
| 1318 host_impl_.pending_tree()->UpdateDrawProperties(); |
| 1319 |
| 1320 EXPECT_EQ(0u, pending_mask->num_tilings()); |
1304 } | 1321 } |
1305 | 1322 |
1306 TEST_F(PictureLayerImplTest, ScaledMaskLayer) { | 1323 TEST_F(PictureLayerImplTest, ScaledMaskLayer) { |
1307 base::TimeTicks time_ticks; | 1324 base::TimeTicks time_ticks; |
1308 time_ticks += base::TimeDelta::FromMilliseconds(1); | 1325 time_ticks += base::TimeDelta::FromMilliseconds(1); |
1309 host_impl_.SetCurrentBeginFrameArgs( | 1326 host_impl_.SetCurrentBeginFrameArgs( |
1310 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); | 1327 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); |
1311 | 1328 |
1312 gfx::Size tile_size(100, 100); | 1329 gfx::Size tile_size(100, 100); |
1313 gfx::Size layer_bounds(1000, 1000); | 1330 gfx::Size layer_bounds(1000, 1000); |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1667 int num_outside = 0; | 1684 int num_outside = 0; |
1668 for (PictureLayerTiling::CoverageIterator iter( | 1685 for (PictureLayerTiling::CoverageIterator iter( |
1669 pending_layer_->HighResTiling(), 1.f, gfx::Rect(layer_bounds)); | 1686 pending_layer_->HighResTiling(), 1.f, gfx::Rect(layer_bounds)); |
1670 iter; ++iter) { | 1687 iter; ++iter) { |
1671 if (!*iter) | 1688 if (!*iter) |
1672 continue; | 1689 continue; |
1673 Tile* tile = *iter; | 1690 Tile* tile = *iter; |
1674 if (viewport_for_tile_priority.Intersects(iter.geometry_rect())) { | 1691 if (viewport_for_tile_priority.Intersects(iter.geometry_rect())) { |
1675 num_inside++; | 1692 num_inside++; |
1676 // Mark everything in viewport for tile priority as ready to draw. | 1693 // Mark everything in viewport for tile priority as ready to draw. |
1677 ManagedTileState::DrawInfo& draw_info = tile->draw_info(); | 1694 TileDrawInfo& draw_info = tile->draw_info(); |
1678 draw_info.SetSolidColorForTesting(SK_ColorRED); | 1695 draw_info.SetSolidColorForTesting(SK_ColorRED); |
1679 } else { | 1696 } else { |
1680 num_outside++; | 1697 num_outside++; |
1681 EXPECT_FALSE(tile->required_for_activation()); | 1698 EXPECT_FALSE(tile->required_for_activation()); |
1682 } | 1699 } |
1683 } | 1700 } |
1684 | 1701 |
1685 EXPECT_GT(num_inside, 0); | 1702 EXPECT_GT(num_inside, 0); |
1686 EXPECT_GT(num_outside, 0); | 1703 EXPECT_GT(num_outside, 0); |
1687 | 1704 |
(...skipping 1124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2812 pending_layer_->draw_properties().visible_content_rect = | 2829 pending_layer_->draw_properties().visible_content_rect = |
2813 gfx::Rect(0, 0, 500, 500); | 2830 gfx::Rect(0, 0, 500, 500); |
2814 pending_layer_->UpdateTiles(Occlusion(), resourceless_software_draw); | 2831 pending_layer_->UpdateTiles(Occlusion(), resourceless_software_draw); |
2815 | 2832 |
2816 std::vector<Tile*> high_res_tiles = | 2833 std::vector<Tile*> high_res_tiles = |
2817 pending_layer_->HighResTiling()->AllTilesForTesting(); | 2834 pending_layer_->HighResTiling()->AllTilesForTesting(); |
2818 for (std::vector<Tile*>::iterator tile_it = high_res_tiles.begin(); | 2835 for (std::vector<Tile*>::iterator tile_it = high_res_tiles.begin(); |
2819 tile_it != high_res_tiles.end(); | 2836 tile_it != high_res_tiles.end(); |
2820 ++tile_it) { | 2837 ++tile_it) { |
2821 Tile* tile = *tile_it; | 2838 Tile* tile = *tile_it; |
2822 ManagedTileState::DrawInfo& draw_info = tile->draw_info(); | 2839 TileDrawInfo& draw_info = tile->draw_info(); |
2823 draw_info.SetSolidColorForTesting(SK_ColorRED); | 2840 draw_info.SetSolidColorForTesting(SK_ColorRED); |
2824 } | 2841 } |
2825 | 2842 |
2826 non_ideal_tile_count = 0; | 2843 non_ideal_tile_count = 0; |
2827 low_res_tile_count = 0; | 2844 low_res_tile_count = 0; |
2828 high_res_tile_count = 0; | 2845 high_res_tile_count = 0; |
2829 queue = pending_layer_->CreateRasterQueue(true); | 2846 queue = pending_layer_->CreateRasterQueue(true); |
2830 while (!queue->IsEmpty()) { | 2847 while (!queue->IsEmpty()) { |
2831 Tile* tile = queue->Top(); | 2848 Tile* tile = queue->Top(); |
2832 TilePriority priority = tile->priority(PENDING_TREE); | 2849 TilePriority priority = tile->priority(PENDING_TREE); |
(...skipping 766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3599 EXPECT_EQ( | 3616 EXPECT_EQ( |
3600 gfx::Size(2500u, 5000u).ToString(), | 3617 gfx::Size(2500u, 5000u).ToString(), |
3601 render_pass->shared_quad_state_list.front()->content_bounds.ToString()); | 3618 render_pass->shared_quad_state_list.front()->content_bounds.ToString()); |
3602 // The visible_content_rect should be scaled by the | 3619 // The visible_content_rect should be scaled by the |
3603 // MaximumTilingContentsScale on the layer. | 3620 // MaximumTilingContentsScale on the layer. |
3604 EXPECT_EQ(gfx::Rect(0u, 0u, 2500u, 5000u).ToString(), | 3621 EXPECT_EQ(gfx::Rect(0u, 0u, 2500u, 5000u).ToString(), |
3605 render_pass->shared_quad_state_list.front() | 3622 render_pass->shared_quad_state_list.front() |
3606 ->visible_content_rect.ToString()); | 3623 ->visible_content_rect.ToString()); |
3607 } | 3624 } |
3608 | 3625 |
3609 TEST_F(PictureLayerImplTest, UpdateTilesForMasksWithNoVisibleContent) { | |
3610 gfx::Size tile_size(400, 400); | |
3611 gfx::Size bounds(100000, 100); | |
3612 | |
3613 host_impl_.CreatePendingTree(); | |
3614 | |
3615 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_.pending_tree(), 1); | |
3616 | |
3617 scoped_refptr<FakePicturePileImpl> pending_pile = | |
3618 FakePicturePileImpl::CreateFilledPile(tile_size, bounds); | |
3619 scoped_ptr<FakePictureLayerImpl> layer_with_mask = | |
3620 FakePictureLayerImpl::CreateWithRasterSource(host_impl_.pending_tree(), 2, | |
3621 pending_pile); | |
3622 layer_with_mask->SetBounds(bounds); | |
3623 layer_with_mask->SetContentBounds(bounds); | |
3624 | |
3625 scoped_refptr<FakePicturePileImpl> mask_pile = | |
3626 FakePicturePileImpl::CreateFilledPile(tile_size, bounds); | |
3627 scoped_ptr<FakePictureLayerImpl> mask = | |
3628 FakePictureLayerImpl::CreateMaskWithRasterSource( | |
3629 host_impl_.pending_tree(), 3, mask_pile); | |
3630 mask->SetBounds(bounds); | |
3631 mask->SetContentBounds(bounds); | |
3632 mask->SetDrawsContent(true); | |
3633 layer_with_mask->SetMaskLayer(mask.Pass()); | |
3634 | |
3635 FakePictureLayerImpl* pending_mask = | |
3636 static_cast<FakePictureLayerImpl*>(layer_with_mask->mask_layer()); | |
3637 | |
3638 scoped_ptr<FakePictureLayerImpl> child_of_layer_with_mask = | |
3639 FakePictureLayerImpl::CreateWithRasterSource(host_impl_.pending_tree(), 4, | |
3640 pending_pile); | |
3641 child_of_layer_with_mask->SetBounds(bounds); | |
3642 child_of_layer_with_mask->SetContentBounds(bounds); | |
3643 child_of_layer_with_mask->SetDrawsContent(true); | |
3644 layer_with_mask->AddChild(child_of_layer_with_mask.Pass()); | |
3645 root->AddChild(layer_with_mask.Pass()); | |
3646 | |
3647 host_impl_.pending_tree()->SetRootLayer(root.Pass()); | |
3648 | |
3649 EXPECT_EQ(0u, pending_mask->num_tilings()); | |
3650 host_impl_.pending_tree()->UpdateDrawProperties(); | |
3651 EXPECT_NE(0u, pending_mask->num_tilings()); | |
3652 } | |
3653 | |
3654 class PictureLayerImplTestWithDelegatingRenderer : public PictureLayerImplTest { | 3626 class PictureLayerImplTestWithDelegatingRenderer : public PictureLayerImplTest { |
3655 public: | 3627 public: |
3656 PictureLayerImplTestWithDelegatingRenderer() : PictureLayerImplTest() {} | 3628 PictureLayerImplTestWithDelegatingRenderer() : PictureLayerImplTest() {} |
3657 | 3629 |
3658 void InitializeRenderer() override { | 3630 void InitializeRenderer() override { |
3659 host_impl_.InitializeRenderer(FakeOutputSurface::CreateDelegating3d()); | 3631 host_impl_.InitializeRenderer(FakeOutputSurface::CreateDelegating3d()); |
3660 } | 3632 } |
3661 }; | 3633 }; |
3662 | 3634 |
3663 TEST_F(PictureLayerImplTestWithDelegatingRenderer, | 3635 TEST_F(PictureLayerImplTestWithDelegatingRenderer, |
(...skipping 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4758 result = layer->CalculateTileSize(gfx::Size(447, 400)); | 4730 result = layer->CalculateTileSize(gfx::Size(447, 400)); |
4759 EXPECT_EQ(result.width(), 448); | 4731 EXPECT_EQ(result.width(), 448); |
4760 EXPECT_EQ(result.height(), 448); | 4732 EXPECT_EQ(result.height(), 448); |
4761 result = layer->CalculateTileSize(gfx::Size(500, 499)); | 4733 result = layer->CalculateTileSize(gfx::Size(500, 499)); |
4762 EXPECT_EQ(result.width(), 512); | 4734 EXPECT_EQ(result.width(), 512); |
4763 EXPECT_EQ(result.height(), 500 + 2); | 4735 EXPECT_EQ(result.height(), 500 + 2); |
4764 } | 4736 } |
4765 | 4737 |
4766 } // namespace | 4738 } // namespace |
4767 } // namespace cc | 4739 } // namespace cc |
OLD | NEW |