Home | History | Annotate | Download | only in output
      1 // Copyright 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "cc/output/render_surface_filters.h"
      6 
      7 #include "cc/output/filter_operation.h"
      8 #include "cc/output/filter_operations.h"
      9 #include "testing/gtest/include/gtest/gtest.h"
     10 
     11 namespace cc {
     12 namespace {
     13 
     14 // Checks whether op can be combined with a following color matrix.
     15 bool IsCombined(const FilterOperation& op) {
     16   FilterOperations filters;
     17   filters.Append(op);
     18   // brightness(0.0f) is identity.
     19   filters.Append(FilterOperation::CreateBrightnessFilter(0.0f));
     20   FilterOperations optimized = RenderSurfaceFilters::Optimize(filters);
     21   return optimized.size() == 1;
     22 }
     23 
     24 TEST(RenderSurfaceFiltersTest, TestColorMatrixFiltersCombined) {
     25   // Several filters should always combine for any amount between 0 and 1:
     26   // grayscale, saturate, invert, contrast, opacity.
     27   EXPECT_TRUE(IsCombined(FilterOperation::CreateGrayscaleFilter(0.0f)));
     28   // Note that we use 0.3f to avoid "argument is truncated from 'double' to
     29   // 'float'" warnings on Windows. 0.5f is exactly representable as a float, so
     30   // there is no warning.
     31   EXPECT_TRUE(IsCombined(FilterOperation::CreateGrayscaleFilter(0.3f)));
     32   EXPECT_TRUE(IsCombined(FilterOperation::CreateGrayscaleFilter(0.5f)));
     33   EXPECT_TRUE(IsCombined(FilterOperation::CreateGrayscaleFilter(1.0f)));
     34 
     35   EXPECT_TRUE(IsCombined(FilterOperation::CreateSaturateFilter(0.0f)));
     36   EXPECT_TRUE(IsCombined(FilterOperation::CreateSaturateFilter(0.3f)));
     37   EXPECT_TRUE(IsCombined(FilterOperation::CreateSaturateFilter(0.5)));
     38   EXPECT_TRUE(IsCombined(FilterOperation::CreateSaturateFilter(1.0f)));
     39 
     40   EXPECT_TRUE(IsCombined(FilterOperation::CreateInvertFilter(0.0f)));
     41   EXPECT_TRUE(IsCombined(FilterOperation::CreateInvertFilter(0.3f)));
     42   EXPECT_TRUE(IsCombined(FilterOperation::CreateInvertFilter(0.5)));
     43   EXPECT_TRUE(IsCombined(FilterOperation::CreateInvertFilter(1.0f)));
     44 
     45   EXPECT_TRUE(IsCombined(FilterOperation::CreateContrastFilter(0.0f)));
     46   EXPECT_TRUE(IsCombined(FilterOperation::CreateContrastFilter(0.3f)));
     47   EXPECT_TRUE(IsCombined(FilterOperation::CreateContrastFilter(0.5)));
     48   EXPECT_TRUE(IsCombined(FilterOperation::CreateContrastFilter(1.0f)));
     49 
     50   EXPECT_TRUE(IsCombined(FilterOperation::CreateOpacityFilter(0.0f)));
     51   EXPECT_TRUE(IsCombined(FilterOperation::CreateOpacityFilter(0.3f)));
     52   EXPECT_TRUE(IsCombined(FilterOperation::CreateOpacityFilter(0.5)));
     53   EXPECT_TRUE(IsCombined(FilterOperation::CreateOpacityFilter(1.0f)));
     54 
     55   // Brightness combines when amount <= 1
     56   EXPECT_TRUE(IsCombined(FilterOperation::CreateBrightnessFilter(0.5)));
     57   EXPECT_TRUE(IsCombined(FilterOperation::CreateBrightnessFilter(1.0f)));
     58   EXPECT_FALSE(IsCombined(FilterOperation::CreateBrightnessFilter(1.5)));
     59 
     60   // SaturatingBrightness combines only when amount == 0
     61   EXPECT_TRUE(
     62       IsCombined(FilterOperation::CreateSaturatingBrightnessFilter(0.0f)));
     63   EXPECT_FALSE(
     64       IsCombined(FilterOperation::CreateSaturatingBrightnessFilter(0.5)));
     65   EXPECT_FALSE(
     66       IsCombined(FilterOperation::CreateSaturatingBrightnessFilter(1.0f)));
     67 
     68   // Several filters should never combine: blur, drop-shadow.
     69   EXPECT_FALSE(IsCombined(FilterOperation::CreateBlurFilter(3.0f)));
     70   EXPECT_FALSE(IsCombined(FilterOperation::CreateDropShadowFilter(
     71       gfx::Point(2, 2), 3.0f, 0xffffffff)));
     72 
     73   // sepia and hue may or may not combine depending on the value.
     74   EXPECT_TRUE(IsCombined(FilterOperation::CreateSepiaFilter(0.0f)));
     75   EXPECT_FALSE(IsCombined(FilterOperation::CreateSepiaFilter(1.0f)));
     76   EXPECT_TRUE(IsCombined(FilterOperation::CreateHueRotateFilter(0.0f)));
     77   EXPECT_FALSE(IsCombined(FilterOperation::CreateHueRotateFilter(180.0f)));
     78 
     79   float matrix1[20] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
     80                         0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
     81                         0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
     82                         0.0f, 0.0f, 0.0f, 1.0f, 0.0f, };
     83   EXPECT_TRUE(IsCombined(FilterOperation::CreateColorMatrixFilter(matrix1)));
     84 
     85   float matrix2[20] = { 1.0f, 1.0f, 0.0f, 0.0f, 0.0f,
     86                         0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
     87                         0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
     88                         0.0f, 0.0f, 0.0f, 1.0f, 0.0f, };
     89   EXPECT_FALSE(
     90       IsCombined(FilterOperation::CreateColorMatrixFilter(matrix2)));
     91 
     92   float matrix3[20] = { 0.25f, 0.0f, 0.0f, 0.0f, 255.0f * 0.75f,
     93                         0.0f,  1.0f, 0.0f, 0.0f, 0.0f,
     94                         0.0f,  0.0f, 1.0f, 0.0f, 0.0f,
     95                         0.0f,  0.0f, 0.0f, 1.0f, 0.0f, };
     96   EXPECT_TRUE(IsCombined(FilterOperation::CreateColorMatrixFilter(matrix3)));
     97 
     98   float matrix4[20] = { -0.25f, 0.75f, 0.0f, 0.0f, 255.0f * 0.25f,
     99                          0.0f,  1.0f,  0.0f, 0.0f, 0.0f,
    100                          0.0f,  0.0f,  1.0f, 0.0f, 0.0f,
    101                          0.0f,  0.0f,  0.0f, 1.0f, 0.0f, };
    102   EXPECT_TRUE(IsCombined(FilterOperation::CreateColorMatrixFilter(matrix4)));
    103 }
    104 
    105 TEST(RenderSurfaceFiltersTest, TestOptimize) {
    106   FilterOperation combines(FilterOperation::CreateBrightnessFilter(1.0f));
    107   FilterOperation doesnt_combine(
    108       FilterOperation::CreateBrightnessFilter(1.5f));
    109 
    110   FilterOperations filters;
    111   FilterOperations optimized = RenderSurfaceFilters::Optimize(filters);
    112   EXPECT_EQ(0u, optimized.size());
    113 
    114   filters.Append(combines);
    115   optimized = RenderSurfaceFilters::Optimize(filters);
    116   EXPECT_EQ(1u, optimized.size());
    117 
    118   filters.Append(combines);
    119   optimized = RenderSurfaceFilters::Optimize(filters);
    120   EXPECT_EQ(1u, optimized.size());
    121 
    122   filters.Append(doesnt_combine);
    123   optimized = RenderSurfaceFilters::Optimize(filters);
    124   EXPECT_EQ(1u, optimized.size());
    125 
    126   filters.Append(combines);
    127   optimized = RenderSurfaceFilters::Optimize(filters);
    128   EXPECT_EQ(2u, optimized.size());
    129 
    130   filters.Append(doesnt_combine);
    131   optimized = RenderSurfaceFilters::Optimize(filters);
    132   EXPECT_EQ(2u, optimized.size());
    133 
    134   filters.Append(doesnt_combine);
    135   optimized = RenderSurfaceFilters::Optimize(filters);
    136   EXPECT_EQ(3u, optimized.size());
    137 }
    138 
    139 }  // namespace
    140 }  // namespace cc
    141