color_provider_utils.cc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ui/color/color_provider_utils.h"
  5. #include "base/containers/contains.h"
  6. #include "base/containers/fixed_flat_map.h"
  7. #include "base/no_destructor.h"
  8. #include "base/strings/string_util.h"
  9. #include "base/strings/stringprintf.h"
  10. #include "third_party/skia/include/core/SkColor.h"
  11. #include "ui/color/color_provider.h"
  12. #include "ui/color/color_recipe.h"
  13. #include "ui/gfx/color_palette.h"
  14. #include "ui/gfx/color_utils.h"
  15. namespace ui {
  16. namespace {
  17. using RendererColorId = color::mojom::RendererColorId;
  18. // Below defines the mapping between RendererColorIds and ColorIds.
  19. struct RendererColorIdTable {
  20. RendererColorId renderer_color_id;
  21. ColorId color_id;
  22. };
  23. constexpr RendererColorIdTable kRendererColorIdMap[] = {
  24. {RendererColorId::kColorMenuBackground, kColorMenuBackground},
  25. {RendererColorId::kColorMenuItemBackgroundSelected,
  26. kColorMenuItemBackgroundSelected},
  27. {RendererColorId::kColorMenuSeparator, kColorMenuSeparator},
  28. {RendererColorId::kColorOverlayScrollbarFill, kColorOverlayScrollbarFill},
  29. {RendererColorId::kColorOverlayScrollbarFillDark,
  30. kColorOverlayScrollbarFillDark},
  31. {RendererColorId::kColorOverlayScrollbarFillLight,
  32. kColorOverlayScrollbarFillLight},
  33. {RendererColorId::kColorOverlayScrollbarFillHovered,
  34. kColorOverlayScrollbarFillHovered},
  35. {RendererColorId::kColorOverlayScrollbarFillHoveredDark,
  36. kColorOverlayScrollbarFillHoveredDark},
  37. {RendererColorId::kColorOverlayScrollbarFillHoveredLight,
  38. kColorOverlayScrollbarFillHoveredLight},
  39. {RendererColorId::kColorOverlayScrollbarStroke,
  40. kColorOverlayScrollbarStroke},
  41. {RendererColorId::kColorOverlayScrollbarStrokeDark,
  42. kColorOverlayScrollbarStrokeDark},
  43. {RendererColorId::kColorOverlayScrollbarStrokeLight,
  44. kColorOverlayScrollbarStrokeLight},
  45. {RendererColorId::kColorOverlayScrollbarStrokeHovered,
  46. kColorOverlayScrollbarStrokeHovered},
  47. {RendererColorId::kColorOverlayScrollbarStrokeHoveredDark,
  48. kColorOverlayScrollbarStrokeHoveredDark},
  49. {RendererColorId::kColorOverlayScrollbarStrokeHoveredLight,
  50. kColorOverlayScrollbarStrokeHoveredLight},
  51. };
  52. ColorProviderUtilsCallbacks* g_color_provider_utils_callbacks = nullptr;
  53. } // namespace
  54. ColorProviderUtilsCallbacks::~ColorProviderUtilsCallbacks() = default;
  55. base::StringPiece ColorModeName(ColorProviderManager::ColorMode color_mode) {
  56. switch (color_mode) {
  57. case ColorProviderManager::ColorMode::kLight:
  58. return "kLight";
  59. case ColorProviderManager::ColorMode::kDark:
  60. return "kDark";
  61. default:
  62. return "<invalid>";
  63. }
  64. }
  65. base::StringPiece ContrastModeName(
  66. ColorProviderManager::ContrastMode contrast_mode) {
  67. switch (contrast_mode) {
  68. case ColorProviderManager::ContrastMode::kNormal:
  69. return "kNormal";
  70. case ColorProviderManager::ContrastMode::kHigh:
  71. return "kHigh";
  72. default:
  73. return "<invalid>";
  74. }
  75. }
  76. base::StringPiece SystemThemeName(
  77. ColorProviderManager::SystemTheme system_theme) {
  78. switch (system_theme) {
  79. case ColorProviderManager::SystemTheme::kDefault:
  80. return "kDefault";
  81. case ColorProviderManager::SystemTheme::kCustom:
  82. return "kCustom";
  83. default:
  84. return "<invalid>";
  85. }
  86. }
  87. // Note that this second include is not redundant. The second inclusion of the
  88. // .inc file serves to undefine the macros the first inclusion defined.
  89. #include "ui/color/color_id_map_macros.inc"
  90. std::string ColorIdName(ColorId color_id) {
  91. static constexpr const auto color_id_map =
  92. base::MakeFixedFlatMap<ColorId, const char*>({COLOR_IDS});
  93. auto* i = color_id_map.find(color_id);
  94. if (i != color_id_map.cend())
  95. return {i->second};
  96. base::StringPiece color_name;
  97. if (g_color_provider_utils_callbacks &&
  98. g_color_provider_utils_callbacks->ColorIdName(color_id, &color_name))
  99. return std::string(color_name.data(), color_name.length());
  100. return base::StringPrintf("ColorId(%d)", color_id);
  101. }
  102. #include "ui/color/color_id_map_macros.inc"
  103. std::string SkColorName(SkColor color) {
  104. static const auto color_name_map =
  105. base::MakeFixedFlatMap<SkColor, const char*>({
  106. {gfx::kGoogleBlue050, "kGoogleBlue050"},
  107. {gfx::kGoogleBlue100, "kGoogleBlue100"},
  108. {gfx::kGoogleBlue200, "kGoogleBlue200"},
  109. {gfx::kGoogleBlue300, "kGoogleBlue300"},
  110. {gfx::kGoogleBlue400, "kGoogleBlue400"},
  111. {gfx::kGoogleBlue500, "kGoogleBlue500"},
  112. {gfx::kGoogleBlue600, "kGoogleBlue600"},
  113. {gfx::kGoogleBlue700, "kGoogleBlue700"},
  114. {gfx::kGoogleBlue800, "kGoogleBlue800"},
  115. {gfx::kGoogleBlue900, "kGoogleBlue900"},
  116. {gfx::kGoogleRed050, "kGoogleRed050"},
  117. {gfx::kGoogleRed100, "kGoogleRed100"},
  118. {gfx::kGoogleRed200, "kGoogleRed200"},
  119. {gfx::kGoogleRed300, "kGoogleRed300"},
  120. {gfx::kGoogleRed400, "kGoogleRed400"},
  121. {gfx::kGoogleRed500, "kGoogleRed500"},
  122. {gfx::kGoogleRed600, "kGoogleRed600"},
  123. {gfx::kGoogleRed700, "kGoogleRed700"},
  124. {gfx::kGoogleRed800, "kGoogleRed800"},
  125. {gfx::kGoogleRed900, "kGoogleRed900"},
  126. {gfx::kGoogleGreen050, "kGoogleGreen050"},
  127. {gfx::kGoogleGreen100, "kGoogleGreen100"},
  128. {gfx::kGoogleGreen200, "kGoogleGreen200"},
  129. {gfx::kGoogleGreen300, "kGoogleGreen300"},
  130. {gfx::kGoogleGreen400, "kGoogleGreen400"},
  131. {gfx::kGoogleGreen500, "kGoogleGreen500"},
  132. {gfx::kGoogleGreen600, "kGoogleGreen600"},
  133. {gfx::kGoogleGreen700, "kGoogleGreen700"},
  134. {gfx::kGoogleGreen800, "kGoogleGreen800"},
  135. {gfx::kGoogleGreen900, "kGoogleGreen900"},
  136. {gfx::kGoogleYellow050, "kGoogleYellow050"},
  137. {gfx::kGoogleYellow100, "kGoogleYellow100"},
  138. {gfx::kGoogleYellow200, "kGoogleYellow200"},
  139. {gfx::kGoogleYellow300, "kGoogleYellow300"},
  140. {gfx::kGoogleYellow400, "kGoogleYellow400"},
  141. {gfx::kGoogleYellow500, "kGoogleYellow500"},
  142. {gfx::kGoogleYellow600, "kGoogleYellow600"},
  143. {gfx::kGoogleYellow700, "kGoogleYellow700"},
  144. {gfx::kGoogleYellow800, "kGoogleYellow800"},
  145. {gfx::kGoogleYellow900, "kGoogleYellow900"},
  146. {gfx::kGoogleGrey050, "kGoogleGrey050"},
  147. {gfx::kGoogleGrey100, "kGoogleGrey100"},
  148. {gfx::kGoogleGrey200, "kGoogleGrey200"},
  149. {gfx::kGoogleGrey300, "kGoogleGrey300"},
  150. {gfx::kGoogleGrey400, "kGoogleGrey400"},
  151. {gfx::kGoogleGrey500, "kGoogleGrey500"},
  152. {gfx::kGoogleGrey600, "kGoogleGrey600"},
  153. {gfx::kGoogleGrey700, "kGoogleGrey700"},
  154. {gfx::kGoogleGrey800, "kGoogleGrey800"},
  155. {gfx::kGoogleGrey900, "kGoogleGrey900"},
  156. {gfx::kGoogleOrange050, "kGoogleOrange050"},
  157. {gfx::kGoogleOrange100, "kGoogleOrange100"},
  158. {gfx::kGoogleOrange200, "kGoogleOrange200"},
  159. {gfx::kGoogleOrange300, "kGoogleOrange300"},
  160. {gfx::kGoogleOrange400, "kGoogleOrange400"},
  161. {gfx::kGoogleOrange500, "kGoogleOrange500"},
  162. {gfx::kGoogleOrange600, "kGoogleOrange600"},
  163. {gfx::kGoogleOrange700, "kGoogleOrange700"},
  164. {gfx::kGoogleOrange800, "kGoogleOrange800"},
  165. {gfx::kGoogleOrange900, "kGoogleOrange900"},
  166. {gfx::kGooglePink050, "kGooglePink050"},
  167. {gfx::kGooglePink100, "kGooglePink100"},
  168. {gfx::kGooglePink200, "kGooglePink200"},
  169. {gfx::kGooglePink300, "kGooglePink300"},
  170. {gfx::kGooglePink400, "kGooglePink400"},
  171. {gfx::kGooglePink500, "kGooglePink500"},
  172. {gfx::kGooglePink600, "kGooglePink600"},
  173. {gfx::kGooglePink700, "kGooglePink700"},
  174. {gfx::kGooglePink800, "kGooglePink800"},
  175. {gfx::kGooglePink900, "kGooglePink900"},
  176. {gfx::kGooglePurple050, "kGooglePurple050"},
  177. {gfx::kGooglePurple100, "kGooglePurple100"},
  178. {gfx::kGooglePurple200, "kGooglePurple200"},
  179. {gfx::kGooglePurple300, "kGooglePurple300"},
  180. {gfx::kGooglePurple400, "kGooglePurple400"},
  181. {gfx::kGooglePurple500, "kGooglePurple500"},
  182. {gfx::kGooglePurple600, "kGooglePurple600"},
  183. {gfx::kGooglePurple700, "kGooglePurple700"},
  184. {gfx::kGooglePurple800, "kGooglePurple800"},
  185. {gfx::kGooglePurple900, "kGooglePurple900"},
  186. {gfx::kGoogleCyan050, "kGoogleCyan050"},
  187. {gfx::kGoogleCyan100, "kGoogleCyan100"},
  188. {gfx::kGoogleCyan200, "kGoogleCyan200"},
  189. {gfx::kGoogleCyan300, "kGoogleCyan300"},
  190. {gfx::kGoogleCyan400, "kGoogleCyan400"},
  191. {gfx::kGoogleCyan500, "kGoogleCyan500"},
  192. {gfx::kGoogleCyan600, "kGoogleCyan600"},
  193. {gfx::kGoogleCyan700, "kGoogleCyan700"},
  194. {gfx::kGoogleCyan800, "kGoogleCyan800"},
  195. {gfx::kGoogleCyan900, "kGoogleCyan900"},
  196. {SK_ColorTRANSPARENT, "SK_ColorTRANSPARENT"},
  197. {SK_ColorBLACK, "SK_ColorBLACK"},
  198. {SK_ColorDKGRAY, "SK_ColorDKGRAY"},
  199. {SK_ColorGRAY, "SK_ColorGRAY"},
  200. {SK_ColorLTGRAY, "SK_ColorLTGRAY"},
  201. {SK_ColorWHITE, "SK_ColorWHITE"},
  202. {SK_ColorRED, "kPlaceholderColor"},
  203. {SK_ColorGREEN, "SK_ColorGREEN"},
  204. {SK_ColorBLUE, "SK_ColorBLUE"},
  205. {SK_ColorYELLOW, "SK_ColorYELLOW"},
  206. {SK_ColorCYAN, "SK_ColorCYAN"},
  207. {SK_ColorMAGENTA, "SK_ColorMAGENTA"},
  208. });
  209. auto color_with_alpha = color;
  210. color = SkColorSetA(color, SK_AlphaOPAQUE);
  211. auto* i = color_name_map.find(color);
  212. if (i != color_name_map.cend()) {
  213. if (SkColorGetA(color_with_alpha) == SkColorGetA(color))
  214. return i->second;
  215. return base::StringPrintf("rgba(%s, %f)", i->second,
  216. 1.0 / SkColorGetA(color_with_alpha));
  217. }
  218. return color_utils::SkColorToRgbaString(color);
  219. }
  220. std::string ConvertColorProviderColorIdToCSSColorId(std::string color_id_name) {
  221. color_id_name.replace(color_id_name.begin(), color_id_name.begin() + 1, "-");
  222. std::string css_color_id_name;
  223. for (char i : color_id_name) {
  224. if (base::IsAsciiUpper(i))
  225. css_color_id_name += std::string("-");
  226. css_color_id_name += base::ToLowerASCII(i);
  227. }
  228. return css_color_id_name;
  229. }
  230. std::string ConvertSkColorToCSSColor(SkColor color) {
  231. return base::StringPrintf("#%.2x%.2x%.2x%.2x", SkColorGetR(color),
  232. SkColorGetG(color), SkColorGetB(color),
  233. SkColorGetA(color));
  234. }
  235. RendererColorMap CreateRendererColorMap(const ColorProvider& color_provider) {
  236. RendererColorMap map;
  237. for (const auto& table : kRendererColorIdMap) {
  238. map.emplace(table.renderer_color_id,
  239. color_provider.GetColor(table.color_id));
  240. }
  241. return map;
  242. }
  243. ColorProvider CreateColorProviderFromRendererColorMap(
  244. const RendererColorMap& renderer_color_map) {
  245. ColorProvider color_provider;
  246. ui::ColorMixer& mixer = color_provider.AddMixer();
  247. for (const auto& table : kRendererColorIdMap)
  248. mixer[table.color_id] = {renderer_color_map.at(table.renderer_color_id)};
  249. color_provider.GenerateColorMap();
  250. return color_provider;
  251. }
  252. bool IsRendererColorMappingEquivalent(
  253. const ColorProvider& color_provider,
  254. const RendererColorMap& renderer_color_map) {
  255. for (const auto& table : kRendererColorIdMap) {
  256. // The `renderer_color_map_` should map the full set of renderer color ids.
  257. DCHECK(base::Contains(renderer_color_map, table.renderer_color_id));
  258. if (color_provider.GetColor(table.color_id) !=
  259. renderer_color_map.at(table.renderer_color_id)) {
  260. return false;
  261. }
  262. }
  263. return true;
  264. }
  265. void SetColorProviderUtilsCallbacks(ColorProviderUtilsCallbacks* callbacks) {
  266. g_color_provider_utils_callbacks = callbacks;
  267. }
  268. } // namespace ui