OLD | NEW |
| (Empty) |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "config.h" | |
6 | |
7 #include "CCRenderSurfaceFilters.h" | |
8 | |
9 #include "CompositorFakeWebGraphicsContext3D.h" | |
10 #include "testing/gtest/include/gtest/gtest.h" | |
11 #include <public/WebFilterOperation.h> | |
12 #include <public/WebFilterOperations.h> | |
13 #include <wtf/RefPtr.h> | |
14 | |
15 using namespace cc; | |
16 using namespace WebKit; | |
17 | |
18 namespace { | |
19 | |
20 // Checks whether op can be combined with a following color matrix. | |
21 bool isCombined(const WebFilterOperation& op) | |
22 { | |
23 WebFilterOperations filters; | |
24 filters.append(op); | |
25 filters.append(WebFilterOperation::createBrightnessFilter(0)); // brightness
(0) is identity. | |
26 WebFilterOperations optimized = CCRenderSurfaceFilters::optimize(filters); | |
27 return optimized.size() == 1; | |
28 } | |
29 | |
30 TEST(CCRenderSurfaceFiltersTest, testColorMatrixFiltersCombined) | |
31 { | |
32 // Several filters should always combine for any amount between 0 and 1: | |
33 // grayscale, saturate, invert, contrast, opacity. | |
34 EXPECT_TRUE(isCombined(WebFilterOperation::createGrayscaleFilter(0))); | |
35 // Note that we use 0.3f to avoid "argument is truncated from 'double' to | |
36 // 'float'" warnings on Windows. 0.5 is exactly representable as a float, so | |
37 // there is no warning. | |
38 EXPECT_TRUE(isCombined(WebFilterOperation::createGrayscaleFilter(0.3f))); | |
39 EXPECT_TRUE(isCombined(WebFilterOperation::createGrayscaleFilter(0.5))); | |
40 EXPECT_TRUE(isCombined(WebFilterOperation::createGrayscaleFilter(1))); | |
41 | |
42 EXPECT_TRUE(isCombined(WebFilterOperation::createSaturateFilter(0))); | |
43 EXPECT_TRUE(isCombined(WebFilterOperation::createSaturateFilter(0.3f))); | |
44 EXPECT_TRUE(isCombined(WebFilterOperation::createSaturateFilter(0.5))); | |
45 EXPECT_TRUE(isCombined(WebFilterOperation::createSaturateFilter(1))); | |
46 | |
47 EXPECT_TRUE(isCombined(WebFilterOperation::createInvertFilter(0))); | |
48 EXPECT_TRUE(isCombined(WebFilterOperation::createInvertFilter(0.3f))); | |
49 EXPECT_TRUE(isCombined(WebFilterOperation::createInvertFilter(0.5))); | |
50 EXPECT_TRUE(isCombined(WebFilterOperation::createInvertFilter(1))); | |
51 | |
52 EXPECT_TRUE(isCombined(WebFilterOperation::createContrastFilter(0))); | |
53 EXPECT_TRUE(isCombined(WebFilterOperation::createContrastFilter(0.3f))); | |
54 EXPECT_TRUE(isCombined(WebFilterOperation::createContrastFilter(0.5))); | |
55 EXPECT_TRUE(isCombined(WebFilterOperation::createContrastFilter(1))); | |
56 | |
57 EXPECT_TRUE(isCombined(WebFilterOperation::createOpacityFilter(0))); | |
58 EXPECT_TRUE(isCombined(WebFilterOperation::createOpacityFilter(0.3f))); | |
59 EXPECT_TRUE(isCombined(WebFilterOperation::createOpacityFilter(0.5))); | |
60 EXPECT_TRUE(isCombined(WebFilterOperation::createOpacityFilter(1))); | |
61 | |
62 // Several filters should never combine: brightness(amount > 0), blur, drop-
shadow. | |
63 EXPECT_FALSE(isCombined(WebFilterOperation::createBrightnessFilter(0.5))); | |
64 EXPECT_FALSE(isCombined(WebFilterOperation::createBrightnessFilter(1))); | |
65 EXPECT_FALSE(isCombined(WebFilterOperation::createBlurFilter(3))); | |
66 EXPECT_FALSE(isCombined(WebFilterOperation::createDropShadowFilter(WebPoint(
2, 2), 3, 0xffffffff))); | |
67 | |
68 // sepia and hue may or may not combine depending on the value. | |
69 EXPECT_TRUE(isCombined(WebFilterOperation::createSepiaFilter(0))); | |
70 EXPECT_FALSE(isCombined(WebFilterOperation::createSepiaFilter(1))); | |
71 EXPECT_TRUE(isCombined(WebFilterOperation::createHueRotateFilter(0))); | |
72 EXPECT_FALSE(isCombined(WebFilterOperation::createHueRotateFilter(180))); | |
73 | |
74 float matrix1[20] = { | |
75 1, 0, 0, 0, 0, | |
76 0, 1, 0, 0, 0, | |
77 0, 0, 1, 0, 0, | |
78 0, 0, 0, 1, 0, | |
79 }; | |
80 EXPECT_TRUE(isCombined(WebFilterOperation::createColorMatrixFilter(matrix1))
); | |
81 | |
82 float matrix2[20] = { | |
83 1, 1, 0, 0, 0, | |
84 0, 1, 0, 0, 0, | |
85 0, 0, 1, 0, 0, | |
86 0, 0, 0, 1, 0, | |
87 }; | |
88 EXPECT_FALSE(isCombined(WebFilterOperation::createColorMatrixFilter(matrix2)
)); | |
89 | |
90 float matrix3[20] = { | |
91 0.25, 0, 0, 0, 255*0.75, | |
92 0, 1, 0, 0, 0, | |
93 0, 0, 1, 0, 0, | |
94 0, 0, 0, 1, 0, | |
95 }; | |
96 EXPECT_TRUE(isCombined(WebFilterOperation::createColorMatrixFilter(matrix3))
); | |
97 | |
98 float matrix4[20] = { | |
99 -0.25, 0.75, 0, 0, 255*0.25, | |
100 0, 1, 0, 0, 0, | |
101 0, 0, 1, 0, 0, | |
102 0, 0, 0, 1, 0, | |
103 }; | |
104 EXPECT_TRUE(isCombined(WebFilterOperation::createColorMatrixFilter(matrix4))
); | |
105 } | |
106 | |
107 TEST(CCRenderSurfaceFiltersTest, testOptimize) | |
108 { | |
109 WebFilterOperation combines(WebFilterOperation::createBrightnessFilter(0)); | |
110 WebFilterOperation doesntCombine(WebFilterOperation::createBrightnessFilter(
1)); | |
111 | |
112 WebFilterOperations filters; | |
113 WebFilterOperations optimized = CCRenderSurfaceFilters::optimize(filters); | |
114 EXPECT_EQ(0u, optimized.size()); | |
115 | |
116 filters.append(combines); | |
117 optimized = CCRenderSurfaceFilters::optimize(filters); | |
118 EXPECT_EQ(1u, optimized.size()); | |
119 | |
120 filters.append(combines); | |
121 optimized = CCRenderSurfaceFilters::optimize(filters); | |
122 EXPECT_EQ(1u, optimized.size()); | |
123 | |
124 filters.append(doesntCombine); | |
125 optimized = CCRenderSurfaceFilters::optimize(filters); | |
126 EXPECT_EQ(1u, optimized.size()); | |
127 | |
128 filters.append(combines); | |
129 optimized = CCRenderSurfaceFilters::optimize(filters); | |
130 EXPECT_EQ(2u, optimized.size()); | |
131 | |
132 filters.append(doesntCombine); | |
133 optimized = CCRenderSurfaceFilters::optimize(filters); | |
134 EXPECT_EQ(2u, optimized.size()); | |
135 | |
136 filters.append(doesntCombine); | |
137 optimized = CCRenderSurfaceFilters::optimize(filters); | |
138 EXPECT_EQ(3u, optimized.size()); | |
139 } | |
140 | |
141 } // namespace | |
OLD | NEW |