// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "cc/test/layer_tree_pixel_test.h" #include "base/path_service.h" #include "cc/output/copy_output_request.h" #include "cc/test/paths.h" #include "cc/test/pixel_comparator.h" #include "cc/test/pixel_test_utils.h" #include "cc/trees/layer_tree_impl.h" #include "ui/gl/gl_implementation.h" #include "webkit/common/gpu/context_provider_in_process.h" #include "webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h" namespace cc { LayerTreePixelTest::LayerTreePixelTest() : pixel_comparator_(new ExactPixelComparator(true)) {} LayerTreePixelTest::~LayerTreePixelTest() {} scoped_ptr<OutputSurface> LayerTreePixelTest::CreateOutputSurface() { CHECK(gfx::InitializeGLBindings(gfx::kGLImplementationOSMesaGL)); using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl; scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> context3d( WebGraphicsContext3DInProcessCommandBufferImpl::CreateOffscreenContext( WebKit::WebGraphicsContext3D::Attributes())); return make_scoped_ptr( new OutputSurface(context3d.PassAs<WebKit::WebGraphicsContext3D>())); } scoped_refptr<cc::ContextProvider> LayerTreePixelTest::OffscreenContextProviderForMainThread() { scoped_refptr<webkit::gpu::ContextProviderInProcess> provider = webkit::gpu::ContextProviderInProcess::Create(); CHECK(provider->BindToCurrentThread()); return provider; } scoped_refptr<cc::ContextProvider> LayerTreePixelTest::OffscreenContextProviderForCompositorThread() { scoped_refptr<webkit::gpu::ContextProviderInProcess> provider = webkit::gpu::ContextProviderInProcess::Create(); CHECK(provider.get()); return provider; } void LayerTreePixelTest::ReadbackResult(scoped_ptr<SkBitmap> bitmap) { ASSERT_TRUE(bitmap); base::FilePath test_data_dir; EXPECT_TRUE(PathService::Get(cc::DIR_TEST_DATA, &test_data_dir)); // To rebaseline: // EXPECT_TRUE(WritePNGFile(*bitmap, test_data_dir.Append(ref_file_), true)); EXPECT_TRUE(MatchesPNGFile(*bitmap, test_data_dir.Append(ref_file_), *pixel_comparator_)); EndTest(); } void LayerTreePixelTest::BeginTest() { Layer* target = readback_target_ ? readback_target_ : layer_tree_host()->root_layer(); target->RequestCopyOfOutput(CopyOutputRequest::CreateBitmapRequest( base::Bind(&LayerTreePixelTest::ReadbackResult, base::Unretained(this)))); PostSetNeedsCommitToMainThread(); } void LayerTreePixelTest::AfterTest() {} scoped_refptr<SolidColorLayer> LayerTreePixelTest::CreateSolidColorLayer( gfx::Rect rect, SkColor color) { scoped_refptr<SolidColorLayer> layer = SolidColorLayer::Create(); layer->SetIsDrawable(true); layer->SetAnchorPoint(gfx::PointF()); layer->SetBounds(rect.size()); layer->SetPosition(rect.origin()); layer->SetBackgroundColor(color); return layer; } scoped_refptr<SolidColorLayer> LayerTreePixelTest:: CreateSolidColorLayerWithBorder( gfx::Rect rect, SkColor color, int border_width, SkColor border_color) { scoped_refptr<SolidColorLayer> layer = CreateSolidColorLayer(rect, color); scoped_refptr<SolidColorLayer> border_top = CreateSolidColorLayer( gfx::Rect(0, 0, rect.width(), border_width), border_color); scoped_refptr<SolidColorLayer> border_left = CreateSolidColorLayer( gfx::Rect(0, border_width, border_width, rect.height() - border_width * 2), border_color); scoped_refptr<SolidColorLayer> border_right = CreateSolidColorLayer( gfx::Rect(rect.width() - border_width, border_width, border_width, rect.height() - border_width * 2), border_color); scoped_refptr<SolidColorLayer> border_bottom = CreateSolidColorLayer( gfx::Rect(0, rect.height() - border_width, rect.width(), border_width), border_color); layer->AddChild(border_top); layer->AddChild(border_left); layer->AddChild(border_right); layer->AddChild(border_bottom); return layer; } void LayerTreePixelTest::RunPixelTest( scoped_refptr<Layer> content_root, base::FilePath file_name) { content_root_ = content_root; readback_target_ = NULL; ref_file_ = file_name; RunTest(true, false, true); } void LayerTreePixelTest::RunPixelTestWithReadbackTarget( scoped_refptr<Layer> content_root, Layer* target, base::FilePath file_name) { content_root_ = content_root; readback_target_ = target; ref_file_ = file_name; RunTest(true, false, true); } void LayerTreePixelTest::SetupTree() { scoped_refptr<Layer> root = Layer::Create(); root->SetBounds(content_root_->bounds()); root->AddChild(content_root_); layer_tree_host()->SetRootLayer(root); LayerTreeTest::SetupTree(); } } // namespace cc