| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ash/style/sparkle_colors.h" |
| |
| #include "ash/style/harmonized_colors.h" |
| #include "third_party/material_color_utilities/src/cpp/cam/hct.h" |
| #include "third_party/skia/include/core/SkColor.h" |
| #include "ui/chromeos/styles/cros_tokens_color_mappings.h" |
| #include "ui/color/color_id.h" |
| #include "ui/color/color_recipe.h" |
| |
| namespace ash { |
| |
| namespace { |
| |
| // Mappings of tones to ColorId as they comprise the tonal palette. |
| // https://m3.material.io/styles/color/the-color-system/key-colors-tones |
| constexpr std::array<std::pair<int, ui::ColorId>, 13> kAnalogIds{ |
| {{0, cros_tokens::kCrosRefSparkleAnalog0}, |
| {10, cros_tokens::kCrosRefSparkleAnalog10}, |
| {20, cros_tokens::kCrosRefSparkleAnalog20}, |
| {30, cros_tokens::kCrosRefSparkleAnalog30}, |
| {40, cros_tokens::kCrosRefSparkleAnalog40}, |
| {50, cros_tokens::kCrosRefSparkleAnalog50}, |
| {60, cros_tokens::kCrosRefSparkleAnalog60}, |
| {70, cros_tokens::kCrosRefSparkleAnalog70}, |
| {80, cros_tokens::kCrosRefSparkleAnalog80}, |
| {90, cros_tokens::kCrosRefSparkleAnalog90}, |
| {95, cros_tokens::kCrosRefSparkleAnalog95}, |
| {99, cros_tokens::kCrosRefSparkleAnalog99}, |
| {100, cros_tokens::kCrosRefSparkleAnalog100}}}; |
| |
| constexpr std::array<std::pair<int, ui::ColorId>, 13> kMutedIds{ |
| {{0, cros_tokens::kCrosRefSparkleMuted0}, |
| {10, cros_tokens::kCrosRefSparkleMuted10}, |
| {20, cros_tokens::kCrosRefSparkleMuted20}, |
| {30, cros_tokens::kCrosRefSparkleMuted30}, |
| {40, cros_tokens::kCrosRefSparkleMuted40}, |
| {50, cros_tokens::kCrosRefSparkleMuted50}, |
| {60, cros_tokens::kCrosRefSparkleMuted60}, |
| {70, cros_tokens::kCrosRefSparkleMuted70}, |
| {80, cros_tokens::kCrosRefSparkleMuted80}, |
| {90, cros_tokens::kCrosRefSparkleMuted90}, |
| {95, cros_tokens::kCrosRefSparkleMuted95}, |
| {99, cros_tokens::kCrosRefSparkleMuted99}, |
| {100, cros_tokens::kCrosRefSparkleMuted100}}}; |
| |
| constexpr std::array<std::pair<int, ui::ColorId>, 13> kComplementIds{ |
| {{0, cros_tokens::kCrosRefSparkleComplement0}, |
| {10, cros_tokens::kCrosRefSparkleComplement10}, |
| {20, cros_tokens::kCrosRefSparkleComplement20}, |
| {30, cros_tokens::kCrosRefSparkleComplement30}, |
| {40, cros_tokens::kCrosRefSparkleComplement40}, |
| {50, cros_tokens::kCrosRefSparkleComplement50}, |
| {60, cros_tokens::kCrosRefSparkleComplement60}, |
| {70, cros_tokens::kCrosRefSparkleComplement70}, |
| {80, cros_tokens::kCrosRefSparkleComplement80}, |
| {90, cros_tokens::kCrosRefSparkleComplement90}, |
| {95, cros_tokens::kCrosRefSparkleComplement95}, |
| {99, cros_tokens::kCrosRefSparkleComplement99}, |
| {100, cros_tokens::kCrosRefSparkleComplement100}}}; |
| |
| struct HueChroma { |
| int hue; |
| int chroma; |
| }; |
| |
| // For the ColorId in `data`, generate the appropriate tone values combined with |
| // hue and chroma from `hc` and add the mappings to `mixer`. |
| void InsertIntoMixer(ui::ColorMixer& mixer, |
| const HueChroma& hc, |
| const std::array<std::pair<int, ui::ColorId>, 13>& data) { |
| for (const auto& [tone, color_id] : data) { |
| material_color_utilities::Hct hct(hc.hue, hc.chroma, tone); |
| |
| // `Hct::ToInt()` is in Argb which matches the representation of SkColor |
| // (ARGB). |
| mixer[color_id] = {hct.ToInt()}; |
| } |
| } |
| |
| } // namespace |
| |
| void AddSparkleColors(ui::ColorMixer& mixer, const ui::ColorProviderKey& key) { |
| int angle = 217; // Default to blue |
| if (key.user_color) { |
| angle = HueAngle(*key.user_color); |
| } |
| |
| HueChroma analog; |
| HueChroma muted; |
| HueChroma complement; |
| if (angle > 49 && angle < 121) { |
| analog = {.hue = 283, .chroma = 60}; |
| muted = {.hue = 273, .chroma = 35}; |
| complement = {.hue = 170, .chroma = 30}; |
| } else { |
| analog = {.hue = 303, .chroma = 60}; |
| muted = {.hue = 293, .chroma = 35}; |
| complement = {.hue = 150, .chroma = 30}; |
| } |
| |
| InsertIntoMixer(mixer, analog, kAnalogIds); |
| InsertIntoMixer(mixer, muted, kMutedIds); |
| InsertIntoMixer(mixer, complement, kComplementIds); |
| } |
| |
| } // namespace ash |