// 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