Index: cc/output/renderer_pixeltest.cc |
diff --git a/cc/output/gl_renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc |
similarity index 83% |
rename from cc/output/gl_renderer_pixeltest.cc |
rename to cc/output/renderer_pixeltest.cc |
index 852c079e853974d7e9753e209b93381fae48ce14..8dc63164a8ad9011e817aadec081c5763db20b7a 100644 |
--- a/cc/output/gl_renderer_pixeltest.cc |
+++ b/cc/output/renderer_pixeltest.cc |
@@ -2,10 +2,9 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "cc/output/gl_renderer.h" |
- |
#include "base/message_loop.h" |
#include "cc/layers/append_quads_data.h" |
+#include "cc/output/gl_renderer.h" |
#include "cc/quads/draw_quad.h" |
#include "cc/resources/sync_point_helper.h" |
#include "cc/test/pixel_test.h" |
@@ -18,8 +17,6 @@ |
namespace cc { |
namespace { |
-class GLRendererPixelTest : public PixelTest {}; |
- |
scoped_ptr<RenderPass> CreateTestRootRenderPass(RenderPass::Id id, |
gfx::Rect rect) { |
scoped_ptr<RenderPass> pass = RenderPass::Create(); |
@@ -75,10 +72,47 @@ scoped_ptr<DrawQuad> CreateTestRenderPassDrawQuad( |
return quad.PassAs<DrawQuad>(); |
} |
+typedef ::testing::Types<GLRenderer, SoftwareRenderer> RendererTypes; |
+TYPED_TEST_CASE(RendererPixelTest, RendererTypes); |
+ |
+// All pixels can be off by one, but any more than that is an error. |
+class FuzzyPixelOffByOneComparator : public FuzzyPixelComparator { |
+ public: |
+ explicit FuzzyPixelOffByOneComparator(bool discard_alpha) |
+ : FuzzyPixelComparator(discard_alpha, 100.f, 0.f, 1.f, 1, 0) {} |
+}; |
+ |
+template <typename RendererType> |
+class FuzzyForSoftwareOnlyPixelComparator : public PixelComparator { |
+ public: |
+ explicit FuzzyForSoftwareOnlyPixelComparator(bool discard_alpha) |
+ : fuzzy_(discard_alpha), exact_(discard_alpha) {} |
+ |
+ virtual bool Compare(const SkBitmap& actual_bmp, |
+ const SkBitmap& expected_bmp) const; |
+ |
+ private: |
+ FuzzyPixelOffByOneComparator fuzzy_; |
+ ExactPixelComparator exact_; |
+}; |
+ |
+template<> |
+bool FuzzyForSoftwareOnlyPixelComparator<GLRenderer>::Compare( |
+ const SkBitmap& actual_bmp, |
+ const SkBitmap& expected_bmp) const { |
+ return exact_.Compare(actual_bmp, expected_bmp); |
+} |
+ |
+template<> |
+bool FuzzyForSoftwareOnlyPixelComparator<SoftwareRenderer>::Compare( |
+ const SkBitmap& actual_bmp, |
+ const SkBitmap& expected_bmp) const { |
+ return fuzzy_.Compare(actual_bmp, expected_bmp); |
+} |
#if !defined(OS_ANDROID) |
-TEST_F(GLRendererPixelTest, SimpleGreenRect) { |
- gfx::Rect rect(device_viewport_size_); |
+TYPED_TEST(RendererPixelTest, SimpleGreenRect) { |
+ gfx::Rect rect(this->device_viewport_size_); |
RenderPass::Id id(1, 1); |
scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
@@ -95,21 +129,21 @@ TEST_F(GLRendererPixelTest, SimpleGreenRect) { |
RenderPassList pass_list; |
pass_list.push_back(pass.Pass()); |
- EXPECT_TRUE(RunPixelTest( |
+ EXPECT_TRUE(this->RunPixelTest( |
&pass_list, |
base::FilePath(FILE_PATH_LITERAL("green.png")), |
ExactPixelComparator(true))); |
} |
-TEST_F(GLRendererPixelTest, FastPassColorFilterAlpha) { |
- gfx::Rect viewport_rect(device_viewport_size_); |
+TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) { |
+ gfx::Rect viewport_rect(this->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(device_viewport_size_); |
+ gfx::Rect pass_rect(this->device_viewport_size_); |
gfx::Transform transform_to_root; |
scoped_ptr<RenderPass> child_pass = |
CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root); |
@@ -123,15 +157,15 @@ TEST_F(GLRendererPixelTest, FastPassColorFilterAlpha) { |
blue->SetNew(shared_state.get(), |
gfx::Rect(0, |
0, |
- device_viewport_size_.width() / 2, |
- device_viewport_size_.height()), |
+ this->device_viewport_size_.width() / 2, |
+ this->device_viewport_size_.height()), |
SK_ColorBLUE); |
scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create(); |
yellow->SetNew(shared_state.get(), |
- gfx::Rect(device_viewport_size_.width() / 2, |
+ gfx::Rect(this->device_viewport_size_.width() / 2, |
0, |
- device_viewport_size_.width() / 2, |
- device_viewport_size_.height()), |
+ this->device_viewport_size_.width() / 2, |
+ this->device_viewport_size_.height()), |
SK_ColorYELLOW); |
scoped_ptr<SharedQuadState> blank_state = |
@@ -189,21 +223,23 @@ TEST_F(GLRendererPixelTest, FastPassColorFilterAlpha) { |
pass_list.push_back(child_pass.Pass()); |
pass_list.push_back(root_pass.Pass()); |
- EXPECT_TRUE(RunPixelTest( |
+ // This test has alpha=254 for the software renderer vs. alpha=255 for the gl |
+ // renderer so use a fuzzy comparator. |
+ EXPECT_TRUE(this->RunPixelTest( |
&pass_list, |
base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha.png")), |
- ExactPixelComparator(false))); |
+ FuzzyForSoftwareOnlyPixelComparator<TypeParam>(false))); |
} |
-TEST_F(GLRendererPixelTest, FastPassColorFilterAlphaTranslation) { |
- gfx::Rect viewport_rect(device_viewport_size_); |
+TYPED_TEST(RendererPixelTest, FastPassColorFilterAlphaTranslation) { |
+ gfx::Rect viewport_rect(this->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(device_viewport_size_); |
+ gfx::Rect pass_rect(this->device_viewport_size_); |
gfx::Transform transform_to_root; |
scoped_ptr<RenderPass> child_pass = |
CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root); |
@@ -217,15 +253,15 @@ TEST_F(GLRendererPixelTest, FastPassColorFilterAlphaTranslation) { |
blue->SetNew(shared_state.get(), |
gfx::Rect(0, |
0, |
- device_viewport_size_.width() / 2, |
- device_viewport_size_.height()), |
+ this->device_viewport_size_.width() / 2, |
+ this->device_viewport_size_.height()), |
SK_ColorBLUE); |
scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create(); |
yellow->SetNew(shared_state.get(), |
- gfx::Rect(device_viewport_size_.width() / 2, |
+ gfx::Rect(this->device_viewport_size_.width() / 2, |
0, |
- device_viewport_size_.width() / 2, |
- device_viewport_size_.height()), |
+ this->device_viewport_size_.width() / 2, |
+ this->device_viewport_size_.height()), |
SK_ColorYELLOW); |
scoped_ptr<SharedQuadState> blank_state = |
@@ -286,21 +322,23 @@ TEST_F(GLRendererPixelTest, FastPassColorFilterAlphaTranslation) { |
pass_list.push_back(child_pass.Pass()); |
pass_list.push_back(root_pass.Pass()); |
- EXPECT_TRUE(RunPixelTest( |
+ // This test has alpha=254 for the software renderer vs. alpha=255 for the gl |
+ // renderer so use a fuzzy comparator. |
+ EXPECT_TRUE(this->RunPixelTest( |
&pass_list, |
base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha_translate.png")), |
- ExactPixelComparator(false))); |
+ FuzzyForSoftwareOnlyPixelComparator<TypeParam>(false))); |
} |
-TEST_F(GLRendererPixelTest, RenderPassChangesSize) { |
- gfx::Rect viewport_rect(device_viewport_size_); |
+TYPED_TEST(RendererPixelTest, RenderPassChangesSize) { |
+ gfx::Rect viewport_rect(this->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(device_viewport_size_); |
+ gfx::Rect pass_rect(this->device_viewport_size_); |
gfx::Transform transform_to_root; |
scoped_ptr<RenderPass> child_pass = |
CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root); |
@@ -313,15 +351,15 @@ TEST_F(GLRendererPixelTest, RenderPassChangesSize) { |
blue->SetNew(shared_state.get(), |
gfx::Rect(0, |
0, |
- device_viewport_size_.width() / 2, |
- device_viewport_size_.height()), |
+ this->device_viewport_size_.width() / 2, |
+ this->device_viewport_size_.height()), |
SK_ColorBLUE); |
scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create(); |
yellow->SetNew(shared_state.get(), |
- gfx::Rect(device_viewport_size_.width() / 2, |
+ gfx::Rect(this->device_viewport_size_.width() / 2, |
0, |
- device_viewport_size_.width() / 2, |
- device_viewport_size_.height()), |
+ this->device_viewport_size_.width() / 2, |
+ this->device_viewport_size_.height()), |
SK_ColorYELLOW); |
child_pass->quad_list.push_back(blue.PassAs<DrawQuad>()); |
@@ -338,18 +376,20 @@ TEST_F(GLRendererPixelTest, RenderPassChangesSize) { |
pass_list.push_back(child_pass.Pass()); |
pass_list.push_back(root_pass.Pass()); |
- renderer_->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75)); |
+ this->renderer_->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75)); |
- EXPECT_TRUE(RunPixelTest( |
+ EXPECT_TRUE(this->RunPixelTest( |
&pass_list, |
base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")), |
ExactPixelComparator(true))); |
} |
-class GLRendererPixelTestWithBackgroundFilter : public GLRendererPixelTest { |
+template <typename RendererType> |
+class RendererPixelTestWithBackgroundFilter |
+ : public RendererPixelTest<RendererType> { |
protected: |
void SetUpRenderPassList() { |
- gfx::Rect device_viewport_rect(device_viewport_size_); |
+ gfx::Rect device_viewport_rect(this->device_viewport_size_); |
RenderPass::Id root_id(1, 1); |
scoped_ptr<RenderPass> root_pass = |
@@ -394,7 +434,7 @@ class GLRendererPixelTestWithBackgroundFilter : public GLRendererPixelTest { |
gfx::RectF(), // mask_uv_rect |
WebKit::WebFilterOperations(), // filters |
skia::RefPtr<SkImageFilter>(), // filter |
- background_filters_); |
+ this->background_filters_); |
root_pass->quad_list.push_back(filter_pass_quad.PassAs<DrawQuad>()); |
root_pass->shared_quad_state_list.push_back(shared_state.Pass()); |
} |
@@ -458,20 +498,28 @@ class GLRendererPixelTestWithBackgroundFilter : public GLRendererPixelTest { |
gfx::Rect filter_pass_content_rect_; |
}; |
+typedef ::testing::Types<GLRenderer, SoftwareRenderer> RendererTypes; |
+TYPED_TEST_CASE(RendererPixelTestWithBackgroundFilter, RendererTypes); |
+ |
+typedef RendererPixelTestWithBackgroundFilter<GLRenderer> |
+GLRendererPixelTestWithBackgroundFilter; |
+ |
+// TODO(skaslev): The software renderer does not support filters yet. |
TEST_F(GLRendererPixelTestWithBackgroundFilter, InvertFilter) { |
- background_filters_.append( |
+ this->background_filters_.append( |
WebKit::WebFilterOperation::createInvertFilter(1.f)); |
- filter_pass_content_rect_ = gfx::Rect(device_viewport_size_); |
- filter_pass_content_rect_.Inset(12, 14, 16, 18); |
+ this->filter_pass_content_rect_ = gfx::Rect(this->device_viewport_size_); |
+ this->filter_pass_content_rect_.Inset(12, 14, 16, 18); |
- SetUpRenderPassList(); |
- EXPECT_TRUE(RunPixelTest( |
- &pass_list_, |
+ this->SetUpRenderPassList(); |
+ EXPECT_TRUE(this->RunPixelTest( |
+ &this->pass_list_, |
base::FilePath(FILE_PATH_LITERAL("background_filter.png")), |
ExactPixelComparator(true))); |
} |
+// Software renderer does not support anti-aliased edges. |
TEST_F(GLRendererPixelTest, AntiAliasing) { |
gfx::Rect rect(0, 0, 200, 200); |
@@ -510,12 +558,14 @@ TEST_F(GLRendererPixelTest, AntiAliasing) { |
RenderPassList pass_list; |
pass_list.push_back(pass.Pass()); |
- EXPECT_TRUE(RunPixelTest( |
+ EXPECT_TRUE(this->RunPixelTest( |
&pass_list, |
base::FilePath(FILE_PATH_LITERAL("anti_aliasing.png")), |
ExactPixelComparator(true))); |
} |
+// This test tests that anti-aliasing works for axis aligned quads. |
+// Anti-aliasing is only supported in the gl renderer. |
TEST_F(GLRendererPixelTest, AxisAligned) { |
gfx::Rect rect(0, 0, 200, 200); |
@@ -560,7 +610,7 @@ TEST_F(GLRendererPixelTest, AxisAligned) { |
RenderPassList pass_list; |
pass_list.push_back(pass.Pass()); |
- EXPECT_TRUE(RunPixelTest( |
+ EXPECT_TRUE(this->RunPixelTest( |
&pass_list, |
base::FilePath(FILE_PATH_LITERAL("axis_aligned.png")), |
ExactPixelComparator(true))); |