summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cc/cc_tests.gyp5
-rw-r--r--cc/gl_renderer_pixeltest.cc123
-rw-r--r--cc/layer_tree_host_impl.h2
-rw-r--r--cc/layer_tree_host_pixeltest_filters.cc39
-rw-r--r--cc/test/layer_tree_pixel_test.cc104
-rw-r--r--cc/test/layer_tree_pixel_test.h55
-rw-r--r--cc/test/layer_tree_test_common.cc7
-rw-r--r--cc/test/layer_tree_test_common.h2
-rw-r--r--cc/test/pixel_test.cc99
-rw-r--r--cc/test/pixel_test.h36
10 files changed, 365 insertions, 107 deletions
diff --git a/cc/cc_tests.gyp b/cc/cc_tests.gyp
index c2a8e5d..5ed02bba 100644
--- a/cc/cc_tests.gyp
+++ b/cc/cc_tests.gyp
@@ -28,6 +28,7 @@
'layer_sorter_unittest.cc',
'layer_tree_host_common_unittest.cc',
'layer_tree_host_impl_unittest.cc',
+ 'layer_tree_host_pixeltest_filters.cc',
'layer_tree_host_unittest.cc',
'layer_tree_host_unittest_animation.cc',
'layer_tree_host_unittest_context.cc',
@@ -115,6 +116,8 @@
'test/geometry_test_utils.h',
'test/layer_test_common.cc',
'test/layer_test_common.h',
+ 'test/layer_tree_pixel_test.cc',
+ 'test/layer_tree_pixel_test.h',
'test/layer_tree_test_common.cc',
'test/layer_tree_test_common.h',
'test/layer_tree_json_parser.cc',
@@ -124,6 +127,8 @@
'test/occlusion_tracker_test_common.h',
'test/paths.cc',
'test/paths.h',
+ 'test/pixel_test.cc',
+ 'test/pixel_test.h',
'test/render_pass_test_common.cc',
'test/render_pass_test_common.h',
'test/render_pass_test_utils.cc',
diff --git a/cc/gl_renderer_pixeltest.cc b/cc/gl_renderer_pixeltest.cc
index ed154c6..71e89b3 100644
--- a/cc/gl_renderer_pixeltest.cc
+++ b/cc/gl_renderer_pixeltest.cc
@@ -4,101 +4,13 @@
#include "cc/gl_renderer.h"
-#include "base/file_util.h"
-#include "base/path_service.h"
-#include "cc/compositor_frame_metadata.h"
#include "cc/draw_quad.h"
-#include "cc/prioritized_resource_manager.h"
-#include "cc/resource_provider.h"
-#include "cc/test/paths.h"
-#include "cc/test/pixel_test_utils.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/codec/png_codec.h"
-#include "ui/gl/gl_implementation.h"
-#include "webkit/gpu/context_provider_in_process.h"
-#include "webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h"
+#include "cc/test/pixel_test.h"
namespace cc {
namespace {
-const int kDeviceViewportWidth = 200;
-const int kDeviceViewportHeight = 200;
-
-class FakeRendererClient : public RendererClient {
- public:
- FakeRendererClient()
- {
- }
-
- // RendererClient methods.
- virtual gfx::Size DeviceViewportSize() const OVERRIDE {
- return gfx::Size(kDeviceViewportWidth, kDeviceViewportHeight);
- }
- virtual const LayerTreeSettings& Settings() const OVERRIDE {
- static LayerTreeSettings fake_settings;
- return fake_settings;
- }
- virtual void DidLoseOutputSurface() OVERRIDE { }
- virtual void OnSwapBuffersComplete() OVERRIDE { }
- virtual void SetFullRootLayerDamage() OVERRIDE { }
- virtual void SetManagedMemoryPolicy(const ManagedMemoryPolicy&) OVERRIDE {}
- virtual void EnforceManagedMemoryPolicy(
- const ManagedMemoryPolicy&) OVERRIDE {}
- virtual bool HasImplThread() const OVERRIDE { return false; }
- virtual bool ShouldClearRootRenderPass() const OVERRIDE { return true; }
- virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const
- OVERRIDE { return CompositorFrameMetadata(); }
-};
-
-class GLRendererPixelTest : public testing::Test {
- protected:
- GLRendererPixelTest() {}
-
- virtual void SetUp() {
- gfx::InitializeGLBindings(gfx::kGLImplementationOSMesaGL);
- scoped_ptr<webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl>
- context3d(
- new webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl);
- context3d->Initialize(WebKit::WebGraphicsContext3D::Attributes(), NULL);
- output_surface_.reset(new OutputSurface(
- context3d.PassAs<WebKit::WebGraphicsContext3D>()));
- resource_provider_ = ResourceProvider::Create(output_surface_.get());
- renderer_ = GLRenderer::Create(&fake_client_,
- output_surface_.get(),
- resource_provider_.get());
-
- scoped_refptr<cc::ContextProvider> offscreen_contexts =
- new webkit::gpu::ContextProviderInProcess(
- webkit::gpu::ContextProviderInProcess::IN_PROCESS_COMMAND_BUFFER);
- ASSERT_TRUE(offscreen_contexts->InitializeOnMainThread());
- resource_provider_->SetOffscreenContextProvider(offscreen_contexts);
- }
-
- bool PixelsMatchReference(base::FilePath ref_file) {
- gfx::Rect viewport_rect(kDeviceViewportWidth, kDeviceViewportHeight);
-
- SkBitmap bitmap;
- bitmap.setConfig(SkBitmap::kARGB_8888_Config,
- viewport_rect.width(), viewport_rect.height());
- bitmap.allocPixels();
- unsigned char* pixels = static_cast<unsigned char*>(bitmap.getPixels());
- renderer_->GetFramebufferPixels(pixels, viewport_rect);
-
- base::FilePath test_data_dir;
- if (!PathService::Get(cc::DIR_TEST_DATA, &test_data_dir))
- return false;
-
- // To rebaseline:
- //return WritePNGFile(bitmap, test_data_dir.Append(ref_file));
-
- return IsSameAsPNGFile(bitmap, test_data_dir.Append(ref_file));
- }
-
- scoped_ptr<OutputSurface> output_surface_;
- FakeRendererClient fake_client_;
- scoped_ptr<ResourceProvider> resource_provider_;
- scoped_ptr<GLRenderer> renderer_;
-};
+class GLRendererPixelTest : public PixelTest {};
scoped_ptr<RenderPass> CreateTestRootRenderPass(RenderPass::Id id,
gfx::Rect rect) {
@@ -158,7 +70,7 @@ scoped_ptr<DrawQuad> CreateTestRenderPassDrawQuad(
#if !defined(OS_ANDROID)
TEST_F(GLRendererPixelTest, simpleGreenRect) {
- gfx::Rect rect(kDeviceViewportWidth, kDeviceViewportHeight);
+ gfx::Rect rect(device_viewport_size_);
RenderPass::Id id(1, 1);
scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
@@ -182,14 +94,14 @@ TEST_F(GLRendererPixelTest, simpleGreenRect) {
}
TEST_F(GLRendererPixelTest, RenderPassChangesSize) {
- gfx::Rect viewport_rect(kDeviceViewportWidth, kDeviceViewportHeight);
+ gfx::Rect viewport_rect(device_viewport_size_);
RenderPass::Id root_pass_id(1, 1);
scoped_ptr<RenderPass> root_pass =
CreateTestRootRenderPass(root_pass_id, viewport_rect);
RenderPass::Id child_pass_id(2, 2);
- gfx::Rect pass_rect(kDeviceViewportWidth, kDeviceViewportHeight);
+ gfx::Rect pass_rect(device_viewport_size_);
gfx::Transform transform_to_root;
scoped_ptr<RenderPass> child_pass =
CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root);
@@ -202,15 +114,15 @@ TEST_F(GLRendererPixelTest, RenderPassChangesSize) {
blue->SetNew(shared_state.get(),
gfx::Rect(0,
0,
- kDeviceViewportWidth / 2,
- kDeviceViewportHeight),
+ device_viewport_size_.width() / 2,
+ device_viewport_size_.height()),
SK_ColorBLUE);
scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
yellow->SetNew(shared_state.get(),
- gfx::Rect(kDeviceViewportWidth / 2,
- 0,
- kDeviceViewportWidth / 2,
- kDeviceViewportHeight),
+ gfx::Rect(device_viewport_size_.width() / 2,
+ 0,
+ device_viewport_size_.width() / 2,
+ device_viewport_size_.height()),
SK_ColorYELLOW);
child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
@@ -238,7 +150,7 @@ TEST_F(GLRendererPixelTest, RenderPassChangesSize) {
class GLRendererPixelTestWithBackgroundFilter : public GLRendererPixelTest {
protected:
void DrawFrame() {
- gfx::Rect device_viewport_rect(kDeviceViewportWidth, kDeviceViewportHeight);
+ gfx::Rect device_viewport_rect(device_viewport_size_);
RenderPass::Id root_id(1, 1);
scoped_ptr<RenderPass> root_pass =
@@ -288,10 +200,10 @@ class GLRendererPixelTestWithBackgroundFilter : public GLRendererPixelTest {
root_pass->shared_quad_state_list.push_back(shared_state.Pass());
}
- const int kColumnWidth = kDeviceViewportWidth / 3;
+ const int kColumnWidth = device_viewport_rect.width() / 3;
gfx::Rect left_rect = gfx::Rect(0, 0, kColumnWidth, 20);
- for (int i = 0; left_rect.y() < kDeviceViewportHeight; ++i) {
+ for (int i = 0; left_rect.y() < device_viewport_rect.height(); ++i) {
scoped_ptr<SharedQuadState> shared_state =
CreateTestSharedQuadState(identity_content_to_target_transform,
left_rect);
@@ -303,7 +215,7 @@ class GLRendererPixelTestWithBackgroundFilter : public GLRendererPixelTest {
}
gfx::Rect middle_rect = gfx::Rect(kColumnWidth+1, 0, kColumnWidth, 20);
- for (int i = 0; middle_rect.y() < kDeviceViewportHeight; ++i) {
+ for (int i = 0; middle_rect.y() < device_viewport_rect.height(); ++i) {
scoped_ptr<SharedQuadState> shared_state =
CreateTestSharedQuadState(identity_content_to_target_transform,
middle_rect);
@@ -315,7 +227,7 @@ class GLRendererPixelTestWithBackgroundFilter : public GLRendererPixelTest {
}
gfx::Rect right_rect = gfx::Rect((kColumnWidth+1)*2, 0, kColumnWidth, 20);
- for (int i = 0; right_rect.y() < kDeviceViewportHeight; ++i) {
+ for (int i = 0; right_rect.y() < device_viewport_rect.height(); ++i) {
scoped_ptr<SharedQuadState> shared_state =
CreateTestSharedQuadState(identity_content_to_target_transform,
right_rect);
@@ -354,8 +266,7 @@ TEST_F(GLRendererPixelTestWithBackgroundFilter, InvertFilter) {
background_filters_.append(
WebKit::WebFilterOperation::createInvertFilter(1.f));
- filter_pass_content_rect_ =
- gfx::Rect(kDeviceViewportWidth, kDeviceViewportHeight);
+ filter_pass_content_rect_ = gfx::Rect(device_viewport_size_);
filter_pass_content_rect_.Inset(12, 14, 16, 18);
DrawFrame();
diff --git a/cc/layer_tree_host_impl.h b/cc/layer_tree_host_impl.h
index 6e90e93..51cb18f 100644
--- a/cc/layer_tree_host_impl.h
+++ b/cc/layer_tree_host_impl.h
@@ -187,7 +187,7 @@ class CC_EXPORT LayerTreeHostImpl : public InputHandlerClient,
Renderer* renderer() { return renderer_.get(); }
const RendererCapabilities& GetRendererCapabilities() const;
- bool SwapBuffers();
+ virtual bool SwapBuffers();
void Readback(void* pixels, gfx::Rect rect_in_device_viewport);
diff --git a/cc/layer_tree_host_pixeltest_filters.cc b/cc/layer_tree_host_pixeltest_filters.cc
new file mode 100644
index 0000000..37d2931
--- /dev/null
+++ b/cc/layer_tree_host_pixeltest_filters.cc
@@ -0,0 +1,39 @@
+// 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"
+
+#if !defined(OS_ANDROID)
+
+namespace cc {
+namespace {
+
+class LayerTreeHostFiltersPixelTest : public LayerTreePixelTest {};
+
+TEST_F(LayerTreeHostFiltersPixelTest, BackgroundFilterBlur) {
+ scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
+ gfx::Rect(200, 200), SK_ColorWHITE);
+
+ // The green box is entirely behind a layer with background blur, so it
+ // should appear blurred on its edges.
+ scoped_refptr<SolidColorLayer> green = CreateSolidColorLayer(
+ gfx::Rect(50, 50, 100, 100), kCSSGreen);
+ scoped_refptr<SolidColorLayer> blur = CreateSolidColorLayer(
+ gfx::Rect(30, 30, 140, 140), SK_ColorTRANSPARENT);
+ background->AddChild(green);
+ background->AddChild(blur);
+
+ WebKit::WebFilterOperations filters;
+ filters.append(WebKit::WebFilterOperation::createBlurFilter(2));
+ blur->SetBackgroundFilters(filters);
+
+ RunPixelTest(background,
+ base::FilePath(FILE_PATH_LITERAL(
+ "background_filter_blur.png")));
+}
+
+} // namespace
+} // namespace cc
+
+#endif // OS_ANDROID
diff --git a/cc/test/layer_tree_pixel_test.cc b/cc/test/layer_tree_pixel_test.cc
new file mode 100644
index 0000000..63cfd6f
--- /dev/null
+++ b/cc/test/layer_tree_pixel_test.cc
@@ -0,0 +1,104 @@
+// 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/layer_tree_impl.h"
+#include "cc/test/paths.h"
+#include "cc/test/pixel_test_utils.h"
+#include "ui/gl/gl_implementation.h"
+#include "webkit/gpu/context_provider_in_process.h"
+#include "webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h"
+
+namespace cc {
+
+LayerTreePixelTest::LayerTreePixelTest() {}
+
+LayerTreePixelTest::~LayerTreePixelTest() {}
+
+scoped_ptr<OutputSurface> LayerTreePixelTest::createOutputSurface() {
+ CHECK(gfx::InitializeGLBindings(gfx::kGLImplementationOSMesaGL));
+
+ using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl;
+ scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> context3d(
+ new WebGraphicsContext3DInProcessCommandBufferImpl);
+ context3d->Initialize(WebKit::WebGraphicsContext3D::Attributes(), NULL);
+ return make_scoped_ptr(
+ new OutputSurface(context3d.PassAs<WebKit::WebGraphicsContext3D>()));
+}
+
+scoped_refptr<cc::ContextProvider>
+LayerTreePixelTest::OffscreenContextProviderForMainThread() {
+ return new webkit::gpu::ContextProviderInProcess(
+ webkit::gpu::ContextProviderInProcess::IN_PROCESS_COMMAND_BUFFER);
+}
+
+scoped_refptr<cc::ContextProvider>
+LayerTreePixelTest::OffscreenContextProviderForCompositorThread() {
+ return new webkit::gpu::ContextProviderInProcess(
+ webkit::gpu::ContextProviderInProcess::IN_PROCESS_COMMAND_BUFFER);
+}
+
+void LayerTreePixelTest::swapBuffersOnThread(LayerTreeHostImpl* host_impl,
+ bool result) {
+ EXPECT_TRUE(result);
+
+ gfx::Rect device_viewport_rect(
+ host_impl->active_tree()->device_viewport_size());
+
+ SkBitmap bitmap;
+ bitmap.setConfig(SkBitmap::kARGB_8888_Config,
+ device_viewport_rect.width(),
+ device_viewport_rect.height());
+ bitmap.allocPixels();
+ unsigned char* pixels = static_cast<unsigned char*>(bitmap.getPixels());
+ host_impl->Readback(pixels, device_viewport_rect);
+
+ 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_)));
+
+ EXPECT_TRUE(IsSameAsPNGFile(bitmap, test_data_dir.Append(ref_file_)));
+
+ endTest();
+}
+
+void LayerTreePixelTest::beginTest() {
+ 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;
+}
+
+void LayerTreePixelTest::RunPixelTest(
+ scoped_refptr<Layer> content_root,
+ base::FilePath file_name)
+{
+ content_root_ = content_root;
+ ref_file_ = file_name;
+ runTest(true);
+}
+
+void LayerTreePixelTest::setupTree() {
+ scoped_refptr<Layer> root = Layer::Create();
+ root->SetBounds(content_root_->bounds());
+ root->AddChild(content_root_);
+ m_layerTreeHost->SetRootLayer(root);
+ ThreadedTest::setupTree();
+}
+
+} // namespace cc
diff --git a/cc/test/layer_tree_pixel_test.h b/cc/test/layer_tree_pixel_test.h
new file mode 100644
index 0000000..4682d9e
--- /dev/null
+++ b/cc/test/layer_tree_pixel_test.h
@@ -0,0 +1,55 @@
+// 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 "base/files/file_path.h"
+#include "cc/solid_color_layer.h"
+#include "cc/test/layer_tree_test_common.h"
+
+#ifndef CC_TEST_LAYER_TREE_PIXEL_TEST_H_
+#define CC_TEST_LAYER_TREE_PIXEL_TEST_H_
+
+namespace cc {
+class LayerTreeHost;
+
+class LayerTreePixelTest : public ThreadedTest {
+ protected:
+ LayerTreePixelTest();
+ virtual ~LayerTreePixelTest();
+
+ bool RunTest(scoped_refptr<Layer> root_layer,
+ const base::FilePath::StringType& file_name);
+
+ virtual scoped_ptr<OutputSurface> createOutputSurface() OVERRIDE;
+ virtual scoped_refptr<cc::ContextProvider>
+ OffscreenContextProviderForMainThread() OVERRIDE;
+ virtual scoped_refptr<cc::ContextProvider>
+ OffscreenContextProviderForCompositorThread() OVERRIDE;
+ virtual void swapBuffersOnThread(LayerTreeHostImpl* host_impl,
+ bool result) OVERRIDE;
+
+ virtual void beginTest() OVERRIDE;
+ virtual void setupTree() OVERRIDE;
+ virtual void afterTest() OVERRIDE;
+
+ scoped_refptr<SolidColorLayer> CreateSolidColorLayer(gfx::Rect rect,
+ SkColor color);
+
+ void RunPixelTest(scoped_refptr<Layer> content_root,
+ base::FilePath file_name);
+
+ // Common CSS colors defined for tests to use.
+ enum Colors {
+ kCSSOrange = 0xffffa500,
+ kCSSBrown = 0xffa52a2a,
+ kCSSGreen = 0xff008000,
+ };
+
+ private:
+ scoped_refptr<Layer> content_root_;
+ base::FilePath ref_file_;
+};
+
+} // namespace cc
+
+#endif // CC_TEST_LAYER_TREE_PIXEL_TEST_H_
diff --git a/cc/test/layer_tree_test_common.cc b/cc/test/layer_tree_test_common.cc
index def1820..f24c6b0 100644
--- a/cc/test/layer_tree_test_common.cc
+++ b/cc/test/layer_tree_test_common.cc
@@ -98,6 +98,13 @@ void MockLayerTreeHostImpl::DrawLayers(FrameData* frame)
m_testHooks->drawLayersOnThread(this);
}
+bool MockLayerTreeHostImpl::SwapBuffers()
+{
+ bool result = LayerTreeHostImpl::SwapBuffers();
+ m_testHooks->swapBuffersOnThread(this, result);
+ return result;
+}
+
bool MockLayerTreeHostImpl::ActivatePendingTreeIfNeeded()
{
if (!pending_tree())
diff --git a/cc/test/layer_tree_test_common.h b/cc/test/layer_tree_test_common.h
index ac9534e3..28991b3 100644
--- a/cc/test/layer_tree_test_common.h
+++ b/cc/test/layer_tree_test_common.h
@@ -37,6 +37,7 @@ public:
virtual bool prepareToDrawOnThread(
LayerTreeHostImpl*, LayerTreeHostImpl::FrameData*, bool result);
virtual void drawLayersOnThread(LayerTreeHostImpl*) { }
+ virtual void swapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) { }
virtual void animateLayers(LayerTreeHostImpl*, base::TimeTicks monotonicTime) { }
virtual void updateAnimationState(LayerTreeHostImpl*, bool hasUnfinishedAnimation) { }
virtual void willAnimateLayers(LayerTreeHostImpl*, base::TimeTicks monotonicTime) { }
@@ -167,6 +168,7 @@ public:
virtual void CommitComplete() OVERRIDE;
virtual bool PrepareToDraw(FrameData* frame) OVERRIDE;
virtual void DrawLayers(FrameData* frame) OVERRIDE;
+ virtual bool SwapBuffers() OVERRIDE;
virtual bool ActivatePendingTreeIfNeeded() OVERRIDE;
virtual bool InitializeRenderer(scoped_ptr<OutputSurface> outputSurface) OVERRIDE;
virtual void SetVisible(bool visible) OVERRIDE;
diff --git a/cc/test/pixel_test.cc b/cc/test/pixel_test.cc
new file mode 100644
index 0000000..59ea9bb
--- /dev/null
+++ b/cc/test/pixel_test.cc
@@ -0,0 +1,99 @@
+// 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/pixel_test.h"
+
+#include "base/path_service.h"
+#include "cc/compositor_frame_metadata.h"
+#include "cc/gl_renderer.h"
+#include "cc/output_surface.h"
+#include "cc/resource_provider.h"
+#include "cc/test/paths.h"
+#include "cc/test/pixel_test_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gl/gl_implementation.h"
+#include "webkit/gpu/context_provider_in_process.h"
+#include "webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h"
+
+namespace cc {
+
+class PixelTest::PixelTestRendererClient : public RendererClient {
+ public:
+ PixelTestRendererClient(gfx::Size device_viewport_size)
+ : device_viewport_size_(device_viewport_size) {}
+
+ // RendererClient implementation.
+ virtual gfx::Size DeviceViewportSize() const OVERRIDE {
+ return device_viewport_size_;
+ }
+ virtual const LayerTreeSettings& Settings() const OVERRIDE {
+ return settings_;
+ }
+ virtual void DidLoseOutputSurface() OVERRIDE {}
+ virtual void OnSwapBuffersComplete() OVERRIDE {}
+ virtual void SetFullRootLayerDamage() OVERRIDE {}
+ virtual void SetManagedMemoryPolicy(
+ const ManagedMemoryPolicy& policy) OVERRIDE {}
+ virtual void EnforceManagedMemoryPolicy(
+ const ManagedMemoryPolicy& policy) OVERRIDE {}
+ virtual bool HasImplThread() const OVERRIDE { return false; }
+ virtual bool ShouldClearRootRenderPass() const OVERRIDE { return true; }
+ virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const
+ OVERRIDE {
+ return CompositorFrameMetadata();
+ }
+
+ private:
+ gfx::Size device_viewport_size_;
+ LayerTreeSettings settings_;
+};
+
+PixelTest::PixelTest() : device_viewport_size_(gfx::Size(200, 200)) {}
+
+PixelTest::~PixelTest() {}
+
+void PixelTest::SetUp() {
+ gfx::InitializeGLBindings(gfx::kGLImplementationOSMesaGL);
+ scoped_ptr<webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl>
+ context3d(
+ new webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl);
+ context3d->Initialize(WebKit::WebGraphicsContext3D::Attributes(), NULL);
+ output_surface_.reset(new OutputSurface(
+ context3d.PassAs<WebKit::WebGraphicsContext3D>()));
+ resource_provider_ = ResourceProvider::Create(output_surface_.get());
+ fake_client_ =
+ make_scoped_ptr(new PixelTestRendererClient(device_viewport_size_));
+ renderer_ = GLRenderer::Create(fake_client_.get(),
+ output_surface_.get(),
+ resource_provider_.get());
+
+ scoped_refptr<cc::ContextProvider> offscreen_contexts =
+ new webkit::gpu::ContextProviderInProcess(
+ webkit::gpu::ContextProviderInProcess::IN_PROCESS_COMMAND_BUFFER);
+ ASSERT_TRUE(offscreen_contexts->InitializeOnMainThread());
+ resource_provider_->SetOffscreenContextProvider(offscreen_contexts);
+}
+
+bool PixelTest::PixelsMatchReference(const base::FilePath& ref_file) {
+ gfx::Rect device_viewport_rect(device_viewport_size_);
+
+ SkBitmap bitmap;
+ bitmap.setConfig(SkBitmap::kARGB_8888_Config,
+ device_viewport_rect.width(),
+ device_viewport_rect.height());
+ bitmap.allocPixels();
+ unsigned char* pixels = static_cast<unsigned char*>(bitmap.getPixels());
+ renderer_->GetFramebufferPixels(pixels, device_viewport_rect);
+
+ base::FilePath test_data_dir;
+ if (!PathService::Get(cc::DIR_TEST_DATA, &test_data_dir))
+ return false;
+
+ // To rebaseline:
+ //return WritePNGFile(bitmap, test_data_dir.Append(ref_file));
+
+ return IsSameAsPNGFile(bitmap, test_data_dir.Append(ref_file));
+}
+
+} // namespace cc
diff --git a/cc/test/pixel_test.h b/cc/test/pixel_test.h
new file mode 100644
index 0000000..40acb33
--- /dev/null
+++ b/cc/test/pixel_test.h
@@ -0,0 +1,36 @@
+// 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 "base/file_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/size.h"
+
+#ifndef CC_TEST_PIXEL_TEST_H_
+#define CC_TEST_PIXEL_TEST_H_
+
+namespace cc {
+class GLRenderer;
+class OutputSurface;
+class ResourceProvider;
+
+class PixelTest : public testing::Test {
+ protected:
+ PixelTest();
+ virtual ~PixelTest();
+
+ virtual void SetUp() OVERRIDE;
+
+ bool PixelsMatchReference(const base::FilePath& ref_file);
+
+ gfx::Size device_viewport_size_;
+ scoped_ptr<OutputSurface> output_surface_;
+ scoped_ptr<ResourceProvider> resource_provider_;
+ class PixelTestRendererClient;
+ scoped_ptr<PixelTestRendererClient> fake_client_;
+ scoped_ptr<GLRenderer> renderer_;
+};
+
+} // namespace cc
+
+#endif // CC_TEST_PIXEL_TEST_H_