blob: 38c6cc343b16a075e060964192177ae597e6fd2c [file] [log] [blame]
// 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