blob: d0ee807ef543fe7a8fac913942a99dbc4cf4328e [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/color/color_mixer.h"
#include <utility>
#include "base/logging.h"
#include "base/ranges/algorithm.h"
#include "ui/color/color_provider_utils.h"
#include "ui/color/color_recipe.h"
#include "ui/gfx/color_palette.h"
namespace ui {
ColorMixer::ColorMixer(MixerGetter previous_mixer_getter,
MixerGetter input_mixer_getter)
: previous_mixer_getter_(previous_mixer_getter),
input_mixer_getter_(std::move(input_mixer_getter)) {}
ColorMixer::ColorMixer(ColorMixer&&) noexcept = default;
ColorMixer& ColorMixer::operator=(ColorMixer&&) noexcept = default;
ColorMixer::~ColorMixer() = default;
ColorRecipe& ColorMixer::operator[](ColorId id) {
return recipes_[id];
}
SkColor ColorMixer::GetInputColor(ColorId id) const {
const ColorMixer* previous_mixer =
previous_mixer_getter_ ? previous_mixer_getter_.Run() : nullptr;
// Don't log transitions to previous mixers unless the logging level is a
// little higher.
DVLOG_IF(3, previous_mixer)
<< "GetInputColor: ColorId " << ColorIdName(id) << " not found. "
<< "Checking previous mixer.";
// If there's no previous mixer, always log color id misses.
DVLOG_IF(2, !previous_mixer)
<< "GetInputColor: ColorId " << ColorIdName(id) << " not found. "
<< "Returning gfx::kPlaceholderColor.";
return previous_mixer ? previous_mixer->GetResultColor(id)
: gfx::kPlaceholderColor;
}
SkColor ColorMixer::GetResultColor(ColorId id) const {
const SkColor color = GetInputColor(id);
const auto i = recipes_.find(id);
const ColorMixer* const mixer =
input_mixer_getter_ ? input_mixer_getter_.Run() : nullptr;
return (i == recipes_.end())
? color
: i->second.GenerateResult(color, *(mixer ? mixer : this));
}
std::set<ColorId> ColorMixer::GetDefinedColorIds() const {
std::set<ColorId> color_ids;
base::ranges::transform(recipes_, std::inserter(color_ids, color_ids.end()),
&std::pair<const ColorId, ColorRecipe>::first);
return color_ids;
}
} // namespace ui