1// Copyright (c) 2013 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#ifndef CC_TEST_PIXEL_COMPARATOR_H_
6#define CC_TEST_PIXEL_COMPARATOR_H_
7
8#include "base/compiler_specific.h"
9#include "third_party/skia/include/core/SkBitmap.h"
10
11namespace cc {
12
13// Interface for pixel comparators.
14class PixelComparator {
15 public:
16  virtual ~PixelComparator() {}
17
18  virtual bool Compare(const SkBitmap& actual_bmp,
19                       const SkBitmap& expected_bmp) const = 0;
20};
21
22// Exact pixel comparator. Counts the number of pixel with an error.
23class ExactPixelComparator : public PixelComparator {
24 public:
25  explicit ExactPixelComparator(const bool discard_alpha);
26  virtual ~ExactPixelComparator() {}
27
28  // Returns true if the two bitmaps are identical. Otherwise, returns false
29  // and report the number of pixels with an error on LOG(ERROR). Differences
30  // in the alpha channel are ignored.
31  virtual bool Compare(const SkBitmap& actual_bmp,
32                       const SkBitmap& expected_bmp) const OVERRIDE;
33
34 private:
35  // Exclude alpha channel from comparison?
36  bool discard_alpha_;
37};
38
39// Fuzzy pixel comparator. Counts small and arbitrary errors separately and
40// computes average and maximum absolute errors per color channel.
41class FuzzyPixelComparator : public PixelComparator {
42 public:
43  FuzzyPixelComparator(const bool discard_alpha,
44                       const float error_pixels_percentage_limit,
45                       const float small_error_pixels_percentage_limit,
46                       const float avg_abs_error_limit,
47                       const int max_abs_error_limit,
48                       const int small_error_threshold);
49  virtual ~FuzzyPixelComparator() {}
50
51  // Computes error metrics and returns true if the errors don't exceed the
52  // specified limits. Otherwise, returns false and reports the error metrics on
53  // LOG(ERROR). Differences in the alpha channel are ignored.
54  virtual bool Compare(const SkBitmap& actual_bmp,
55                       const SkBitmap& expected_bmp) const OVERRIDE;
56
57 private:
58  // Exclude alpha channel from comparison?
59  bool discard_alpha_;
60  // Limit for percentage of pixels with an error.
61  float error_pixels_percentage_limit_;
62  // Limit for percentage of pixels with a small error.
63  float small_error_pixels_percentage_limit_;
64  // Limit for average absolute error (excluding identical pixels).
65  float avg_abs_error_limit_;
66  // Limit for largest absolute error.
67  int max_abs_error_limit_;
68  // Threshold for small errors.
69  int small_error_threshold_;
70};
71
72// All pixels can be off by one, but any more than that is an error.
73class FuzzyPixelOffByOneComparator : public FuzzyPixelComparator {
74 public:
75  explicit FuzzyPixelOffByOneComparator(bool discard_alpha)
76      : FuzzyPixelComparator(discard_alpha, 100.f, 0.f, 1.f, 1, 0) {}
77};
78
79}  // namespace cc
80
81#endif  // CC_TEST_PIXEL_COMPARATOR_H_
82