diff options
Diffstat (limited to 'chromium/cc/output/render_surface_filters_unittest.cc')
-rw-r--r-- | chromium/cc/output/render_surface_filters_unittest.cc | 140 |
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 |