| OLD | NEW |
| 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 "base/message_loop/message_loop.h" | 5 #include "base/message_loop/message_loop.h" |
| 6 #include "cc/output/gl_renderer.h" | 6 #include "cc/output/gl_renderer.h" |
| 7 #include "cc/quads/draw_quad.h" | 7 #include "cc/quads/draw_quad.h" |
| 8 #include "cc/quads/picture_draw_quad.h" | 8 #include "cc/quads/picture_draw_quad.h" |
| 9 #include "cc/quads/texture_draw_quad.h" | 9 #include "cc/quads/texture_draw_quad.h" |
| 10 #include "cc/resources/video_resource_updater.h" | 10 #include "cc/resources/video_resource_updater.h" |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 : SkPackARGB32NoCheck(SkColorGetA(texel_stripe_color), | 130 : SkPackARGB32NoCheck(SkColorGetA(texel_stripe_color), |
| 131 SkColorGetR(texel_stripe_color), | 131 SkColorGetR(texel_stripe_color), |
| 132 SkColorGetG(texel_stripe_color), | 132 SkColorGetG(texel_stripe_color), |
| 133 SkColorGetB(texel_stripe_color)); | 133 SkColorGetB(texel_stripe_color)); |
| 134 std::vector<uint32_t> pixels(rect.size().GetArea(), pixel_color); | 134 std::vector<uint32_t> pixels(rect.size().GetArea(), pixel_color); |
| 135 for (int i = rect.height() / 4; i < (rect.height() * 3 / 4); ++i) { | 135 for (int i = rect.height() / 4; i < (rect.height() * 3 / 4); ++i) { |
| 136 for (int k = rect.width() / 4; k < (rect.width() * 3 / 4); ++k) { | 136 for (int k = rect.width() / 4; k < (rect.width() * 3 / 4); ++k) { |
| 137 pixels[i * rect.width() + k] = pixel_stripe_color; | 137 pixels[i * rect.width() + k] = pixel_stripe_color; |
| 138 } | 138 } |
| 139 } | 139 } |
| 140 ResourceProvider::ResourceId resource = resource_provider->CreateResource( | 140 ResourceId resource = resource_provider->CreateResource( |
| 141 rect.size(), GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, | 141 rect.size(), GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
| 142 RGBA_8888); | 142 RGBA_8888); |
| 143 resource_provider->SetPixels(resource, | 143 resource_provider->SetPixels(resource, |
| 144 reinterpret_cast<uint8_t*>(&pixels.front()), | 144 reinterpret_cast<uint8_t*>(&pixels.front()), |
| 145 rect, rect, gfx::Vector2d()); | 145 rect, rect, gfx::Vector2d()); |
| 146 | 146 |
| 147 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; | 147 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
| 148 const gfx::PointF uv_top_left(0.0f, 0.0f); | 148 const gfx::PointF uv_top_left(0.0f, 0.0f); |
| 149 const gfx::PointF uv_bottom_right(1.0f, 1.0f); | 149 const gfx::PointF uv_bottom_right(1.0f, 1.0f); |
| 150 const bool flipped = false; | 150 const bool flipped = false; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 165 RenderPass* render_pass) { | 165 RenderPass* render_pass) { |
| 166 SkPMColor pixel_color = premultiplied_alpha ? | 166 SkPMColor pixel_color = premultiplied_alpha ? |
| 167 SkPreMultiplyColor(texel_color) : | 167 SkPreMultiplyColor(texel_color) : |
| 168 SkPackARGB32NoCheck(SkColorGetA(texel_color), | 168 SkPackARGB32NoCheck(SkColorGetA(texel_color), |
| 169 SkColorGetR(texel_color), | 169 SkColorGetR(texel_color), |
| 170 SkColorGetG(texel_color), | 170 SkColorGetG(texel_color), |
| 171 SkColorGetB(texel_color)); | 171 SkColorGetB(texel_color)); |
| 172 size_t num_pixels = static_cast<size_t>(rect.width()) * rect.height(); | 172 size_t num_pixels = static_cast<size_t>(rect.width()) * rect.height(); |
| 173 std::vector<uint32_t> pixels(num_pixels, pixel_color); | 173 std::vector<uint32_t> pixels(num_pixels, pixel_color); |
| 174 | 174 |
| 175 ResourceProvider::ResourceId resource = resource_provider->CreateResource( | 175 ResourceId resource = resource_provider->CreateResource( |
| 176 rect.size(), GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, | 176 rect.size(), GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
| 177 RGBA_8888); | 177 RGBA_8888); |
| 178 resource_provider->CopyToResource( | 178 resource_provider->CopyToResource( |
| 179 resource, reinterpret_cast<uint8_t*>(&pixels.front()), rect.size()); | 179 resource, reinterpret_cast<uint8_t*>(&pixels.front()), rect.size()); |
| 180 | 180 |
| 181 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; | 181 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
| 182 | 182 |
| 183 const gfx::PointF uv_top_left(0.0f, 0.0f); | 183 const gfx::PointF uv_top_left(0.0f, 0.0f); |
| 184 const gfx::PointF uv_bottom_right(1.0f, 1.0f); | 184 const gfx::PointF uv_bottom_right(1.0f, 1.0f); |
| 185 const bool flipped = false; | 185 const bool flipped = false; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 VideoFrameExternalResources resources = | 217 VideoFrameExternalResources resources = |
| 218 video_resource_updater->CreateExternalResourcesFromVideoFrame( | 218 video_resource_updater->CreateExternalResourcesFromVideoFrame( |
| 219 video_frame); | 219 video_frame); |
| 220 | 220 |
| 221 EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); | 221 EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); |
| 222 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), | 222 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), |
| 223 resources.mailboxes.size()); | 223 resources.mailboxes.size()); |
| 224 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), | 224 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), |
| 225 resources.release_callbacks.size()); | 225 resources.release_callbacks.size()); |
| 226 | 226 |
| 227 ResourceProvider::ResourceId y_resource = | 227 ResourceId y_resource = resource_provider->CreateResourceFromTextureMailbox( |
| 228 resource_provider->CreateResourceFromTextureMailbox( | 228 resources.mailboxes[media::VideoFrame::kYPlane], |
| 229 resources.mailboxes[media::VideoFrame::kYPlane], | 229 SingleReleaseCallbackImpl::Create( |
| 230 SingleReleaseCallbackImpl::Create( | 230 resources.release_callbacks[media::VideoFrame::kYPlane])); |
| 231 resources.release_callbacks[media::VideoFrame::kYPlane])); | 231 ResourceId u_resource = resource_provider->CreateResourceFromTextureMailbox( |
| 232 ResourceProvider::ResourceId u_resource = | 232 resources.mailboxes[media::VideoFrame::kUPlane], |
| 233 resource_provider->CreateResourceFromTextureMailbox( | 233 SingleReleaseCallbackImpl::Create( |
| 234 resources.mailboxes[media::VideoFrame::kUPlane], | 234 resources.release_callbacks[media::VideoFrame::kUPlane])); |
| 235 SingleReleaseCallbackImpl::Create( | 235 ResourceId v_resource = resource_provider->CreateResourceFromTextureMailbox( |
| 236 resources.release_callbacks[media::VideoFrame::kUPlane])); | 236 resources.mailboxes[media::VideoFrame::kVPlane], |
| 237 ResourceProvider::ResourceId v_resource = | 237 SingleReleaseCallbackImpl::Create( |
| 238 resource_provider->CreateResourceFromTextureMailbox( | 238 resources.release_callbacks[media::VideoFrame::kVPlane])); |
| 239 resources.mailboxes[media::VideoFrame::kVPlane], | 239 ResourceId a_resource = 0; |
| 240 SingleReleaseCallbackImpl::Create( | |
| 241 resources.release_callbacks[media::VideoFrame::kVPlane])); | |
| 242 ResourceProvider::ResourceId a_resource = 0; | |
| 243 if (with_alpha) { | 240 if (with_alpha) { |
| 244 a_resource = resource_provider->CreateResourceFromTextureMailbox( | 241 a_resource = resource_provider->CreateResourceFromTextureMailbox( |
| 245 resources.mailboxes[media::VideoFrame::kAPlane], | 242 resources.mailboxes[media::VideoFrame::kAPlane], |
| 246 SingleReleaseCallbackImpl::Create( | 243 SingleReleaseCallbackImpl::Create( |
| 247 resources.release_callbacks[media::VideoFrame::kAPlane])); | 244 resources.release_callbacks[media::VideoFrame::kAPlane])); |
| 248 } | 245 } |
| 249 | 246 |
| 250 const gfx::Size ya_tex_size = video_frame->coded_size(); | 247 const gfx::Size ya_tex_size = video_frame->coded_size(); |
| 251 const gfx::Size uv_tex_size = media::VideoFrame::PlaneSize( | 248 const gfx::Size uv_tex_size = media::VideoFrame::PlaneSize( |
| 252 video_frame->format(), media::VideoFrame::kUPlane, | 249 video_frame->format(), media::VideoFrame::kUPlane, |
| (...skipping 1419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1672 canvas.clear(SK_ColorTRANSPARENT); | 1669 canvas.clear(SK_ColorTRANSPARENT); |
| 1673 gfx::Rect rect = mask_rect; | 1670 gfx::Rect rect = mask_rect; |
| 1674 while (!rect.IsEmpty()) { | 1671 while (!rect.IsEmpty()) { |
| 1675 rect.Inset(6, 6, 4, 4); | 1672 rect.Inset(6, 6, 4, 4); |
| 1676 canvas.drawRect( | 1673 canvas.drawRect( |
| 1677 SkRect::MakeXYWH(rect.x(), rect.y(), rect.width(), rect.height()), | 1674 SkRect::MakeXYWH(rect.x(), rect.y(), rect.width(), rect.height()), |
| 1678 paint); | 1675 paint); |
| 1679 rect.Inset(6, 6, 4, 4); | 1676 rect.Inset(6, 6, 4, 4); |
| 1680 } | 1677 } |
| 1681 | 1678 |
| 1682 ResourceProvider::ResourceId mask_resource_id = | 1679 ResourceId mask_resource_id = this->resource_provider_->CreateResource( |
| 1683 this->resource_provider_->CreateResource( | 1680 mask_rect.size(), GL_CLAMP_TO_EDGE, |
| 1684 mask_rect.size(), GL_CLAMP_TO_EDGE, | 1681 ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888); |
| 1685 ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888); | |
| 1686 { | 1682 { |
| 1687 SkAutoLockPixels lock(bitmap); | 1683 SkAutoLockPixels lock(bitmap); |
| 1688 this->resource_provider_->CopyToResource( | 1684 this->resource_provider_->CopyToResource( |
| 1689 mask_resource_id, reinterpret_cast<uint8_t*>(bitmap.getPixels()), | 1685 mask_resource_id, reinterpret_cast<uint8_t*>(bitmap.getPixels()), |
| 1690 mask_rect.size()); | 1686 mask_rect.size()); |
| 1691 } | 1687 } |
| 1692 | 1688 |
| 1693 // This RenderPassDrawQuad does not include the full |viewport_rect| which is | 1689 // This RenderPassDrawQuad does not include the full |viewport_rect| which is |
| 1694 // the size of the child render pass. | 1690 // the size of the child render pass. |
| 1695 gfx::Rect sub_rect = gfx::Rect(50, 50, 200, 100); | 1691 gfx::Rect sub_rect = gfx::Rect(50, 50, 200, 100); |
| (...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2457 { | 2453 { |
| 2458 SkAutoLockPixels lock(bitmap); | 2454 SkAutoLockPixels lock(bitmap); |
| 2459 SkCanvas canvas(bitmap); | 2455 SkCanvas canvas(bitmap); |
| 2460 canvas.drawPoint(0, 0, SK_ColorGREEN); | 2456 canvas.drawPoint(0, 0, SK_ColorGREEN); |
| 2461 canvas.drawPoint(0, 1, SK_ColorBLUE); | 2457 canvas.drawPoint(0, 1, SK_ColorBLUE); |
| 2462 canvas.drawPoint(1, 0, SK_ColorBLUE); | 2458 canvas.drawPoint(1, 0, SK_ColorBLUE); |
| 2463 canvas.drawPoint(1, 1, SK_ColorGREEN); | 2459 canvas.drawPoint(1, 1, SK_ColorGREEN); |
| 2464 } | 2460 } |
| 2465 | 2461 |
| 2466 gfx::Size tile_size(2, 2); | 2462 gfx::Size tile_size(2, 2); |
| 2467 ResourceProvider::ResourceId resource = | 2463 ResourceId resource = this->resource_provider_->CreateResource( |
| 2468 this->resource_provider_->CreateResource( | 2464 tile_size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
| 2469 tile_size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, | 2465 RGBA_8888); |
| 2470 RGBA_8888); | |
| 2471 | 2466 |
| 2472 { | 2467 { |
| 2473 SkAutoLockPixels lock(bitmap); | 2468 SkAutoLockPixels lock(bitmap); |
| 2474 this->resource_provider_->CopyToResource( | 2469 this->resource_provider_->CopyToResource( |
| 2475 resource, static_cast<uint8_t*>(bitmap.getPixels()), tile_size); | 2470 resource, static_cast<uint8_t*>(bitmap.getPixels()), tile_size); |
| 2476 } | 2471 } |
| 2477 | 2472 |
| 2478 RenderPassId id(1, 1); | 2473 RenderPassId id(1, 1); |
| 2479 gfx::Transform transform_to_root; | 2474 gfx::Transform transform_to_root; |
| 2480 scoped_ptr<RenderPass> pass = | 2475 scoped_ptr<RenderPass> pass = |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2509 { | 2504 { |
| 2510 SkAutoLockPixels lock(bitmap); | 2505 SkAutoLockPixels lock(bitmap); |
| 2511 SkCanvas canvas(bitmap); | 2506 SkCanvas canvas(bitmap); |
| 2512 canvas.drawPoint(0, 0, SK_ColorGREEN); | 2507 canvas.drawPoint(0, 0, SK_ColorGREEN); |
| 2513 canvas.drawPoint(0, 1, SK_ColorBLUE); | 2508 canvas.drawPoint(0, 1, SK_ColorBLUE); |
| 2514 canvas.drawPoint(1, 0, SK_ColorBLUE); | 2509 canvas.drawPoint(1, 0, SK_ColorBLUE); |
| 2515 canvas.drawPoint(1, 1, SK_ColorGREEN); | 2510 canvas.drawPoint(1, 1, SK_ColorGREEN); |
| 2516 } | 2511 } |
| 2517 | 2512 |
| 2518 gfx::Size tile_size(2, 2); | 2513 gfx::Size tile_size(2, 2); |
| 2519 ResourceProvider::ResourceId resource = | 2514 ResourceId resource = this->resource_provider_->CreateResource( |
| 2520 this->resource_provider_->CreateResource( | 2515 tile_size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
| 2521 tile_size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, | 2516 RGBA_8888); |
| 2522 RGBA_8888); | |
| 2523 | 2517 |
| 2524 { | 2518 { |
| 2525 SkAutoLockPixels lock(bitmap); | 2519 SkAutoLockPixels lock(bitmap); |
| 2526 this->resource_provider_->CopyToResource( | 2520 this->resource_provider_->CopyToResource( |
| 2527 resource, static_cast<uint8_t*>(bitmap.getPixels()), tile_size); | 2521 resource, static_cast<uint8_t*>(bitmap.getPixels()), tile_size); |
| 2528 } | 2522 } |
| 2529 | 2523 |
| 2530 RenderPassId id(1, 1); | 2524 RenderPassId id(1, 1); |
| 2531 gfx::Transform transform_to_root; | 2525 gfx::Transform transform_to_root; |
| 2532 scoped_ptr<RenderPass> pass = | 2526 scoped_ptr<RenderPass> pass = |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2562 { | 2556 { |
| 2563 SkAutoLockPixels lock(bitmap); | 2557 SkAutoLockPixels lock(bitmap); |
| 2564 SkCanvas canvas(bitmap); | 2558 SkCanvas canvas(bitmap); |
| 2565 canvas.drawPoint(0, 0, SK_ColorGREEN); | 2559 canvas.drawPoint(0, 0, SK_ColorGREEN); |
| 2566 canvas.drawPoint(0, 1, SK_ColorBLUE); | 2560 canvas.drawPoint(0, 1, SK_ColorBLUE); |
| 2567 canvas.drawPoint(1, 0, SK_ColorBLUE); | 2561 canvas.drawPoint(1, 0, SK_ColorBLUE); |
| 2568 canvas.drawPoint(1, 1, SK_ColorGREEN); | 2562 canvas.drawPoint(1, 1, SK_ColorGREEN); |
| 2569 } | 2563 } |
| 2570 | 2564 |
| 2571 gfx::Size tile_size(2, 2); | 2565 gfx::Size tile_size(2, 2); |
| 2572 ResourceProvider::ResourceId resource = | 2566 ResourceId resource = this->resource_provider_->CreateResource( |
| 2573 this->resource_provider_->CreateResource( | 2567 tile_size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
| 2574 tile_size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, | 2568 RGBA_8888); |
| 2575 RGBA_8888); | |
| 2576 | 2569 |
| 2577 { | 2570 { |
| 2578 SkAutoLockPixels lock(bitmap); | 2571 SkAutoLockPixels lock(bitmap); |
| 2579 this->resource_provider_->CopyToResource( | 2572 this->resource_provider_->CopyToResource( |
| 2580 resource, static_cast<uint8_t*>(bitmap.getPixels()), tile_size); | 2573 resource, static_cast<uint8_t*>(bitmap.getPixels()), tile_size); |
| 2581 } | 2574 } |
| 2582 | 2575 |
| 2583 RenderPassId id(1, 1); | 2576 RenderPassId id(1, 1); |
| 2584 gfx::Transform transform_to_root; | 2577 gfx::Transform transform_to_root; |
| 2585 scoped_ptr<RenderPass> pass = | 2578 scoped_ptr<RenderPass> pass = |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2922 SkPreMultiplyColor(SkColorSetARGB(255, 0, 128, 0)), | 2915 SkPreMultiplyColor(SkColorSetARGB(255, 0, 128, 0)), |
| 2923 SkPreMultiplyColor(SkColorSetARGB(255, 0, 64, 0)), | 2916 SkPreMultiplyColor(SkColorSetARGB(255, 0, 64, 0)), |
| 2924 SkPreMultiplyColor(SkColorSetARGB(255, 0, 0, 0)), | 2917 SkPreMultiplyColor(SkColorSetARGB(255, 0, 0, 0)), |
| 2925 }; | 2918 }; |
| 2926 uint32_t pixels[16] = { | 2919 uint32_t pixels[16] = { |
| 2927 colors[0], colors[0], colors[1], colors[1], | 2920 colors[0], colors[0], colors[1], colors[1], |
| 2928 colors[0], colors[0], colors[1], colors[1], | 2921 colors[0], colors[0], colors[1], colors[1], |
| 2929 colors[2], colors[2], colors[3], colors[3], | 2922 colors[2], colors[2], colors[3], colors[3], |
| 2930 colors[2], colors[2], colors[3], colors[3], | 2923 colors[2], colors[2], colors[3], colors[3], |
| 2931 }; | 2924 }; |
| 2932 ResourceProvider::ResourceId resource = | 2925 ResourceId resource = this->resource_provider_->CreateResource( |
| 2933 this->resource_provider_->CreateResource( | 2926 texture_size, GL_REPEAT, ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
| 2934 texture_size, GL_REPEAT, ResourceProvider::TEXTURE_HINT_IMMUTABLE, | 2927 RGBA_8888); |
| 2935 RGBA_8888); | |
| 2936 this->resource_provider_->CopyToResource( | 2928 this->resource_provider_->CopyToResource( |
| 2937 resource, reinterpret_cast<uint8_t*>(pixels), texture_size); | 2929 resource, reinterpret_cast<uint8_t*>(pixels), texture_size); |
| 2938 | 2930 |
| 2939 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; | 2931 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
| 2940 TextureDrawQuad* texture_quad = | 2932 TextureDrawQuad* texture_quad = |
| 2941 pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 2933 pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
| 2942 texture_quad->SetNew( | 2934 texture_quad->SetNew( |
| 2943 shared_state, gfx::Rect(this->device_viewport_size_), gfx::Rect(), | 2935 shared_state, gfx::Rect(this->device_viewport_size_), gfx::Rect(), |
| 2944 gfx::Rect(this->device_viewport_size_), resource, | 2936 gfx::Rect(this->device_viewport_size_), resource, |
| 2945 true, // premultiplied_alpha | 2937 true, // premultiplied_alpha |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3060 ? FILE_PATH_LITERAL("four_blue_green_checkers.png") | 3052 ? FILE_PATH_LITERAL("four_blue_green_checkers.png") |
| 3061 : FILE_PATH_LITERAL("checkers_big.png"); | 3053 : FILE_PATH_LITERAL("checkers_big.png"); |
| 3062 EXPECT_TRUE(this->RunPixelTest(&pass_list, base::FilePath(path), | 3054 EXPECT_TRUE(this->RunPixelTest(&pass_list, base::FilePath(path), |
| 3063 ExactPixelComparator(true))); | 3055 ExactPixelComparator(true))); |
| 3064 } | 3056 } |
| 3065 | 3057 |
| 3066 #endif // !defined(OS_ANDROID) | 3058 #endif // !defined(OS_ANDROID) |
| 3067 | 3059 |
| 3068 } // namespace | 3060 } // namespace |
| 3069 } // namespace cc | 3061 } // namespace cc |
| OLD | NEW |