summaryrefslogtreecommitdiff
path: root/chromium/cc/output/render_surface_filters_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/cc/output/render_surface_filters_unittest.cc')
-rw-r--r--chromium/cc/output/render_surface_filters_unittest.cc140
1 files changed, 140 insertions, 0 deletions
diff --git a/chromium/cc/output/render_surface_filters_unittest.cc b/chromium/cc/output/render_surface_filters_unittest.cc
new file mode 100644
index 00000000000..38c6cc343b1
--- /dev/null
+++ b/chromium/cc/output/render_surface_filters_unittest.cc
@@ -0,0 +1,140 @@
+// Copyright 2012 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/output/render_surface_filters.h"
+
+#include "cc/output/filter_operation.h"
+#include "cc/output/filter_operations.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace cc {
+namespace {
+
+// Checks whether op can be combined with a following color matrix.
+bool IsCombined(const FilterOperation& op) {
+ FilterOperations filters;
+ filters.Append(op);
+ // brightness(0.0f) is identity.
+ filters.Append(FilterOperation::CreateBrightnessFilter(0.0f));
+ FilterOperations optimized = RenderSurfaceFilters::Optimize(filters);
+ return optimized.size() == 1;
+}
+
+TEST(RenderSurfaceFiltersTest, TestColorMatrixFiltersCombined) {
+ // Several filters should always combine for any amount between 0 and 1:
+ // grayscale, saturate, invert, contrast, opacity.
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateGrayscaleFilter(0.0f)));
+ // Note that we use 0.3f to avoid "argument is truncated from 'double' to
+ // 'float'" warnings on Windows. 0.5f is exactly representable as a float, so
+ // there is no warning.
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateGrayscaleFilter(0.3f)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateGrayscaleFilter(0.5f)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateGrayscaleFilter(1.0f)));
+
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateSaturateFilter(0.0f)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateSaturateFilter(0.3f)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateSaturateFilter(0.5)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateSaturateFilter(1.0f)));
+
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateInvertFilter(0.0f)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateInvertFilter(0.3f)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateInvertFilter(0.5)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateInvertFilter(1.0f)));
+
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateContrastFilter(0.0f)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateContrastFilter(0.3f)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateContrastFilter(0.5)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateContrastFilter(1.0f)));
+
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateOpacityFilter(0.0f)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateOpacityFilter(0.3f)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateOpacityFilter(0.5)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateOpacityFilter(1.0f)));
+
+ // Brightness combines when amount <= 1
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateBrightnessFilter(0.5)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateBrightnessFilter(1.0f)));
+ EXPECT_FALSE(IsCombined(FilterOperation::CreateBrightnessFilter(1.5)));
+
+ // SaturatingBrightness combines only when amount == 0
+ EXPECT_TRUE(
+ IsCombined(FilterOperation::CreateSaturatingBrightnessFilter(0.0f)));
+ EXPECT_FALSE(
+ IsCombined(FilterOperation::CreateSaturatingBrightnessFilter(0.5)));
+ EXPECT_FALSE(
+ IsCombined(FilterOperation::CreateSaturatingBrightnessFilter(1.0f)));
+
+ // Several filters should never combine: blur, drop-shadow.
+ EXPECT_FALSE(IsCombined(FilterOperation::CreateBlurFilter(3.0f)));
+ EXPECT_FALSE(IsCombined(FilterOperation::CreateDropShadowFilter(
+ gfx::Point(2, 2), 3.0f, 0xffffffff)));
+
+ // sepia and hue may or may not combine depending on the value.
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateSepiaFilter(0.0f)));
+ EXPECT_FALSE(IsCombined(FilterOperation::CreateSepiaFilter(1.0f)));
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateHueRotateFilter(0.0f)));
+ EXPECT_FALSE(IsCombined(FilterOperation::CreateHueRotateFilter(180.0f)));
+
+ float matrix1[20] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, };
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateColorMatrixFilter(matrix1)));
+
+ float matrix2[20] = { 1.0f, 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, };
+ EXPECT_FALSE(
+ IsCombined(FilterOperation::CreateColorMatrixFilter(matrix2)));
+
+ float matrix3[20] = { 0.25f, 0.0f, 0.0f, 0.0f, 255.0f * 0.75f,
+ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, };
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateColorMatrixFilter(matrix3)));
+
+ float matrix4[20] = { -0.25f, 0.75f, 0.0f, 0.0f, 255.0f * 0.25f,
+ 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, };
+ EXPECT_TRUE(IsCombined(FilterOperation::CreateColorMatrixFilter(matrix4)));
+}
+
+TEST(RenderSurfaceFiltersTest, TestOptimize) {
+ FilterOperation combines(FilterOperation::CreateBrightnessFilter(1.0f));
+ FilterOperation doesnt_combine(
+ FilterOperation::CreateBrightnessFilter(1.5f));
+
+ FilterOperations filters;
+ FilterOperations optimized = RenderSurfaceFilters::Optimize(filters);
+ EXPECT_EQ(0u, optimized.size());
+
+ filters.Append(combines);
+ optimized = RenderSurfaceFilters::Optimize(filters);
+ EXPECT_EQ(1u, optimized.size());
+
+ filters.Append(combines);
+ optimized = RenderSurfaceFilters::Optimize(filters);
+ EXPECT_EQ(1u, optimized.size());
+
+ filters.Append(doesnt_combine);
+ optimized = RenderSurfaceFilters::Optimize(filters);
+ EXPECT_EQ(1u, optimized.size());
+
+ filters.Append(combines);
+ optimized = RenderSurfaceFilters::Optimize(filters);
+ EXPECT_EQ(2u, optimized.size());
+
+ filters.Append(doesnt_combine);
+ optimized = RenderSurfaceFilters::Optimize(filters);
+ EXPECT_EQ(2u, optimized.size());
+
+ filters.Append(doesnt_combine);
+ optimized = RenderSurfaceFilters::Optimize(filters);
+ EXPECT_EQ(3u, optimized.size());
+}
+
+} // namespace
+} // namespace cc