// Copyright (c) 2013 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.
#ifndef CC_TEST_PIXEL_COMPARATOR_H_
#define CC_TEST_PIXEL_COMPARATOR_H_
#include "base/compiler_specific.h"
#include "third_party/skia/include/core/SkBitmap.h"
namespace cc {
// Interface for pixel comparators.
class PixelComparator {
public:
virtual ~PixelComparator() {}
virtual bool Compare(const SkBitmap& actual_bmp,
const SkBitmap& expected_bmp) const = 0;
};
// Exact pixel comparator. Counts the number of pixel with an error.
class ExactPixelComparator : public PixelComparator {
public:
explicit ExactPixelComparator(const bool discard_alpha);
virtual ~ExactPixelComparator() {}
// Returns true if the two bitmaps are identical. Otherwise, returns false
// and report the number of pixels with an error on LOG(ERROR). Differences
// in the alpha channel are ignored.
virtual bool Compare(const SkBitmap& actual_bmp,
const SkBitmap& expected_bmp) const OVERRIDE;
private:
// Exclude alpha channel from comparison?
bool discard_alpha_;
};
// Fuzzy pixel comparator. Counts small and arbitrary errors separately and
// computes average and maximum absolute errors per color channel.
class FuzzyPixelComparator : public PixelComparator {
public:
FuzzyPixelComparator(const bool discard_alpha,
const float error_pixels_percentage_limit,
const float small_error_pixels_percentage_limit,
const float avg_abs_error_limit,
const int max_abs_error_limit,
const int small_error_threshold);
virtual ~FuzzyPixelComparator() {}
// Computes error metrics and returns true if the errors don't exceed the
// specified limits. Otherwise, returns false and reports the error metrics on
// LOG(ERROR). Differences in the alpha channel are ignored.
virtual bool Compare(const SkBitmap& actual_bmp,
const SkBitmap& expected_bmp) const OVERRIDE;
private:
// Exclude alpha channel from comparison?
bool discard_alpha_;
// Limit for percentage of pixels with an error.
float error_pixels_percentage_limit_;
// Limit for percentage of pixels with a small error.
float small_error_pixels_percentage_limit_;
// Limit for average absolute error (excluding identical pixels).
float avg_abs_error_limit_;
// Limit for largest absolute error.
int max_abs_error_limit_;
// Threshold for small errors.
int small_error_threshold_;
};
} // namespace cc
#endif // CC_TEST_PIXEL_COMPARATOR_H_