blob: 305e7e55a6a617c334689e95215479034c6cd652 [file] [log] [blame]
// Copyright 2019 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 THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_DARK_MODE_IMAGE_CLASSIFIER_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_DARK_MODE_IMAGE_CLASSIFIER_H_
#include <vector>
#include "base/gtest_prod_util.h"
#include "base/optional.h"
#include "third_party/blink/renderer/platform/graphics/dark_mode_types.h"
#include "third_party/blink/renderer/platform/platform_export.h"
#include "third_party/skia/include/core/SkPixmap.h"
#include "third_party/skia/include/core/SkRect.h"
namespace blink {
FORWARD_DECLARE_TEST(DarkModeImageClassifierTest, BlockSamples);
FORWARD_DECLARE_TEST(DarkModeImageClassifierTest, FeaturesAndClassification);
// This class is not threadsafe as the cache used for storing classification
// results is not threadsafe. So it can be used only in blink main thread.
class PLATFORM_EXPORT DarkModeImageClassifier {
public:
DarkModeImageClassifier();
~DarkModeImageClassifier();
struct Features {
// True if the image is in color, false if it is grayscale.
bool is_colorful;
// Ratio of the number of bucketed colors used in the image to all
// possibilities. Color buckets are represented with 4 bits per color
// channel.
float color_buckets_ratio;
// How much of the image is transparent or considered part of the
// background.
float transparency_ratio;
float background_ratio;
};
DarkModeResult Classify(const SkPixmap& pixmap, const SkIRect& src) const;
private:
DarkModeResult ClassifyWithFeatures(const Features& features) const;
DarkModeResult ClassifyUsingDecisionTree(const Features& features) const;
enum class ColorMode { kColor = 0, kGrayscale = 1 };
base::Optional<Features> GetFeatures(const SkPixmap& pixmap,
const SkIRect& src) const;
// Extracts a sample set of pixels (|sampled_pixels|), |transparency_ratio|,
// and |background_ratio|.
void GetSamples(const SkPixmap& pixmap,
const SkIRect& src,
std::vector<SkColor>* sampled_pixels,
float* transparency_ratio,
float* background_ratio) const;
// Gets the |required_samples_count| for a specific |block| of the given
// pixmap, and returns |sampled_pixels| and |transparent_pixels_count|.
void GetBlockSamples(const SkPixmap& pixmap,
const SkIRect& block,
const int required_samples_count,
std::vector<SkColor>* sampled_pixels,
int* transparent_pixels_count) const;
// Given |sampled_pixels|, |transparency_ratio|, and |background_ratio| for an
// image, computes and returns the features required for classification.
Features ComputeFeatures(const std::vector<SkColor>& sampled_pixels,
const float transparency_ratio,
const float background_ratio) const;
// Receives sampled pixels and color mode, and returns the ratio of color
// buckets count to all possible color buckets. If image is in color, a color
// bucket is a 4 bit per channel representation of each RGB color, and if it
// is grayscale, each bucket is a 4 bit representation of luminance.
float ComputeColorBucketsRatio(const std::vector<SkColor>& sampled_pixels,
const ColorMode color_mode) const;
FRIEND_TEST_ALL_PREFIXES(DarkModeImageClassifierTest, BlockSamples);
FRIEND_TEST_ALL_PREFIXES(DarkModeImageClassifierTest,
FeaturesAndClassification);
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_DARK_MODE_IMAGE_CLASSIFIER_H_