Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "cc/layers/solid_color_layer.h" | 5 #include "cc/layers/solid_color_layer.h" |
| 6 #include "cc/layers/texture_layer.h" | 6 #include "cc/layers/texture_layer.h" |
| 7 #include "cc/test/layer_tree_pixel_test.h" | 7 #include "cc/test/layer_tree_pixel_test.h" |
| 8 #include "cc/test/pixel_test.h" | |
| 8 | 9 |
| 9 #if !defined(OS_ANDROID) | 10 #if !defined(OS_ANDROID) |
| 10 | 11 |
| 11 namespace cc { | 12 namespace cc { |
| 12 namespace { | 13 namespace { |
| 13 | 14 |
| 14 SkXfermode::Mode const kBlendModes[] = { | 15 SkXfermode::Mode const kBlendModes[] = { |
| 15 SkXfermode::kSrcOver_Mode, SkXfermode::kScreen_Mode, | 16 SkXfermode::kSrcOver_Mode, SkXfermode::kScreen_Mode, |
| 16 SkXfermode::kOverlay_Mode, SkXfermode::kDarken_Mode, | 17 SkXfermode::kOverlay_Mode, SkXfermode::kDarken_Mode, |
| 17 SkXfermode::kLighten_Mode, SkXfermode::kColorDodge_Mode, | 18 SkXfermode::kLighten_Mode, SkXfermode::kColorDodge_Mode, |
| 18 SkXfermode::kColorBurn_Mode, SkXfermode::kHardLight_Mode, | 19 SkXfermode::kColorBurn_Mode, SkXfermode::kHardLight_Mode, |
| 19 SkXfermode::kSoftLight_Mode, SkXfermode::kDifference_Mode, | 20 SkXfermode::kSoftLight_Mode, SkXfermode::kDifference_Mode, |
| 20 SkXfermode::kExclusion_Mode, SkXfermode::kMultiply_Mode, | 21 SkXfermode::kExclusion_Mode, SkXfermode::kMultiply_Mode, |
| 21 SkXfermode::kHue_Mode, SkXfermode::kSaturation_Mode, | 22 SkXfermode::kHue_Mode, SkXfermode::kSaturation_Mode, |
| 22 SkXfermode::kColor_Mode, SkXfermode::kLuminosity_Mode}; | 23 SkXfermode::kColor_Mode, SkXfermode::kLuminosity_Mode}; |
| 23 | 24 |
| 24 const int kBlendModesCount = arraysize(kBlendModes); | 25 const int kBlendModesCount = arraysize(kBlendModes); |
| 25 | 26 |
| 27 // All pixels can be off by one, but any more than that is an error. | |
| 28 class FuzzyPixelOffByOneComparator : public FuzzyPixelComparator { | |
|
enne (OOO)
2014/09/05 17:49:08
I feel like this is duplicated elsewhere. Can you
rosca
2014/09/05 20:52:27
Done.
| |
| 29 public: | |
| 30 explicit FuzzyPixelOffByOneComparator(bool discard_alpha) | |
| 31 : FuzzyPixelComparator(discard_alpha, 100.f, 0.f, 1.f, 1, 0) {} | |
| 32 }; | |
| 33 | |
| 26 class LayerTreeHostBlendingPixelTest : public LayerTreePixelTest { | 34 class LayerTreeHostBlendingPixelTest : public LayerTreePixelTest { |
| 27 protected: | 35 protected: |
| 28 void RunBlendingWithRootPixelTestType(PixelTestType type) { | 36 void RunBlendingWithRootPixelTestType(PixelTestType type) { |
| 29 const int kLaneWidth = 15; | 37 const int kLaneWidth = 15; |
| 30 const int kLaneHeight = kBlendModesCount * kLaneWidth; | 38 const int kLaneHeight = kBlendModesCount * kLaneWidth; |
| 31 const int kRootSize = (kBlendModesCount + 2) * kLaneWidth; | 39 const int kRootSize = (kBlendModesCount + 2) * kLaneWidth; |
| 32 | 40 |
| 33 scoped_refptr<SolidColorLayer> background = | 41 scoped_refptr<SolidColorLayer> background = |
| 34 CreateSolidColorLayer(gfx::Rect(kRootSize, kRootSize), kCSSOrange); | 42 CreateSolidColorLayer(gfx::Rect(kRootSize, kRootSize), kCSSOrange); |
| 35 | 43 |
| 36 // Orange child layers will blend with the green background | 44 // Orange child layers will blend with the green background |
| 37 for (int i = 0; i < kBlendModesCount; ++i) { | 45 for (int i = 0; i < kBlendModesCount; ++i) { |
| 38 gfx::Rect child_rect( | 46 gfx::Rect child_rect( |
| 39 (i + 1) * kLaneWidth, kLaneWidth, kLaneWidth, kLaneHeight); | 47 (i + 1) * kLaneWidth, kLaneWidth, kLaneWidth, kLaneHeight); |
| 40 scoped_refptr<SolidColorLayer> green_lane = | 48 scoped_refptr<SolidColorLayer> green_lane = |
| 41 CreateSolidColorLayer(child_rect, kCSSGreen); | 49 CreateSolidColorLayer(child_rect, kCSSGreen); |
| 42 background->AddChild(green_lane); | 50 background->AddChild(green_lane); |
| 43 green_lane->SetBlendMode(kBlendModes[i]); | 51 green_lane->SetBlendMode(kBlendModes[i]); |
| 44 } | 52 } |
| 45 | 53 |
| 54 if (type == SOFTWARE_WITH_BITMAP) | |
|
enne (OOO)
2014/09/05 17:49:08
I'd be ok with making all the blending tests use a
rosca
2014/09/05 20:52:28
Done.
| |
| 55 pixel_comparator_.reset(new FuzzyPixelOffByOneComparator(true)); | |
| 56 | |
| 46 RunPixelTest(type, | 57 RunPixelTest(type, |
| 47 background, | 58 background, |
| 48 base::FilePath(FILE_PATH_LITERAL("blending_with_root.png"))); | 59 base::FilePath(FILE_PATH_LITERAL("blending_with_root.png"))); |
| 49 } | 60 } |
| 50 | 61 |
| 51 void RunBlendingWithTransparentPixelTestType(PixelTestType type) { | 62 void RunBlendingWithTransparentPixelTestType(PixelTestType type) { |
| 52 const int kLaneWidth = 15; | 63 const int kLaneWidth = 15; |
| 53 const int kLaneHeight = kBlendModesCount * kLaneWidth; | 64 const int kLaneHeight = kBlendModesCount * kLaneWidth; |
| 54 const int kRootSize = (kBlendModesCount + 2) * kLaneWidth; | 65 const int kRootSize = (kBlendModesCount + 2) * kLaneWidth; |
| 55 | 66 |
| 56 scoped_refptr<SolidColorLayer> root = | 67 scoped_refptr<SolidColorLayer> root = |
| 57 CreateSolidColorLayer(gfx::Rect(kRootSize, kRootSize), kCSSBrown); | 68 CreateSolidColorLayer(gfx::Rect(kRootSize, kRootSize), kCSSBrown); |
| 58 | 69 |
| 59 scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer( | 70 scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer( |
| 60 gfx::Rect(0, kLaneWidth * 2, kRootSize, kLaneWidth), kCSSOrange); | 71 gfx::Rect(0, kLaneWidth * 2, kRootSize, kLaneWidth), kCSSOrange); |
| 61 | 72 |
| 62 root->AddChild(background); | 73 root->AddChild(background); |
| 63 background->SetIsRootForIsolatedGroup(true); | 74 background->SetIsRootForIsolatedGroup(true); |
| 64 | 75 |
| 65 // Orange child layers will blend with the green background | 76 // Orange child layers will blend with the green background |
| 66 for (int i = 0; i < kBlendModesCount; ++i) { | 77 for (int i = 0; i < kBlendModesCount; ++i) { |
| 67 gfx::Rect child_rect( | 78 gfx::Rect child_rect( |
| 68 (i + 1) * kLaneWidth, -kLaneWidth, kLaneWidth, kLaneHeight); | 79 (i + 1) * kLaneWidth, -kLaneWidth, kLaneWidth, kLaneHeight); |
| 69 scoped_refptr<SolidColorLayer> green_lane = | 80 scoped_refptr<SolidColorLayer> green_lane = |
| 70 CreateSolidColorLayer(child_rect, kCSSGreen); | 81 CreateSolidColorLayer(child_rect, kCSSGreen); |
| 71 background->AddChild(green_lane); | 82 background->AddChild(green_lane); |
| 72 green_lane->SetBlendMode(kBlendModes[i]); | 83 green_lane->SetBlendMode(kBlendModes[i]); |
| 73 } | 84 } |
| 74 | 85 |
| 86 if (type == SOFTWARE_WITH_BITMAP) | |
| 87 pixel_comparator_.reset(new FuzzyPixelOffByOneComparator(true)); | |
| 88 | |
| 75 RunPixelTest(type, | 89 RunPixelTest(type, |
| 76 root, | 90 root, |
| 77 base::FilePath(FILE_PATH_LITERAL("blending_transparent.png"))); | 91 base::FilePath(FILE_PATH_LITERAL("blending_transparent.png"))); |
| 78 } | 92 } |
| 79 }; | 93 }; |
| 80 | 94 |
| 81 TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRoot_GL) { | 95 TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRoot_GL) { |
| 82 RunBlendingWithRootPixelTestType(GL_WITH_BITMAP); | 96 RunBlendingWithRootPixelTestType(GL_WITH_BITMAP); |
| 83 } | 97 } |
| 84 | 98 |
| 99 TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithRoot_Software) { | |
| 100 RunBlendingWithRootPixelTestType(SOFTWARE_WITH_BITMAP); | |
| 101 } | |
| 102 | |
| 85 TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithBackgroundFilter) { | 103 TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithBackgroundFilter) { |
| 86 const int kLaneWidth = 15; | 104 const int kLaneWidth = 15; |
| 87 const int kLaneHeight = kBlendModesCount * kLaneWidth; | 105 const int kLaneHeight = kBlendModesCount * kLaneWidth; |
| 88 const int kRootSize = (kBlendModesCount + 2) * kLaneWidth; | 106 const int kRootSize = (kBlendModesCount + 2) * kLaneWidth; |
| 89 | 107 |
| 90 scoped_refptr<SolidColorLayer> background = | 108 scoped_refptr<SolidColorLayer> background = |
| 91 CreateSolidColorLayer(gfx::Rect(kRootSize, kRootSize), kCSSOrange); | 109 CreateSolidColorLayer(gfx::Rect(kRootSize, kRootSize), kCSSOrange); |
| 92 | 110 |
| 93 // Orange child layers have a background filter set and they will blend with | 111 // Orange child layers have a background filter set and they will blend with |
| 94 // the green background | 112 // the green background |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 107 | 125 |
| 108 RunPixelTest(GL_WITH_BITMAP, | 126 RunPixelTest(GL_WITH_BITMAP, |
| 109 background, | 127 background, |
| 110 base::FilePath(FILE_PATH_LITERAL("blending_and_filter.png"))); | 128 base::FilePath(FILE_PATH_LITERAL("blending_and_filter.png"))); |
| 111 } | 129 } |
| 112 | 130 |
| 113 TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithTransparent_GL) { | 131 TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithTransparent_GL) { |
| 114 RunBlendingWithTransparentPixelTestType(GL_WITH_BITMAP); | 132 RunBlendingWithTransparentPixelTestType(GL_WITH_BITMAP); |
| 115 } | 133 } |
| 116 | 134 |
| 135 TEST_F(LayerTreeHostBlendingPixelTest, BlendingWithTransparent_Software) { | |
| 136 RunBlendingWithTransparentPixelTestType(SOFTWARE_WITH_BITMAP); | |
| 137 } | |
| 138 | |
| 117 } // namespace | 139 } // namespace |
| 118 } // namespace cc | 140 } // namespace cc |
| 119 | 141 |
| 120 #endif // OS_ANDROID | 142 #endif // OS_ANDROID |
| OLD | NEW |