Index: cc/trees/layer_tree_host_pixeltest_blending.cc |
diff --git a/cc/trees/layer_tree_host_pixeltest_blending.cc b/cc/trees/layer_tree_host_pixeltest_blending.cc |
deleted file mode 100644 |
index b31d3e8539525ccb1203ffb7377b28aac8e3c33f..0000000000000000000000000000000000000000 |
--- a/cc/trees/layer_tree_host_pixeltest_blending.cc |
+++ /dev/null |
@@ -1,498 +0,0 @@ |
-// 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/layers/picture_image_layer.h" |
-#include "cc/layers/solid_color_layer.h" |
-#include "cc/test/layer_tree_pixel_resource_test.h" |
-#include "cc/test/pixel_comparator.h" |
- |
-#if !defined(OS_ANDROID) |
- |
-namespace cc { |
-namespace { |
- |
-SkXfermode::Mode const kBlendModes[] = { |
- SkXfermode::kSrcOver_Mode, SkXfermode::kScreen_Mode, |
- SkXfermode::kOverlay_Mode, SkXfermode::kDarken_Mode, |
- SkXfermode::kLighten_Mode, SkXfermode::kColorDodge_Mode, |
- SkXfermode::kColorBurn_Mode, SkXfermode::kHardLight_Mode, |
- SkXfermode::kSoftLight_Mode, SkXfermode::kDifference_Mode, |
- SkXfermode::kExclusion_Mode, SkXfermode::kMultiply_Mode, |
- SkXfermode::kHue_Mode, SkXfermode::kSaturation_Mode, |
- SkXfermode::kColor_Mode, SkXfermode::kLuminosity_Mode}; |
- |
-SkColor kCSSTestColors[] = { |
- 0xffff0000, // red |
- 0xff00ff00, // lime |
- 0xff0000ff, // blue |
- 0xff00ffff, // aqua |
- 0xffff00ff, // fuchsia |
- 0xffffff00, // yellow |
- 0xff008000, // green |
- 0xff800000, // maroon |
- 0xff000080, // navy |
- 0xff800080, // purple |
- 0xff808000, // olive |
- 0xff008080, // teal |
- 0xfffa8072, // salmon |
- 0xffc0c0c0, // silver |
- 0xff000000, // black |
- 0xff808080, // gray |
- 0x80000000, // black with transparency |
- 0xffffffff, // white |
- 0x80ffffff, // white with transparency |
- 0x00000000 // transparent |
-}; |
- |
-const int kBlendModesCount = arraysize(kBlendModes); |
-const int kCSSTestColorsCount = arraysize(kCSSTestColors); |
- |
-using RenderPassOptions = uint32; |
-const uint32 kUseMasks = 1 << 0; |
-const uint32 kUseAntialiasing = 1 << 1; |
-const uint32 kUseColorMatrix = 1 << 2; |
-const uint32 kForceShaders = 1 << 3; |
- |
-class LayerTreeHostBlendingPixelTest : public LayerTreeHostPixelResourceTest { |
- public: |
- LayerTreeHostBlendingPixelTest() |
- : force_antialiasing_(false), force_blending_with_shaders_(false) { |
- pixel_comparator_.reset(new FuzzyPixelOffByOneComparator(true)); |
- } |
- |
- void InitializeSettings(LayerTreeSettings* settings) override { |
- settings->renderer_settings.force_antialiasing = force_antialiasing_; |
- settings->renderer_settings.force_blending_with_shaders = |
- force_blending_with_shaders_; |
- } |
- |
- protected: |
- void RunBlendingWithRootPixelTestType(PixelResourceTestCase type) { |
- const int kLaneWidth = 2; |
- const int kLaneHeight = kLaneWidth; |
- const int kRootWidth = (kBlendModesCount + 2) * kLaneWidth; |
- const int kRootHeight = 2 * kLaneWidth + kLaneHeight; |
- InitializeFromTestCase(type); |
- |
- scoped_refptr<SolidColorLayer> background = |
- CreateSolidColorLayer(gfx::Rect(kRootWidth, kRootHeight), kCSSOrange); |
- |
- // Orange child layers will blend with the green background |
- for (int i = 0; i < kBlendModesCount; ++i) { |
- gfx::Rect child_rect( |
- (i + 1) * kLaneWidth, kLaneWidth, kLaneWidth, kLaneHeight); |
- scoped_refptr<SolidColorLayer> green_lane = |
- CreateSolidColorLayer(child_rect, kCSSGreen); |
- background->AddChild(green_lane); |
- green_lane->SetBlendMode(kBlendModes[i]); |
- } |
- |
- RunPixelResourceTest( |
- background, |
- base::FilePath(FILE_PATH_LITERAL("blending_with_root.png"))); |
- } |
- |
- void RunBlendingWithTransparentPixelTestType(PixelResourceTestCase type) { |
- const int kLaneWidth = 2; |
- const int kLaneHeight = 3 * kLaneWidth; |
- const int kRootWidth = (kBlendModesCount + 2) * kLaneWidth; |
- const int kRootHeight = 2 * kLaneWidth + kLaneHeight; |
- InitializeFromTestCase(type); |
- |
- scoped_refptr<SolidColorLayer> root = |
- CreateSolidColorLayer(gfx::Rect(kRootWidth, kRootHeight), kCSSBrown); |
- |
- scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer( |
- gfx::Rect(0, kLaneWidth * 2, kRootWidth, kLaneWidth), kCSSOrange); |
- |
- root->AddChild(background); |
- background->SetIsRootForIsolatedGroup(true); |
- |
- // Orange child layers will blend with the green background |
- for (int i = 0; i < kBlendModesCount; ++i) { |
- gfx::Rect child_rect( |
- (i + 1) * kLaneWidth, -kLaneWidth, kLaneWidth, kLaneHeight); |
- scoped_refptr<SolidColorLayer> green_lane = |
- CreateSolidColorLayer(child_rect, kCSSGreen); |
- background->AddChild(green_lane); |
- green_lane->SetBlendMode(kBlendModes[i]); |
- } |
- |
- RunPixelResourceTest( |
- root, base::FilePath(FILE_PATH_LITERAL("blending_transparent.png"))); |
- } |
- |
- scoped_refptr<Layer> CreateColorfulBackdropLayer(int width, int height) { |
- // Draw the backdrop with horizontal lanes. |
- const int kLaneWidth = width; |
- const int kLaneHeight = height / kCSSTestColorsCount; |
- SkBitmap backing_store; |
- backing_store.allocN32Pixels(width, height); |
- SkCanvas canvas(backing_store); |
- canvas.clear(SK_ColorTRANSPARENT); |
- for (int i = 0; i < kCSSTestColorsCount; ++i) { |
- SkPaint paint; |
- paint.setColor(kCSSTestColors[i]); |
- canvas.drawRect( |
- SkRect::MakeXYWH(0, i * kLaneHeight, kLaneWidth, kLaneHeight), paint); |
- } |
- scoped_refptr<PictureImageLayer> layer = PictureImageLayer::Create(); |
- layer->SetIsDrawable(true); |
- layer->SetBounds(gfx::Size(width, height)); |
- layer->SetBitmap(backing_store); |
- return layer; |
- } |
- |
- void SetupMaskLayer(scoped_refptr<Layer> layer) { |
- const int kMaskOffset = 2; |
- gfx::Size bounds = layer->bounds(); |
- scoped_refptr<PictureImageLayer> mask = PictureImageLayer::Create(); |
- mask->SetIsDrawable(true); |
- mask->SetIsMask(true); |
- mask->SetBounds(bounds); |
- |
- SkBitmap bitmap; |
- bitmap.allocN32Pixels(bounds.width(), bounds.height()); |
- SkCanvas canvas(bitmap); |
- SkPaint paint; |
- paint.setColor(SK_ColorWHITE); |
- canvas.clear(SK_ColorTRANSPARENT); |
- canvas.drawRect(SkRect::MakeXYWH(kMaskOffset, |
- kMaskOffset, |
- bounds.width() - kMaskOffset * 2, |
- bounds.height() - kMaskOffset * 2), |
- paint); |
- mask->SetBitmap(bitmap); |
- layer->SetMaskLayer(mask.get()); |
- } |
- |
- void SetupColorMatrix(scoped_refptr<Layer> layer) { |
- FilterOperations filter_operations; |
- filter_operations.Append(FilterOperation::CreateSepiaFilter(.001f)); |
- layer->SetFilters(filter_operations); |
- } |
- |
- void CreateBlendingColorLayers(int lane_width, |
- int lane_height, |
- scoped_refptr<Layer> background, |
- RenderPassOptions flags) { |
- const int kLanesCount = kBlendModesCount + 4; |
- const SkColor kMiscOpaqueColor = 0xffc86464; |
- const SkColor kMiscTransparentColor = 0x80c86464; |
- const SkXfermode::Mode kCoeffBlendMode = SkXfermode::kScreen_Mode; |
- const SkXfermode::Mode kShaderBlendMode = SkXfermode::kColorBurn_Mode; |
- // add vertical lanes with each of the blend modes |
- for (int i = 0; i < kLanesCount; ++i) { |
- gfx::Rect child_rect(i * lane_width, 0, lane_width, lane_height); |
- SkXfermode::Mode blend_mode = SkXfermode::kSrcOver_Mode; |
- float opacity = 1.f; |
- SkColor color = kMiscOpaqueColor; |
- |
- if (i < kBlendModesCount) { |
- blend_mode = kBlendModes[i]; |
- } else if (i == kBlendModesCount) { |
- blend_mode = kCoeffBlendMode; |
- opacity = 0.5f; |
- } else if (i == kBlendModesCount + 1) { |
- blend_mode = kCoeffBlendMode; |
- color = kMiscTransparentColor; |
- } else if (i == kBlendModesCount + 2) { |
- blend_mode = kShaderBlendMode; |
- opacity = 0.5f; |
- } else if (i == kBlendModesCount + 3) { |
- blend_mode = kShaderBlendMode; |
- color = kMiscTransparentColor; |
- } |
- |
- scoped_refptr<SolidColorLayer> lane = |
- CreateSolidColorLayer(child_rect, color); |
- lane->SetBlendMode(blend_mode); |
- lane->SetOpacity(opacity); |
- lane->SetForceRenderSurface(true); |
- if (flags & kUseMasks) |
- SetupMaskLayer(lane); |
- if (flags & kUseColorMatrix) { |
- SetupColorMatrix(lane); |
- } |
- background->AddChild(lane); |
- } |
- } |
- |
- void RunBlendingWithRenderPass(PixelResourceTestCase type, |
- const base::FilePath::CharType* expected_path, |
- RenderPassOptions flags) { |
- const int kLaneWidth = 8; |
- const int kLaneHeight = kLaneWidth * kCSSTestColorsCount; |
- const int kRootSize = kLaneHeight; |
- InitializeFromTestCase(type); |
- |
- scoped_refptr<SolidColorLayer> root = |
- CreateSolidColorLayer(gfx::Rect(kRootSize, kRootSize), SK_ColorWHITE); |
- scoped_refptr<Layer> background = |
- CreateColorfulBackdropLayer(kRootSize, kRootSize); |
- |
- background->SetIsRootForIsolatedGroup(true); |
- root->AddChild(background); |
- |
- CreateBlendingColorLayers(kLaneWidth, kLaneHeight, background.get(), flags); |
- |
- this->force_antialiasing_ = (flags & kUseAntialiasing); |
- this->force_blending_with_shaders_ = (flags & kForceShaders); |
- |
- if ((flags & kUseAntialiasing) && (test_type_ == PIXEL_TEST_GL)) { |
- // Anti aliasing causes differences up to 8 pixels at the edges. |
- int large_error_allowed = 8; |
- // Blending results might differ with one pixel. |
- int small_error_allowed = 1; |
- // Most of the errors are one pixel errors. |
- float percentage_pixels_small_error = 13.1f; |
- // Because of anti-aliasing, around 10% of pixels (at the edges) have |
- // bigger errors (from small_error_allowed + 1 to large_error_allowed). |
- float percentage_pixels_error = 22.5f; |
- // The average error is still close to 1. |
- float average_error_allowed_in_bad_pixels = 1.4f; |
- |
- pixel_comparator_.reset( |
- new FuzzyPixelComparator(false, // discard_alpha |
- percentage_pixels_error, |
- percentage_pixels_small_error, |
- average_error_allowed_in_bad_pixels, |
- large_error_allowed, |
- small_error_allowed)); |
- } |
- |
- RunPixelResourceTest(root, base::FilePath(expected_path)); |
- } |
- |
- bool force_antialiasing_; |
- bool force_blending_with_shaders_; |
-}; |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRoot_GL) { |
- RunBlendingWithRootPixelTestType(GL_ASYNC_UPLOAD_2D_DRAW); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRoot_Software) { |
- RunBlendingWithRootPixelTestType(SOFTWARE); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithBackgroundFilter) { |
- const int kLaneWidth = 2; |
- const int kLaneHeight = kLaneWidth; |
- const int kRootWidth = (kBlendModesCount + 2) * kLaneWidth; |
- const int kRootHeight = 2 * kLaneWidth + kLaneHeight; |
- InitializeFromTestCase(GL_ASYNC_UPLOAD_2D_DRAW); |
- |
- scoped_refptr<SolidColorLayer> background = |
- CreateSolidColorLayer(gfx::Rect(kRootWidth, kRootHeight), kCSSOrange); |
- |
- // Orange child layers have a background filter set and they will blend with |
- // the green background |
- for (int i = 0; i < kBlendModesCount; ++i) { |
- gfx::Rect child_rect( |
- (i + 1) * kLaneWidth, kLaneWidth, kLaneWidth, kLaneHeight); |
- scoped_refptr<SolidColorLayer> green_lane = |
- CreateSolidColorLayer(child_rect, kCSSGreen); |
- background->AddChild(green_lane); |
- |
- FilterOperations filters; |
- filters.Append(FilterOperation::CreateGrayscaleFilter(.75)); |
- green_lane->SetBackgroundFilters(filters); |
- green_lane->SetBlendMode(kBlendModes[i]); |
- } |
- |
- RunPixelResourceTest( |
- background, base::FilePath(FILE_PATH_LITERAL("blending_and_filter.png"))); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithTransparent_GL) { |
- RunBlendingWithTransparentPixelTestType(GL_ASYNC_UPLOAD_2D_DRAW); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithTransparent_Software) { |
- RunBlendingWithTransparentPixelTestType(SOFTWARE); |
-} |
- |
-// Tests for render passes |
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRenderPass_GL) { |
- RunBlendingWithRenderPass(GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass.png"), 0); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRenderPass_Software) { |
- RunBlendingWithRenderPass(SOFTWARE, |
- FILE_PATH_LITERAL("blending_render_pass.png"), 0); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRenderPassAA_GL) { |
- RunBlendingWithRenderPass(GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass.png"), |
- kUseAntialiasing); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRenderPassAA_Software) { |
- RunBlendingWithRenderPass(SOFTWARE, |
- FILE_PATH_LITERAL("blending_render_pass.png"), |
- kUseAntialiasing); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRenderPassWithMask_GL) { |
- RunBlendingWithRenderPass(GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass_mask.png"), |
- kUseMasks); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassWithMask_Software) { |
- RunBlendingWithRenderPass( |
- SOFTWARE, FILE_PATH_LITERAL("blending_render_pass_mask.png"), kUseMasks); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRenderPassWithMaskAA_GL) { |
- RunBlendingWithRenderPass(GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass_mask.png"), |
- kUseMasks | kUseAntialiasing); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassWithMaskAA_Software) { |
- RunBlendingWithRenderPass(SOFTWARE, |
- FILE_PATH_LITERAL("blending_render_pass_mask.png"), |
- kUseMasks | kUseAntialiasing); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRenderPassColorMatrix_GL) { |
- RunBlendingWithRenderPass(GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass.png"), |
- kUseColorMatrix); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassColorMatrix_Software) { |
- RunBlendingWithRenderPass( |
- SOFTWARE, FILE_PATH_LITERAL("blending_render_pass.png"), kUseColorMatrix); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRenderPassColorMatrixAA_GL) { |
- RunBlendingWithRenderPass(GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass.png"), |
- kUseAntialiasing | kUseColorMatrix); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassColorMatrixAA_Software) { |
- RunBlendingWithRenderPass(SOFTWARE, |
- FILE_PATH_LITERAL("blending_render_pass.png"), |
- kUseAntialiasing | kUseColorMatrix); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassWithMaskColorMatrix_GL) { |
- RunBlendingWithRenderPass(GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass_mask.png"), |
- kUseMasks | kUseColorMatrix); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassWithMaskColorMatrix_Software) { |
- RunBlendingWithRenderPass(SOFTWARE, |
- FILE_PATH_LITERAL("blending_render_pass_mask.png"), |
- kUseMasks | kUseColorMatrix); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassWithMaskColorMatrixAA_GL) { |
- RunBlendingWithRenderPass(GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass_mask.png"), |
- kUseMasks | kUseAntialiasing | kUseColorMatrix); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassWithMaskColorMatrixAA_Software) { |
- RunBlendingWithRenderPass(SOFTWARE, |
- FILE_PATH_LITERAL("blending_render_pass_mask.png"), |
- kUseMasks | kUseAntialiasing | kUseColorMatrix); |
-} |
- |
-// Tests for render passes forcing shaders for all the blend modes. |
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRenderPassShaders_GL) { |
- RunBlendingWithRenderPass(GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass.png"), |
- kForceShaders); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRenderPassShadersAA_GL) { |
- RunBlendingWithRenderPass(GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass.png"), |
- kUseAntialiasing | kForceShaders); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassShadersWithMask_GL) { |
- RunBlendingWithRenderPass(GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass_mask.png"), |
- kUseMasks | kForceShaders); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassShadersWithMask_GL_TextureRect) { |
- RunBlendingWithRenderPass(GL_ZERO_COPY_RECT_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass_mask.png"), |
- kUseMasks | kForceShaders); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassShadersWithMaskAA_GL) { |
- RunBlendingWithRenderPass(GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass_mask.png"), |
- kUseMasks | kUseAntialiasing | kForceShaders); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassShadersWithMaskAA_GL_TextureRect) { |
- RunBlendingWithRenderPass(GL_ZERO_COPY_RECT_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass_mask.png"), |
- kUseMasks | kUseAntialiasing | kForceShaders); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassShadersColorMatrix_GL) { |
- RunBlendingWithRenderPass(GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass.png"), |
- kUseColorMatrix | kForceShaders); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassShadersColorMatrixAA_GL) { |
- RunBlendingWithRenderPass(GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass.png"), |
- kUseAntialiasing | kUseColorMatrix | kForceShaders); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassShadersWithMaskColorMatrix_GL) { |
- RunBlendingWithRenderPass(GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass_mask.png"), |
- kUseMasks | kUseColorMatrix | kForceShaders); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassShadersWithMaskColorMatrix_GL_TextureRect) { |
- RunBlendingWithRenderPass(GL_ZERO_COPY_RECT_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass_mask.png"), |
- kUseMasks | kUseColorMatrix | kForceShaders); |
-} |
- |
-TEST_F(LayerTreeHostBlendingPixelTest, |
- BlendingWithRenderPassShadersWithMaskColorMatrixAA_GL) { |
- RunBlendingWithRenderPass( |
- GL_ASYNC_UPLOAD_2D_DRAW, |
- FILE_PATH_LITERAL("blending_render_pass_mask.png"), |
- kUseMasks | kUseAntialiasing | kUseColorMatrix | kForceShaders); |
-} |
- |
-} // namespace |
-} // namespace cc |
- |
-#endif // OS_ANDROID |