Commit 60fe03f0 authored by Thomas Lukaszewicz's avatar Thomas Lukaszewicz Committed by Commit Bot

Added operators to color pipeline components.

Added operators and type conversions to ColorRecipe and
ColorTransform that allow for a cleaner and more intuitive
use of these classes.

Bug: 1887666
Change-Id: I2f0d3455da349c5c39025c6cdf5b1da9ed5e07c4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1912782
Commit-Queue: Thomas Lukaszewicz <tluk@chromium.org>
Reviewed-by: default avatarPeter Kasting <pkasting@chromium.org>
Cr-Commit-Position: refs/heads/master@{#715533}
parent 9348f36f
...@@ -18,45 +18,41 @@ void AddOmniboxColorMixer(ui::ColorProvider* provider, bool high_contrast) { ...@@ -18,45 +18,41 @@ void AddOmniboxColorMixer(ui::ColorProvider* provider, bool high_contrast) {
high_contrast ? 6.0f : color_utils::kMinimumReadableContrastRatio; high_contrast ? 6.0f : color_utils::kMinimumReadableContrastRatio;
// Omnibox background colors. // Omnibox background colors.
mixer[kColorOmniboxBackground].AddTransform(ui::GetResultingPaintColor( mixer[kColorOmniboxBackground] = ui::GetResultingPaintColor(
ui::FromTransformInput(), ui::FromInputColor(kColorToolbar))); ui::FromTransformInput(), ui::FromInputColor(kColorToolbar));
mixer[kColorOmniboxBackgroundHovered].AddTransform(ui::BlendTowardMaxContrast( mixer[kColorOmniboxBackgroundHovered] = ui::BlendTowardMaxContrast(
ui::FromResultColor(kColorOmniboxBackground), 0x0A)); ui::FromResultColor(kColorOmniboxBackground), 0x0A);
// Omnibox text colors. // Omnibox text colors.
mixer[kColorOmniboxText].AddTransform(ui::GetResultingPaintColor( mixer[kColorOmniboxText] = ui::GetResultingPaintColor(
ui::FromTransformInput(), ui::FromResultColor(kColorOmniboxBackground))); ui::FromTransformInput(), ui::FromResultColor(kColorOmniboxBackground));
{ {
auto& selected_text = mixer[kColorOmniboxResultsTextSelected].AddTransform( auto& selected_text = mixer[kColorOmniboxResultsTextSelected];
ui::FromResultColor(kColorOmniboxText)); selected_text = ui::FromResultColor(kColorOmniboxText);
if (high_contrast) if (high_contrast)
selected_text.AddTransform(ui::ContrastInvert(ui::FromTransformInput())); selected_text += ui::ContrastInvert(ui::FromTransformInput());
} }
mixer[kColorOmniboxSelectedKeyword].AddTransform( mixer[kColorOmniboxSelectedKeyword] = ui::SelectBasedOnDarkInput(
ui::SelectBasedOnDarkInput(ui::FromResultColor(kColorOmniboxBackground), ui::FromResultColor(kColorOmniboxBackground), gfx::kGoogleGrey100,
ui::FromColor(gfx::kGoogleGrey100), ui::FromResultColor(kColorOmniboxResultsUrl));
ui::FromResultColor(kColorOmniboxResultsUrl)));
// Bubble outline colors. // Bubble outline colors.
mixer[kColorOmniboxBubbleOutline].AddTransform(ui::SelectBasedOnDarkInput( mixer[kColorOmniboxBubbleOutline] = ui::SelectBasedOnDarkInput(
ui::FromResultColor(kColorOmniboxBackground), ui::FromResultColor(kColorOmniboxBackground), gfx::kGoogleGrey100,
ui::FromColor(gfx::kGoogleGrey100), SkColorSetA(gfx::kGoogleGrey900, 0x24));
ui::FromColor(SkColorSetA(gfx::kGoogleGrey900, 0x24)))); mixer[kColorOmniboxBubbleOutlineExperimentalKeywordMode] =
mixer[kColorOmniboxBubbleOutlineExperimentalKeywordMode].AddTransform( ui::FromResultColor(kColorOmniboxSelectedKeyword);
ui::FromResultColor(kColorOmniboxSelectedKeyword));
// Results background colors. // Results background colors.
mixer[kColorOmniboxResultsBackground].AddTransform( mixer[kColorOmniboxResultsBackground] =
ui::GetColorWithMaxContrast(ui::FromResultColor(kColorOmniboxText))); ui::GetColorWithMaxContrast(ui::FromResultColor(kColorOmniboxText));
mixer[kColorOmniboxResultsBackgroundHovered].AddTransform( mixer[kColorOmniboxResultsBackgroundHovered] = ui::BlendTowardMaxContrast(
ui::BlendTowardMaxContrast( ui::FromResultColor(kColorOmniboxResultsBackground),
ui::FromResultColor(kColorOmniboxResultsBackground), gfx::kGoogleGreyAlpha200);
gfx::kGoogleGreyAlpha200)); mixer[kColorOmniboxResultsBackgroundSelected] = ui::BlendTowardMaxContrast(
mixer[kColorOmniboxResultsBackgroundSelected].AddTransform( ui::GetColorWithMaxContrast(
ui::BlendTowardMaxContrast( ui::FromResultColor(kColorOmniboxResultsTextSelected)),
ui::GetColorWithMaxContrast( gfx::kGoogleGreyAlpha300);
ui::FromResultColor(kColorOmniboxResultsTextSelected)),
gfx::kGoogleGreyAlpha300));
// Results icon colors. // Results icon colors.
{ {
...@@ -66,11 +62,11 @@ void AddOmniboxColorMixer(ui::ColorProvider* provider, bool high_contrast) { ...@@ -66,11 +62,11 @@ void AddOmniboxColorMixer(ui::ColorProvider* provider, bool high_contrast) {
ui::DeriveDefaultIconColor(ui::FromResultColor(text_id)), ui::DeriveDefaultIconColor(ui::FromResultColor(text_id)),
ui::FromResultColor(background_id), base::nullopt, minimum_contrast); ui::FromResultColor(background_id), base::nullopt, minimum_contrast);
}; };
mixer[kColorOmniboxResultsIcon].AddTransform( mixer[kColorOmniboxResultsIcon] =
results_icon(kColorOmniboxText, kColorOmniboxResultsBackground)); results_icon(kColorOmniboxText, kColorOmniboxResultsBackground);
mixer[kColorOmniboxResultsIconSelected].AddTransform( mixer[kColorOmniboxResultsIconSelected] =
results_icon(kColorOmniboxResultsTextSelected, results_icon(kColorOmniboxResultsTextSelected,
kColorOmniboxResultsBackgroundSelected)); kColorOmniboxResultsBackgroundSelected);
} }
// Dimmed text colors. // Dimmed text colors.
...@@ -86,30 +82,28 @@ void AddOmniboxColorMixer(ui::ColorProvider* provider, bool high_contrast) { ...@@ -86,30 +82,28 @@ void AddOmniboxColorMixer(ui::ColorProvider* provider, bool high_contrast) {
base::nullopt, minimum_contrast), base::nullopt, minimum_contrast),
minimum_contrast); minimum_contrast);
}; };
mixer[kColorOmniboxResultsTextDimmed].AddTransform( mixer[kColorOmniboxResultsTextDimmed] = blend_with_clamped_contrast(
blend_with_clamped_contrast(kColorOmniboxText, kColorOmniboxText, kColorOmniboxResultsBackgroundHovered);
kColorOmniboxResultsBackgroundHovered)); mixer[kColorOmniboxResultsTextDimmedSelected] =
mixer[kColorOmniboxResultsTextDimmedSelected].AddTransform(
blend_with_clamped_contrast(kColorOmniboxResultsTextSelected, blend_with_clamped_contrast(kColorOmniboxResultsTextSelected,
kColorOmniboxResultsBackgroundSelected)); kColorOmniboxResultsBackgroundSelected);
mixer[kColorOmniboxTextDimmed].AddTransform(blend_with_clamped_contrast( mixer[kColorOmniboxTextDimmed] = blend_with_clamped_contrast(
kColorOmniboxText, kColorOmniboxBackgroundHovered)); kColorOmniboxText, kColorOmniboxBackgroundHovered);
} }
// Results URL colors. // Results URL colors.
{ {
const auto url_color = [minimum_contrast](ui::ColorId id) { const auto url_color = [minimum_contrast](ui::ColorId id) {
return ui::BlendForMinContrast( return ui::BlendForMinContrast(
ui::FromColor(gfx::kGoogleBlue500), ui::FromResultColor(id), gfx::kGoogleBlue500, ui::FromResultColor(id),
ui::SelectBasedOnDarkInput(ui::FromResultColor(id), ui::SelectBasedOnDarkInput(ui::FromResultColor(id),
ui::FromColor(gfx::kGoogleBlue050), gfx::kGoogleBlue050, gfx::kGoogleBlue900),
ui::FromColor(gfx::kGoogleBlue900)),
minimum_contrast); minimum_contrast);
}; };
mixer[kColorOmniboxResultsUrl].AddTransform( mixer[kColorOmniboxResultsUrl] =
url_color(kColorOmniboxResultsBackgroundHovered)); url_color(kColorOmniboxResultsBackgroundHovered);
mixer[kColorOmniboxResultsUrlSelected].AddTransform( mixer[kColorOmniboxResultsUrlSelected] =
url_color(kColorOmniboxResultsBackgroundSelected)); url_color(kColorOmniboxResultsBackgroundSelected);
} }
// Security chip colors. // Security chip colors.
...@@ -125,11 +119,11 @@ void AddOmniboxColorMixer(ui::ColorProvider* provider, bool high_contrast) { ...@@ -125,11 +119,11 @@ void AddOmniboxColorMixer(ui::ColorProvider* provider, bool high_contrast) {
ui::FromResultColor(kColorOmniboxBackgroundHovered), ui::FromResultColor(kColorOmniboxBackgroundHovered),
base::nullopt, minimum_contrast)); base::nullopt, minimum_contrast));
}; };
mixer[kColorOmniboxSecurityChipDangerous].AddTransform( mixer[kColorOmniboxSecurityChipDangerous] =
security_chip_color(ui::FromColor(gfx::kGoogleRed600))); security_chip_color(gfx::kGoogleRed600);
mixer[kColorOmniboxSecurityChipSecure].AddTransform(security_chip_color( mixer[kColorOmniboxSecurityChipSecure] = security_chip_color(
ui::DeriveDefaultIconColor(ui::FromResultColor(kColorOmniboxText)))); ui::DeriveDefaultIconColor(ui::FromResultColor(kColorOmniboxText)));
} }
mixer[kColorOmniboxSecurityChipDefault].AddTransform( mixer[kColorOmniboxSecurityChipDefault] =
ui::FromResultColor(kColorOmniboxSecurityChipSecure)); ui::FromResultColor(kColorOmniboxSecurityChipSecure);
} }
...@@ -30,7 +30,7 @@ TEST(ColorMixerTest, AddSet) { ...@@ -30,7 +30,7 @@ TEST(ColorMixerTest, AddSet) {
// Tests that the recipe returned by operator[] is respected by the mixer. // Tests that the recipe returned by operator[] is respected by the mixer.
TEST(ColorMixerTest, AccessOperator) { TEST(ColorMixerTest, AccessOperator) {
ColorMixer mixer; ColorMixer mixer;
mixer[kColorTest0].AddTransform(FromColor(SK_ColorGREEN)); mixer[kColorTest0] = ColorTransform(SK_ColorGREEN);
EXPECT_EQ(SK_ColorGREEN, mixer.GetResultColor(kColorTest0)); EXPECT_EQ(SK_ColorGREEN, mixer.GetResultColor(kColorTest0));
} }
...@@ -86,8 +86,7 @@ TEST(ColorMixerTest, GetInputColorPreviousMixer) { ...@@ -86,8 +86,7 @@ TEST(ColorMixerTest, GetInputColorPreviousMixer) {
TEST(ColorMixerTest, GetInputColorIgnoresRecipe) { TEST(ColorMixerTest, GetInputColorIgnoresRecipe) {
ColorMixer mixer; ColorMixer mixer;
mixer.AddSet({kColorSetTest0, {{kColorTest0, SK_ColorGREEN}}}); mixer.AddSet({kColorSetTest0, {{kColorTest0, SK_ColorGREEN}}});
mixer[kColorTest0].AddTransform( mixer[kColorTest0] = GetColorWithMaxContrast(FromTransformInput());
GetColorWithMaxContrast(FromTransformInput()));
EXPECT_EQ(SK_ColorGREEN, mixer.GetInputColor(kColorTest0)); EXPECT_EQ(SK_ColorGREEN, mixer.GetInputColor(kColorTest0));
} }
...@@ -97,8 +96,7 @@ TEST(ColorMixerTest, GetInputColorIgnoresRecipe) { ...@@ -97,8 +96,7 @@ TEST(ColorMixerTest, GetInputColorIgnoresRecipe) {
TEST(ColorMixerTest, GetInputColorRespectsRecipePreviousMixer) { TEST(ColorMixerTest, GetInputColorRespectsRecipePreviousMixer) {
ColorMixer mixer0; ColorMixer mixer0;
mixer0.AddSet({kColorSetTest0, {{kColorTest0, SK_ColorGREEN}}}); mixer0.AddSet({kColorSetTest0, {{kColorTest0, SK_ColorGREEN}}});
mixer0[kColorTest0].AddTransform( mixer0[kColorTest0] = GetColorWithMaxContrast(FromTransformInput());
GetColorWithMaxContrast(FromTransformInput()));
ColorMixer mixer1(&mixer0); ColorMixer mixer1(&mixer0);
mixer1.AddSet({kColorSetTest1, {{kColorTest1, SK_ColorRED}}}); mixer1.AddSet({kColorSetTest1, {{kColorTest1, SK_ColorRED}}});
EXPECT_EQ(color_utils::GetColorWithMaxContrast(SK_ColorGREEN), EXPECT_EQ(color_utils::GetColorWithMaxContrast(SK_ColorGREEN),
...@@ -169,8 +167,7 @@ TEST(ColorMixerTest, GetOriginalColorFromSetPreviousMixer) { ...@@ -169,8 +167,7 @@ TEST(ColorMixerTest, GetOriginalColorFromSetPreviousMixer) {
TEST(ColorMixerTest, GetOriginalColorFromSetIgnoresRecipe) { TEST(ColorMixerTest, GetOriginalColorFromSetIgnoresRecipe) {
ColorMixer mixer; ColorMixer mixer;
mixer.AddSet({kColorSetTest0, {{kColorTest0, SK_ColorGREEN}}}); mixer.AddSet({kColorSetTest0, {{kColorTest0, SK_ColorGREEN}}});
mixer[kColorTest0].AddTransform( mixer[kColorTest0] = GetColorWithMaxContrast(FromTransformInput());
GetColorWithMaxContrast(FromTransformInput()));
EXPECT_EQ(SK_ColorGREEN, EXPECT_EQ(SK_ColorGREEN,
mixer.GetOriginalColorFromSet(kColorTest0, kColorSetTest0)); mixer.GetOriginalColorFromSet(kColorTest0, kColorSetTest0));
} }
...@@ -181,8 +178,7 @@ TEST(ColorMixerTest, GetOriginalColorFromSetIgnoresRecipe) { ...@@ -181,8 +178,7 @@ TEST(ColorMixerTest, GetOriginalColorFromSetIgnoresRecipe) {
TEST(ColorMixerTest, GetOriginalColorFromSetIgnoresRecipePreviousMixer) { TEST(ColorMixerTest, GetOriginalColorFromSetIgnoresRecipePreviousMixer) {
ColorMixer mixer0; ColorMixer mixer0;
mixer0.AddSet({kColorSetTest0, {{kColorTest0, SK_ColorGREEN}}}); mixer0.AddSet({kColorSetTest0, {{kColorTest0, SK_ColorGREEN}}});
mixer0[kColorTest0].AddTransform( mixer0[kColorTest0] = GetColorWithMaxContrast(FromTransformInput());
GetColorWithMaxContrast(FromTransformInput()));
ColorMixer mixer1(&mixer0); ColorMixer mixer1(&mixer0);
mixer1.AddSet({kColorSetTest1, {{kColorTest1, SK_ColorRED}}}); mixer1.AddSet({kColorSetTest1, {{kColorTest1, SK_ColorRED}}});
EXPECT_EQ(SK_ColorGREEN, EXPECT_EQ(SK_ColorGREEN,
...@@ -207,9 +203,8 @@ TEST(ColorMixerTest, GetResultColorNoRecipe) { ...@@ -207,9 +203,8 @@ TEST(ColorMixerTest, GetResultColorNoRecipe) {
// initial value for its requested color. // initial value for its requested color.
TEST(ColorMixerTest, GetResultColorNoSet) { TEST(ColorMixerTest, GetResultColorNoSet) {
ColorMixer mixer; ColorMixer mixer;
mixer[kColorTest0].AddTransform(FromColor(SK_ColorGREEN)); mixer[kColorTest0] = ColorTransform(SK_ColorGREEN);
mixer[kColorTest1].AddTransform( mixer[kColorTest1] = GetColorWithMaxContrast(FromTransformInput());
GetColorWithMaxContrast(FromTransformInput()));
EXPECT_EQ(SK_ColorGREEN, mixer.GetResultColor(kColorTest0)); EXPECT_EQ(SK_ColorGREEN, mixer.GetResultColor(kColorTest0));
EXPECT_NE(gfx::kPlaceholderColor, mixer.GetResultColor(kColorTest1)); EXPECT_NE(gfx::kPlaceholderColor, mixer.GetResultColor(kColorTest1));
} }
...@@ -220,8 +215,8 @@ TEST(ColorMixerTest, GetResultColorIgnoresSet) { ...@@ -220,8 +215,8 @@ TEST(ColorMixerTest, GetResultColorIgnoresSet) {
ColorMixer mixer; ColorMixer mixer;
mixer.AddSet({kColorSetTest0, mixer.AddSet({kColorSetTest0,
{{kColorTest0, SK_ColorWHITE}, {kColorTest1, SK_ColorBLACK}}}); {{kColorTest0, SK_ColorWHITE}, {kColorTest1, SK_ColorBLACK}}});
mixer[kColorTest0].AddTransform(FromColor(SK_ColorGREEN)); mixer[kColorTest0] = ColorTransform(SK_ColorGREEN);
mixer[kColorTest1].AddTransform(FromColor(SK_ColorGREEN)); mixer[kColorTest1] = ColorTransform(SK_ColorGREEN);
EXPECT_EQ(SK_ColorGREEN, mixer.GetResultColor(kColorTest0)); EXPECT_EQ(SK_ColorGREEN, mixer.GetResultColor(kColorTest0));
EXPECT_EQ(SK_ColorGREEN, mixer.GetResultColor(kColorTest1)); EXPECT_EQ(SK_ColorGREEN, mixer.GetResultColor(kColorTest1));
} }
...@@ -231,12 +226,12 @@ TEST(ColorMixerTest, GetResultColorIgnoresSet) { ...@@ -231,12 +226,12 @@ TEST(ColorMixerTest, GetResultColorIgnoresSet) {
TEST(ColorMixerTest, GetResultColorChained) { TEST(ColorMixerTest, GetResultColorChained) {
ColorMixer mixer; ColorMixer mixer;
mixer.AddSet({kColorSetTest0, {{kColorTest1, SK_ColorWHITE}}}); mixer.AddSet({kColorSetTest0, {{kColorTest1, SK_ColorWHITE}}});
mixer[kColorTest0].AddTransform(FromColor(gfx::kGoogleBlue050)); mixer[kColorTest0] = ColorTransform(gfx::kGoogleBlue050);
mixer[kColorTest1].AddTransform(BlendTowardMaxContrast( mixer[kColorTest1] = BlendTowardMaxContrast(
GetColorWithMaxContrast(FromTransformInput()), 0x29)); GetColorWithMaxContrast(FromTransformInput()), 0x29);
mixer[kColorTest2].AddTransform(BlendForMinContrast( mixer[kColorTest2] =
FromColor(gfx::kGoogleBlue500), FromResultColor(kColorTest1), BlendForMinContrast(gfx::kGoogleBlue500, FromResultColor(kColorTest1),
FromResultColor(kColorTest0))); FromResultColor(kColorTest0));
EXPECT_EQ(SkColorSetRGB(0x89, 0xB3, 0xF8), mixer.GetResultColor(kColorTest2)); EXPECT_EQ(SkColorSetRGB(0x89, 0xB3, 0xF8), mixer.GetResultColor(kColorTest2));
} }
......
...@@ -12,14 +12,22 @@ namespace ui { ...@@ -12,14 +12,22 @@ namespace ui {
ColorRecipe::ColorRecipe() = default; ColorRecipe::ColorRecipe() = default;
ColorRecipe::ColorRecipe(const ColorTransform& transform) {
*this += transform;
}
ColorRecipe::ColorRecipe(const ColorRecipe&) = default;
ColorRecipe& ColorRecipe::operator=(const ColorRecipe&) = default;
ColorRecipe::ColorRecipe(ColorRecipe&&) noexcept = default; ColorRecipe::ColorRecipe(ColorRecipe&&) noexcept = default;
ColorRecipe& ColorRecipe::operator=(ColorRecipe&&) noexcept = default; ColorRecipe& ColorRecipe::operator=(ColorRecipe&&) noexcept = default;
ColorRecipe::~ColorRecipe() = default; ColorRecipe::~ColorRecipe() = default;
ColorRecipe& ColorRecipe::AddTransform(ColorTransform transform) { ColorRecipe& ColorRecipe::operator+=(const ColorTransform& transform) {
transforms_.push_back(std::move(transform)); transforms_.push_back(transform);
return *this; return *this;
} }
...@@ -30,4 +38,9 @@ SkColor ColorRecipe::GenerateResult(SkColor input, ...@@ -30,4 +38,9 @@ SkColor ColorRecipe::GenerateResult(SkColor input,
return input; return input;
} }
ColorRecipe operator+(ColorRecipe recipe, const ColorTransform& transform) {
recipe += transform;
return recipe;
}
} // namespace ui } // namespace ui
\ No newline at end of file
...@@ -22,15 +22,16 @@ class ColorMixer; ...@@ -22,15 +22,16 @@ class ColorMixer;
class COMPONENT_EXPORT(COLOR) ColorRecipe { class COMPONENT_EXPORT(COLOR) ColorRecipe {
public: public:
ColorRecipe(); ColorRecipe();
// ColorRecipe is movable since it holds the full list of transforms, which // This constructor acts as a shorthand initialization of a recipe with a
// might be expensive to copy. // transform which is by far the most common means of recipe initialization.
ColorRecipe(const ColorTransform& transform);
ColorRecipe(const ColorRecipe&);
ColorRecipe& operator=(const ColorRecipe&);
ColorRecipe(ColorRecipe&&) noexcept; ColorRecipe(ColorRecipe&&) noexcept;
ColorRecipe& operator=(ColorRecipe&&) noexcept; ColorRecipe& operator=(ColorRecipe&&) noexcept;
~ColorRecipe(); ~ColorRecipe();
// Adds a transform to the end of the current recipe. Returns a non-const ref ColorRecipe& operator+=(const ColorTransform& transform);
// to allow chaining calls.
ColorRecipe& AddTransform(ColorTransform transform);
// Generates the output color for |input| by applying all transforms. |mixer| // Generates the output color for |input| by applying all transforms. |mixer|
// is passed to each transform, since it might need to request other colors. // is passed to each transform, since it might need to request other colors.
...@@ -40,6 +41,9 @@ class COMPONENT_EXPORT(COLOR) ColorRecipe { ...@@ -40,6 +41,9 @@ class COMPONENT_EXPORT(COLOR) ColorRecipe {
std::list<ColorTransform> transforms_; std::list<ColorTransform> transforms_;
}; };
COMPONENT_EXPORT(COLOR)
ColorRecipe operator+(ColorRecipe recipe, const ColorTransform& transform);
} // namespace ui } // namespace ui
#endif // UI_COLOR_COLOR_RECIPE_H_ #endif // UI_COLOR_COLOR_RECIPE_H_
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "ui/color/color_mixer.h" #include "ui/color/color_mixer.h"
#include "ui/color/color_set.h" #include "ui/color/color_set.h"
#include "ui/color/color_test_ids.h" #include "ui/color/color_test_ids.h"
#include "ui/color/color_transform.h"
#include "ui/gfx/color_palette.h" #include "ui/gfx/color_palette.h"
namespace ui { namespace ui {
...@@ -28,8 +29,7 @@ TEST(ColorRecipeTest, EmptyRecipeIsPassthrough) { ...@@ -28,8 +29,7 @@ TEST(ColorRecipeTest, EmptyRecipeIsPassthrough) {
// Tests that a transform in a recipe has an effect. // Tests that a transform in a recipe has an effect.
TEST(ColorRecipeTest, OneTransform) { TEST(ColorRecipeTest, OneTransform) {
constexpr SkColor kOutput = SK_ColorGREEN; constexpr SkColor kOutput = SK_ColorGREEN;
ColorRecipe recipe; ColorRecipe recipe = ColorTransform(kOutput);
recipe.AddTransform(FromColor(kOutput));
const auto verify_transform = [&](SkColor input) { const auto verify_transform = [&](SkColor input) {
EXPECT_EQ(kOutput, recipe.GenerateResult(input, ColorMixer())); EXPECT_EQ(kOutput, recipe.GenerateResult(input, ColorMixer()));
}; };
...@@ -40,10 +40,9 @@ TEST(ColorRecipeTest, OneTransform) { ...@@ -40,10 +40,9 @@ TEST(ColorRecipeTest, OneTransform) {
// Tests that in a recipe with multiple transforms, each is applied. // Tests that in a recipe with multiple transforms, each is applied.
TEST(ColorRecipeTest, ChainedTransforms) { TEST(ColorRecipeTest, ChainedTransforms) {
ColorRecipe recipe; ColorRecipe recipe =
recipe.AddTransform(DeriveDefaultIconColor(FromTransformInput())) DeriveDefaultIconColor(FromTransformInput()) +
.AddTransform(BlendForMinContrast(FromTransformInput(), BlendForMinContrast(FromTransformInput(), FromInputColor(kColorTest0));
FromInputColor(kColorTest0)));
constexpr SkColor kBackground = SK_ColorWHITE; constexpr SkColor kBackground = SK_ColorWHITE;
ColorMixer mixer; ColorMixer mixer;
mixer.AddSet({kColorSetTest0, {{kColorTest0, kBackground}}}); mixer.AddSet({kColorSetTest0, {{kColorTest0, kBackground}}});
......
...@@ -9,6 +9,26 @@ ...@@ -9,6 +9,26 @@
namespace ui { namespace ui {
ColorTransform::ColorTransform(Callback callback)
: callback_(std::move(callback)) {}
ColorTransform::ColorTransform(SkColor color) {
const auto generator = [](SkColor color, SkColor input_color,
const ColorMixer& mixer) { return color; };
callback_ = base::Bind(generator, color);
}
ColorTransform::ColorTransform(const ColorTransform&) = default;
ColorTransform& ColorTransform::operator=(const ColorTransform&) = default;
ColorTransform::~ColorTransform() = default;
SkColor ColorTransform::Run(SkColor input_color,
const ColorMixer& mixer) const {
return callback_.Run(input_color, mixer);
}
ColorTransform AlphaBlend(ColorTransform foreground_transform, ColorTransform AlphaBlend(ColorTransform foreground_transform,
ColorTransform background_transform, ColorTransform background_transform,
SkAlpha alpha) { SkAlpha alpha) {
...@@ -95,12 +115,6 @@ ColorTransform DeriveDefaultIconColor(ColorTransform transform) { ...@@ -95,12 +115,6 @@ ColorTransform DeriveDefaultIconColor(ColorTransform transform) {
return base::Bind(generator, std::move(transform)); return base::Bind(generator, std::move(transform));
} }
ColorTransform FromColor(SkColor color) {
const auto generator = [](SkColor color, SkColor input_color,
const ColorMixer& mixer) { return color; };
return base::Bind(generator, color);
}
ColorTransform FromOriginalColorFromSet(ColorId id, ColorSetId set_id) { ColorTransform FromOriginalColorFromSet(ColorId id, ColorSetId set_id) {
DCHECK_COLOR_ID_VALID(id); DCHECK_COLOR_ID_VALID(id);
DCHECK_COLOR_SET_ID_VALID(set_id); DCHECK_COLOR_SET_ID_VALID(set_id);
......
...@@ -16,13 +16,29 @@ namespace ui { ...@@ -16,13 +16,29 @@ namespace ui {
class ColorMixer; class ColorMixer;
// ColorTransform is a function which transforms an |input| color, optionally // Callback is a function which transforms an |input| color, optionally using a
// using a |mixer| (to obtain other colors). ColorTransforms can be chained // |mixer| (to obtain other colors).
// together in ColorRecipes, where each will be applied to the preceding using Callback =
// transform's output.
using ColorTransform =
base::RepeatingCallback<SkColor(SkColor input, const ColorMixer& mixer)>; base::RepeatingCallback<SkColor(SkColor input, const ColorMixer& mixer)>;
// ColorTransform wraps Callback and can be chained together in ColorRecipes,
// where each will be applied to the preceding transform's output.
class COMPONENT_EXPORT(COLOR) ColorTransform {
public:
// Allows simple conversion from a Callback to a ColorTransform.
ColorTransform(Callback callback);
// Creates a transform that returns the supplied |color|.
ColorTransform(SkColor color);
ColorTransform(const ColorTransform&);
ColorTransform& operator=(const ColorTransform&);
~ColorTransform();
SkColor Run(SkColor input_color, const ColorMixer& mixer) const;
private:
Callback callback_;
};
// Functions to create common transforms: // Functions to create common transforms:
// A transform which blends the result of |foreground_transform| atop the result // A transform which blends the result of |foreground_transform| atop the result
...@@ -66,9 +82,6 @@ COMPONENT_EXPORT(COLOR) ColorTransform ContrastInvert(ColorTransform transform); ...@@ -66,9 +82,6 @@ COMPONENT_EXPORT(COLOR) ColorTransform ContrastInvert(ColorTransform transform);
COMPONENT_EXPORT(COLOR) COMPONENT_EXPORT(COLOR)
ColorTransform DeriveDefaultIconColor(ColorTransform transform); ColorTransform DeriveDefaultIconColor(ColorTransform transform);
// A transform which outputs |color|.
COMPONENT_EXPORT(COLOR) ColorTransform FromColor(SkColor color);
// A transform which returns the color |id| from set |set_id|. // A transform which returns the color |id| from set |set_id|.
COMPONENT_EXPORT(COLOR) COMPONENT_EXPORT(COLOR)
ColorTransform FromOriginalColorFromSet(ColorId id, ColorSetId set_id); ColorTransform FromOriginalColorFromSet(ColorId id, ColorSetId set_id);
......
...@@ -13,11 +13,22 @@ ...@@ -13,11 +13,22 @@
namespace ui { namespace ui {
namespace { namespace {
// Tests initialization with an SkColor value.
TEST(ColorRecipeTest, TestColorRecipeInitialization) {
const auto verify_initialization = [&](SkColor color) {
ColorTransform transform = color;
EXPECT_EQ(color, transform.Run(SK_ColorBLACK, ColorMixer()));
};
verify_initialization(SK_ColorBLUE);
verify_initialization(SK_ColorRED);
verify_initialization(SK_ColorGREEN);
}
// Tests that AlphaBlend() produces a transform that blends its inputs. // Tests that AlphaBlend() produces a transform that blends its inputs.
TEST(ColorTransformTest, AlphaBlend) { TEST(ColorTransformTest, AlphaBlend) {
const auto blend = [](SkAlpha alpha) { const auto blend = [](SkAlpha alpha) {
const ColorTransform transform = const ColorTransform transform =
AlphaBlend(FromColor(SK_ColorWHITE), FromColor(SK_ColorBLACK), alpha); AlphaBlend(SK_ColorWHITE, SK_ColorBLACK, alpha);
return transform.Run(gfx::kPlaceholderColor, ColorMixer()); return transform.Run(gfx::kPlaceholderColor, ColorMixer());
}; };
EXPECT_EQ(SK_ColorBLACK, blend(SK_AlphaTRANSPARENT)); EXPECT_EQ(SK_ColorBLACK, blend(SK_AlphaTRANSPARENT));
...@@ -131,11 +142,11 @@ TEST(ColorTransformTest, DeriveDefaultIconColor) { ...@@ -131,11 +142,11 @@ TEST(ColorTransformTest, DeriveDefaultIconColor) {
verify_derive(SK_ColorRED); verify_derive(SK_ColorRED);
} }
// Tests that FromColor() produces a transform that ignores the input color and // Tests that initializing a transform from a color produces a transform that
// always outputs a specified SkColor. // ignores the input color and always outputs a specified SkColor.
TEST(ColorTransformTest, FromColor) { TEST(ColorTransformTest, FromColor) {
constexpr SkColor kOutput = SK_ColorGREEN; constexpr SkColor kOutput = SK_ColorGREEN;
const ColorTransform transform = FromColor(kOutput); const ColorTransform transform = kOutput;
const auto verify_color = [&](SkColor input) { const auto verify_color = [&](SkColor input) {
EXPECT_EQ(kOutput, transform.Run(input, ColorMixer())); EXPECT_EQ(kOutput, transform.Run(input, ColorMixer()));
}; };
...@@ -185,7 +196,7 @@ TEST(ColorTransformTest, FromResultColor) { ...@@ -185,7 +196,7 @@ TEST(ColorTransformTest, FromResultColor) {
ColorMixer mixer; ColorMixer mixer;
mixer.AddSet({kColorSetTest0, mixer.AddSet({kColorSetTest0,
{{kColorTest0, SK_ColorGREEN}, {kColorTest1, kTest1Color}}}); {{kColorTest0, SK_ColorGREEN}, {kColorTest1, kTest1Color}}});
mixer[kColorTest0].AddTransform(FromInputColor(kColorTest1)); mixer[kColorTest0] = FromInputColor(kColorTest1);
const auto verify_color = [&](SkColor input) { const auto verify_color = [&](SkColor input) {
EXPECT_EQ(kTest1Color, transform.Run(input, mixer)); EXPECT_EQ(kTest1Color, transform.Run(input, mixer));
}; };
...@@ -238,8 +249,8 @@ TEST(ColorTransformTest, GetResultingPaintColor) { ...@@ -238,8 +249,8 @@ TEST(ColorTransformTest, GetResultingPaintColor) {
TEST(ColorTransformTest, SelectBasedOnDarkInput) { TEST(ColorTransformTest, SelectBasedOnDarkInput) {
constexpr SkColor kDarkOutput = SK_ColorGREEN; constexpr SkColor kDarkOutput = SK_ColorGREEN;
constexpr SkColor kLightOutput = SK_ColorRED; constexpr SkColor kLightOutput = SK_ColorRED;
const ColorTransform transform = SelectBasedOnDarkInput( const ColorTransform transform =
FromTransformInput(), FromColor(kDarkOutput), FromColor(kLightOutput)); SelectBasedOnDarkInput(FromTransformInput(), kDarkOutput, kLightOutput);
EXPECT_EQ(kDarkOutput, transform.Run(SK_ColorBLACK, ColorMixer())); EXPECT_EQ(kDarkOutput, transform.Run(SK_ColorBLACK, ColorMixer()));
EXPECT_EQ(kLightOutput, transform.Run(SK_ColorWHITE, ColorMixer())); EXPECT_EQ(kLightOutput, transform.Run(SK_ColorWHITE, ColorMixer()));
EXPECT_EQ(kDarkOutput, transform.Run(SK_ColorBLUE, ColorMixer())); EXPECT_EQ(kDarkOutput, transform.Run(SK_ColorBLUE, ColorMixer()));
......
...@@ -67,12 +67,12 @@ ColorMixer& AddMixerForLightMode(ColorProvider* provider) { ...@@ -67,12 +67,12 @@ ColorMixer& AddMixerForLightMode(ColorProvider* provider) {
void AddCoreDefaultColorMixers(ColorProvider* provider, bool dark_window) { void AddCoreDefaultColorMixers(ColorProvider* provider, bool dark_window) {
ColorMixer& mixer = dark_window ? AddMixerForDarkMode(provider) ColorMixer& mixer = dark_window ? AddMixerForDarkMode(provider)
: AddMixerForLightMode(provider); : AddMixerForLightMode(provider);
mixer[kColorSecondaryBackground].AddTransform(BlendForMinContrastWithSelf( mixer[kColorSecondaryBackground] = BlendForMinContrastWithSelf(
FromResultColor(kColorPrimaryBackground), 1.67f)); FromResultColor(kColorPrimaryBackground), 1.67f);
mixer[kColorSecondaryForeground].AddTransform( mixer[kColorSecondaryForeground] =
BlendForMinContrast(FromResultColor(kColorDisabledForeground), BlendForMinContrast(FromResultColor(kColorDisabledForeground),
FromResultColor(kColorPrimaryBackground), FromResultColor(kColorPrimaryBackground),
FromResultColor(kColorPrimaryForeground))); FromResultColor(kColorPrimaryForeground));
// TODO(pkasting): High contrast? // TODO(pkasting): High contrast?
} }
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment