Chromium Code Reviews| 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/layers/append_quads_data.h" | 6 #include "cc/layers/append_quads_data.h" |
| 7 #include "cc/output/gl_renderer.h" | 7 #include "cc/output/gl_renderer.h" |
| 8 #include "cc/quads/draw_quad.h" | 8 #include "cc/quads/draw_quad.h" |
| 9 #include "cc/quads/picture_draw_quad.h" | 9 #include "cc/quads/picture_draw_quad.h" |
| 10 #include "cc/quads/texture_draw_quad.h" | 10 #include "cc/quads/texture_draw_quad.h" |
| 11 #include "cc/resources/video_resource_updater.h" | |
| 11 #include "cc/test/fake_picture_pile_impl.h" | 12 #include "cc/test/fake_picture_pile_impl.h" |
| 12 #include "cc/test/pixel_test.h" | 13 #include "cc/test/pixel_test.h" |
| 13 #include "gpu/GLES2/gl2extchromium.h" | 14 #include "gpu/GLES2/gl2extchromium.h" |
| 14 #include "gpu/command_buffer/client/gles2_interface.h" | 15 #include "gpu/command_buffer/client/gles2_interface.h" |
| 16 #include "media/base/video_frame.h" | |
| 15 #include "third_party/skia/include/core/SkBitmapDevice.h" | 17 #include "third_party/skia/include/core/SkBitmapDevice.h" |
| 16 #include "third_party/skia/include/core/SkImageFilter.h" | 18 #include "third_party/skia/include/core/SkImageFilter.h" |
| 17 #include "third_party/skia/include/core/SkMatrix.h" | 19 #include "third_party/skia/include/core/SkMatrix.h" |
| 18 #include "third_party/skia/include/effects/SkColorFilterImageFilter.h" | 20 #include "third_party/skia/include/effects/SkColorFilterImageFilter.h" |
| 19 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" | 21 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" |
| 20 #include "ui/gfx/rect_conversions.h" | 22 #include "ui/gfx/rect_conversions.h" |
| 21 | 23 |
| 22 using gpu::gles2::GLES2Interface; | 24 using gpu::gles2::GLES2Interface; |
| 23 | 25 |
| 24 namespace cc { | 26 namespace cc { |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 397 &pass_list, | 399 &pass_list, |
| 398 PixelTest::NoOffscreenContext, | 400 PixelTest::NoOffscreenContext, |
| 399 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")), | 401 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")), |
| 400 FuzzyPixelOffByOneComparator(true))); | 402 FuzzyPixelOffByOneComparator(true))); |
| 401 } | 403 } |
| 402 | 404 |
| 403 class VideoGLRendererPixelTest : public GLRendererPixelTest { | 405 class VideoGLRendererPixelTest : public GLRendererPixelTest { |
| 404 protected: | 406 protected: |
| 405 scoped_ptr<YUVVideoDrawQuad> CreateTestYUVVideoDrawQuad( | 407 scoped_ptr<YUVVideoDrawQuad> CreateTestYUVVideoDrawQuad( |
| 406 SharedQuadState* shared_state, | 408 SharedQuadState* shared_state, |
| 407 bool with_alpha, | 409 media::VideoFrame::Format format, |
| 408 bool is_transparent, | 410 bool is_transparent, |
| 409 const gfx::RectF& tex_coord_rect) { | 411 const gfx::RectF& tex_coord_rect) { |
| 412 const bool with_alpha = (format == media::VideoFrame::YV12A); | |
| 410 const gfx::Rect rect(this->device_viewport_size_); | 413 const gfx::Rect rect(this->device_viewport_size_); |
| 411 const gfx::Rect uv_rect( | |
| 412 0, 0, (rect.width() + 1) / 2, (rect.height() + 1) / 2); | |
| 413 const gfx::Rect opaque_rect(0, 0, 0, 0); | 414 const gfx::Rect opaque_rect(0, 0, 0, 0); |
| 414 | 415 |
| 415 ResourceProvider::ResourceId y_resource = | 416 scoped_refptr<media::VideoFrame> video_frame = |
| 416 resource_provider_->CreateResource(rect.size(), | 417 media::VideoFrame::CreateFrame( |
| 417 GL_CLAMP_TO_EDGE, | 418 format, rect.size(), rect, rect.size(), base::TimeDelta()); |
| 418 ResourceProvider::TextureUsageAny, | |
| 419 LUMINANCE_8); | |
| 420 ResourceProvider::ResourceId u_resource = | |
| 421 resource_provider_->CreateResource(uv_rect.size(), | |
| 422 GL_CLAMP_TO_EDGE, | |
| 423 ResourceProvider::TextureUsageAny, | |
| 424 LUMINANCE_8); | |
| 425 ResourceProvider::ResourceId v_resource = | |
| 426 resource_provider_->CreateResource(uv_rect.size(), | |
| 427 GL_CLAMP_TO_EDGE, | |
| 428 ResourceProvider::TextureUsageAny, | |
| 429 LUMINANCE_8); | |
| 430 ResourceProvider::ResourceId a_resource = 0; | |
| 431 if (with_alpha) { | |
| 432 a_resource = resource_provider_->CreateResource( | |
| 433 this->device_viewport_size_, | |
| 434 GL_CLAMP_TO_EDGE, | |
| 435 ResourceProvider::TextureUsageAny, | |
| 436 LUMINANCE_8); | |
| 437 } | |
| 438 | 419 |
| 439 const int y_plane_size = rect.size().GetArea(); | |
| 440 const int uv_plane_size = uv_rect.size().GetArea(); | |
| 441 scoped_ptr<uint8_t[]> y_plane(new uint8_t[y_plane_size]); | |
| 442 scoped_ptr<uint8_t[]> u_plane(new uint8_t[uv_plane_size]); | |
| 443 scoped_ptr<uint8_t[]> v_plane(new uint8_t[uv_plane_size]); | |
| 444 scoped_ptr<uint8_t[]> a_plane; | |
| 445 if (with_alpha) | |
| 446 a_plane.reset(new uint8_t[y_plane_size]); | |
| 447 // YUV values representing a striped pattern, for validating texture | 420 // YUV values representing a striped pattern, for validating texture |
| 448 // coordinates for sampling. | 421 // coordinates for sampling. |
| 449 uint8_t y_value = 0; | 422 uint8_t y_value = 0; |
| 450 uint8_t u_value = 0; | 423 uint8_t u_value = 0; |
| 451 uint8_t v_value = 0; | 424 uint8_t v_value = 0; |
| 452 for (int i = 0; i < y_plane_size; ++i) | 425 for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) { |
| 453 y_plane.get()[i] = (y_value += 1); | 426 uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) + |
| 454 for (int i = 0; i < uv_plane_size; ++i) { | 427 video_frame->stride(media::VideoFrame::kYPlane) * i; |
| 455 u_plane.get()[i] = (u_value += 3); | 428 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane); |
| 456 v_plane.get()[i] = (v_value += 5); | 429 ++j) { |
| 430 y_row[j] = (y_value += 1); | |
| 431 } | |
| 432 } | |
| 433 for (int i = 0; i < video_frame->rows(media::VideoFrame::kUPlane); ++i) { | |
| 434 uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) + | |
| 435 video_frame->stride(media::VideoFrame::kUPlane) * i; | |
| 436 uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) + | |
| 437 video_frame->stride(media::VideoFrame::kVPlane) * i; | |
| 438 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane); | |
| 439 ++j) { | |
| 440 u_row[j] = (u_value += 3); | |
| 441 v_row[j] = (v_value += 5); | |
| 442 } | |
| 457 } | 443 } |
| 458 if (with_alpha) | 444 if (with_alpha) |
| 459 memset(a_plane.get(), is_transparent ? 0 : 128, y_plane_size); | 445 memset(video_frame->data(media::VideoFrame::kAPlane), |
| 446 is_transparent ? 0 : 128, | |
| 447 video_frame->stride(media::VideoFrame::kAPlane) * | |
| 448 video_frame->rows(media::VideoFrame::kAPlane)); | |
| 460 | 449 |
| 461 resource_provider_->SetPixels( | 450 VideoFrameExternalResources resources = |
| 462 y_resource, y_plane.get(), rect, rect, gfx::Vector2d()); | 451 video_resource_updater_->CreateExternalResourcesFromVideoFrame( |
| 463 resource_provider_->SetPixels( | 452 video_frame); |
| 464 u_resource, u_plane.get(), uv_rect, uv_rect, gfx::Vector2d()); | 453 |
| 465 resource_provider_->SetPixels( | 454 EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); |
| 466 v_resource, v_plane.get(), uv_rect, uv_rect, gfx::Vector2d()); | 455 EXPECT_EQ(media::VideoFrame::NumPlanes(format), resources.mailboxes.size()); |
| 456 EXPECT_EQ(media::VideoFrame::NumPlanes(format), | |
| 457 resources.release_callbacks.size()); | |
| 458 | |
| 459 ResourceProvider::ResourceId y_resource = | |
| 460 resource_provider_->CreateResourceFromTextureMailbox( | |
| 461 resources.mailboxes[media::VideoFrame::kYPlane], | |
| 462 SingleReleaseCallback::Create( | |
| 463 resources.release_callbacks[media::VideoFrame::kYPlane])); | |
| 464 ResourceProvider::ResourceId u_resource = | |
| 465 resource_provider_->CreateResourceFromTextureMailbox( | |
| 466 resources.mailboxes[media::VideoFrame::kUPlane], | |
| 467 SingleReleaseCallback::Create( | |
| 468 resources.release_callbacks[media::VideoFrame::kUPlane])); | |
| 469 ResourceProvider::ResourceId v_resource = | |
| 470 resource_provider_->CreateResourceFromTextureMailbox( | |
| 471 resources.mailboxes[media::VideoFrame::kVPlane], | |
| 472 SingleReleaseCallback::Create( | |
| 473 resources.release_callbacks[media::VideoFrame::kVPlane])); | |
| 474 ResourceProvider::ResourceId a_resource = 0; | |
| 467 if (with_alpha) { | 475 if (with_alpha) { |
| 468 resource_provider_->SetPixels(a_resource, a_plane.get(), rect, rect, | 476 a_resource = resource_provider_->CreateResourceFromTextureMailbox( |
| 469 gfx::Vector2d()); | 477 resources.mailboxes[media::VideoFrame::kAPlane], |
| 478 SingleReleaseCallback::Create( | |
| 479 resources.release_callbacks[media::VideoFrame::kAPlane])); | |
| 470 } | 480 } |
| 471 | 481 |
| 472 scoped_ptr<YUVVideoDrawQuad> yuv_quad = YUVVideoDrawQuad::Create(); | 482 scoped_ptr<YUVVideoDrawQuad> yuv_quad = YUVVideoDrawQuad::Create(); |
| 473 yuv_quad->SetNew(shared_state, | 483 yuv_quad->SetNew(shared_state, |
| 474 rect, | 484 rect, |
| 475 opaque_rect, | 485 opaque_rect, |
| 476 rect, | 486 rect, |
| 477 tex_coord_rect, | 487 tex_coord_rect, |
| 478 y_resource, | 488 y_resource, |
| 479 u_resource, | 489 u_resource, |
| 480 v_resource, | 490 v_resource, |
| 481 a_resource); | 491 a_resource); |
| 482 return yuv_quad.Pass(); | 492 return yuv_quad.Pass(); |
| 483 } | 493 } |
| 494 | |
| 495 virtual void SetUp() OVERRIDE { | |
| 496 GLRendererPixelTest::SetUp(); | |
| 497 video_resource_updater_.reset(new VideoResourceUpdater( | |
| 498 output_surface_->context_provider().get(), resource_provider_.get())); | |
| 499 } | |
| 500 | |
| 501 private: | |
| 502 scoped_ptr<VideoResourceUpdater> video_resource_updater_; | |
| 484 }; | 503 }; |
| 485 | 504 |
| 486 TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) { | 505 TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) { |
| 487 gfx::Rect rect(this->device_viewport_size_); | 506 gfx::Rect rect(this->device_viewport_size_); |
| 488 | 507 |
| 489 RenderPass::Id id(1, 1); | 508 RenderPass::Id id(1, 1); |
| 490 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 509 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
| 491 | 510 |
| 492 scoped_ptr<SharedQuadState> shared_state = | 511 scoped_ptr<SharedQuadState> shared_state = |
| 493 CreateTestSharedQuadState(gfx::Transform(), rect); | 512 CreateTestSharedQuadState(gfx::Transform(), rect); |
| 494 | 513 |
| 495 scoped_ptr<YUVVideoDrawQuad> yuv_quad = CreateTestYUVVideoDrawQuad( | 514 scoped_ptr<YUVVideoDrawQuad> yuv_quad = |
| 496 shared_state.get(), false, false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f)); | 515 CreateTestYUVVideoDrawQuad(shared_state.get(), |
| 516 media::VideoFrame::YV12, | |
| 517 false, | |
| 518 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f)); | |
| 497 | 519 |
| 498 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); | 520 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); |
| 499 | 521 |
| 500 RenderPassList pass_list; | 522 RenderPassList pass_list; |
| 501 pass_list.push_back(pass.Pass()); | 523 pass_list.push_back(pass.Pass()); |
| 502 | 524 |
| 503 EXPECT_TRUE( | 525 EXPECT_TRUE( |
| 504 this->RunPixelTest(&pass_list, | 526 this->RunPixelTest(&pass_list, |
| 505 PixelTest::NoOffscreenContext, | 527 PixelTest::NoOffscreenContext, |
| 506 base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")), | 528 base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")), |
| 507 FuzzyPixelOffByOneComparator(true))); | 529 FuzzyPixelOffByOneComparator(true))); |
| 508 } | 530 } |
| 509 | 531 |
| 510 TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) { | 532 TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) { |
| 511 gfx::Rect rect(this->device_viewport_size_); | 533 gfx::Rect rect(this->device_viewport_size_); |
| 512 | 534 |
| 513 RenderPass::Id id(1, 1); | 535 RenderPass::Id id(1, 1); |
| 514 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 536 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
| 515 | 537 |
| 516 scoped_ptr<SharedQuadState> shared_state = | 538 scoped_ptr<SharedQuadState> shared_state = |
| 517 CreateTestSharedQuadState(gfx::Transform(), rect); | 539 CreateTestSharedQuadState(gfx::Transform(), rect); |
| 518 | 540 |
| 519 scoped_ptr<YUVVideoDrawQuad> yuv_quad = CreateTestYUVVideoDrawQuad( | 541 scoped_ptr<YUVVideoDrawQuad> yuv_quad = |
| 520 shared_state.get(), false, false, gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f)); | 542 CreateTestYUVVideoDrawQuad(shared_state.get(), |
| 543 media::VideoFrame::I420, | |
|
Ami GONE FROM CHROMIUM
2014/04/02 22:03:58
nit: right now this is the only mention of I420 in
hshi1
2014/04/02 22:17:05
Done.
| |
| 544 false, | |
| 545 gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f)); | |
| 521 | 546 |
| 522 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); | 547 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); |
| 523 | 548 |
| 524 RenderPassList pass_list; | 549 RenderPassList pass_list; |
| 525 pass_list.push_back(pass.Pass()); | 550 pass_list.push_back(pass.Pass()); |
| 526 | 551 |
| 527 EXPECT_TRUE(this->RunPixelTest( | 552 EXPECT_TRUE(this->RunPixelTest( |
| 528 &pass_list, | 553 &pass_list, |
| 529 PixelTest::NoOffscreenContext, | 554 PixelTest::NoOffscreenContext, |
| 530 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_offset.png")), | 555 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_offset.png")), |
| 531 FuzzyPixelOffByOneComparator(true))); | 556 FuzzyPixelOffByOneComparator(true))); |
| 532 } | 557 } |
| 533 | 558 |
| 534 TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) { | 559 TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) { |
| 535 gfx::Rect rect(this->device_viewport_size_); | 560 gfx::Rect rect(this->device_viewport_size_); |
| 536 | 561 |
| 537 RenderPass::Id id(1, 1); | 562 RenderPass::Id id(1, 1); |
| 538 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 563 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
| 539 | 564 |
| 540 scoped_ptr<SharedQuadState> shared_state = | 565 scoped_ptr<SharedQuadState> shared_state = |
| 541 CreateTestSharedQuadState(gfx::Transform(), rect); | 566 CreateTestSharedQuadState(gfx::Transform(), rect); |
| 542 | 567 |
| 543 scoped_ptr<YUVVideoDrawQuad> yuv_quad = CreateTestYUVVideoDrawQuad( | 568 scoped_ptr<YUVVideoDrawQuad> yuv_quad = |
| 544 shared_state.get(), true, false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f)); | 569 CreateTestYUVVideoDrawQuad(shared_state.get(), |
| 570 media::VideoFrame::YV12A, | |
| 571 false, | |
| 572 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f)); | |
| 545 | 573 |
| 546 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); | 574 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); |
| 547 | 575 |
| 548 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); | 576 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); |
| 549 color_quad->SetNew(shared_state.get(), rect, rect, SK_ColorWHITE, false); | 577 color_quad->SetNew(shared_state.get(), rect, rect, SK_ColorWHITE, false); |
| 550 | 578 |
| 551 pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); | 579 pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); |
| 552 | 580 |
| 553 RenderPassList pass_list; | 581 RenderPassList pass_list; |
| 554 pass_list.push_back(pass.Pass()); | 582 pass_list.push_back(pass.Pass()); |
| 555 | 583 |
| 556 EXPECT_TRUE(this->RunPixelTest( | 584 EXPECT_TRUE(this->RunPixelTest( |
| 557 &pass_list, | 585 &pass_list, |
| 558 PixelTest::NoOffscreenContext, | 586 PixelTest::NoOffscreenContext, |
| 559 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_alpha.png")), | 587 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_alpha.png")), |
| 560 FuzzyPixelOffByOneComparator(true))); | 588 FuzzyPixelOffByOneComparator(true))); |
| 561 } | 589 } |
| 562 | 590 |
| 563 TEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) { | 591 TEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) { |
| 564 gfx::Rect rect(this->device_viewport_size_); | 592 gfx::Rect rect(this->device_viewport_size_); |
| 565 | 593 |
| 566 RenderPass::Id id(1, 1); | 594 RenderPass::Id id(1, 1); |
| 567 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 595 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
| 568 | 596 |
| 569 scoped_ptr<SharedQuadState> shared_state = | 597 scoped_ptr<SharedQuadState> shared_state = |
| 570 CreateTestSharedQuadState(gfx::Transform(), rect); | 598 CreateTestSharedQuadState(gfx::Transform(), rect); |
| 571 | 599 |
| 572 scoped_ptr<YUVVideoDrawQuad> yuv_quad = CreateTestYUVVideoDrawQuad( | 600 scoped_ptr<YUVVideoDrawQuad> yuv_quad = |
| 573 shared_state.get(), true, true, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f)); | 601 CreateTestYUVVideoDrawQuad(shared_state.get(), |
| 602 media::VideoFrame::YV12A, | |
| 603 true, | |
| 604 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f)); | |
| 574 | 605 |
| 575 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); | 606 pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>()); |
| 576 | 607 |
| 577 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); | 608 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); |
| 578 color_quad->SetNew(shared_state.get(), rect, rect, SK_ColorBLACK, false); | 609 color_quad->SetNew(shared_state.get(), rect, rect, SK_ColorBLACK, false); |
| 579 | 610 |
| 580 pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); | 611 pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); |
| 581 | 612 |
| 582 RenderPassList pass_list; | 613 RenderPassList pass_list; |
| 583 pass_list.push_back(pass.Pass()); | 614 pass_list.push_back(pass.Pass()); |
| (...skipping 1514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2098 &pass_list, | 2129 &pass_list, |
| 2099 PixelTest::NoOffscreenContext, | 2130 PixelTest::NoOffscreenContext, |
| 2100 base::FilePath(FILE_PATH_LITERAL("wrap_mode_repeat.png")), | 2131 base::FilePath(FILE_PATH_LITERAL("wrap_mode_repeat.png")), |
| 2101 FuzzyPixelOffByOneComparator(true))); | 2132 FuzzyPixelOffByOneComparator(true))); |
| 2102 } | 2133 } |
| 2103 | 2134 |
| 2104 #endif // !defined(OS_ANDROID) | 2135 #endif // !defined(OS_ANDROID) |
| 2105 | 2136 |
| 2106 } // namespace | 2137 } // namespace |
| 2107 } // namespace cc | 2138 } // namespace cc |
| OLD | NEW |