summaryrefslogtreecommitdiffstats
path: root/cc/output/render_surface_filters_unittest.cc
blob: 38c6cc343b16a075e060964192177ae597e6fd2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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