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.
7 #include "CCRenderSurfaceFilters.h"
9 #include "CompositorFakeWebGraphicsContext3D.h"
10 #include <gtest/gtest.h>
11 #include <public/WebFilterOperation.h>
12 #include <public/WebFilterOperations.h>
13 #include <wtf/RefPtr.h>
16 using namespace WebKit
;
20 // Checks whether op can be combined with a following color matrix.
21 bool isCombined(const WebFilterOperation
& op
)
23 WebFilterOperations filters
;
25 filters
.append(WebFilterOperation::createBrightnessFilter(0)); // brightness(0) is identity.
26 WebFilterOperations optimized
= CCRenderSurfaceFilters::optimize(filters
);
27 return optimized
.size() == 1;
30 TEST(CCRenderSurfaceFiltersTest
, testColorMatrixFiltersCombined
)
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)));
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)));
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)));
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)));
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)));
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)));
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)));
80 EXPECT_TRUE(isCombined(WebFilterOperation::createColorMatrixFilter(matrix1
)));
88 EXPECT_FALSE(isCombined(WebFilterOperation::createColorMatrixFilter(matrix2
)));
91 0.25, 0, 0, 0, 255*0.75,
96 EXPECT_TRUE(isCombined(WebFilterOperation::createColorMatrixFilter(matrix3
)));
99 -0.25, 0.75, 0, 0, 255*0.25,
104 EXPECT_TRUE(isCombined(WebFilterOperation::createColorMatrixFilter(matrix4
)));
107 TEST(CCRenderSurfaceFiltersTest
, testOptimize
)
109 WebFilterOperation
combines(WebFilterOperation::createBrightnessFilter(0));
110 WebFilterOperation
doesntCombine(WebFilterOperation::createBrightnessFilter(1));
112 WebFilterOperations filters
;
113 WebFilterOperations optimized
= CCRenderSurfaceFilters::optimize(filters
);
114 EXPECT_EQ(0u, optimized
.size());
116 filters
.append(combines
);
117 optimized
= CCRenderSurfaceFilters::optimize(filters
);
118 EXPECT_EQ(1u, optimized
.size());
120 filters
.append(combines
);
121 optimized
= CCRenderSurfaceFilters::optimize(filters
);
122 EXPECT_EQ(1u, optimized
.size());
124 filters
.append(doesntCombine
);
125 optimized
= CCRenderSurfaceFilters::optimize(filters
);
126 EXPECT_EQ(1u, optimized
.size());
128 filters
.append(combines
);
129 optimized
= CCRenderSurfaceFilters::optimize(filters
);
130 EXPECT_EQ(2u, optimized
.size());
132 filters
.append(doesntCombine
);
133 optimized
= CCRenderSurfaceFilters::optimize(filters
);
134 EXPECT_EQ(2u, optimized
.size());
136 filters
.append(doesntCombine
);
137 optimized
= CCRenderSurfaceFilters::optimize(filters
);
138 EXPECT_EQ(3u, optimized
.size());