File: sys_color_mixer.cc

package info (click to toggle)
chromium 138.0.7204.183-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,908 kB
  • sloc: cpp: 34,937,088; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (381 lines) | stat: -rw-r--r-- 20,787 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
// Copyright 2022 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/sys_color_mixer.h"

#include "third_party/skia/include/core/SkColor.h"
#include "ui/color/color_id.h"
#include "ui/color/color_mixer.h"
#include "ui/color/color_provider.h"
#include "ui/color/color_provider_key.h"
#include "ui/color/color_recipe.h"
#include "ui/color/color_transform.h"

namespace ui {

namespace {

// Sys token overrides for the non-baseline themed case.
void AddThemedSysColorOverrides(ColorMixer& mixer,
                                const ColorProviderKey& key) {
  const bool dark_mode = key.color_mode == ColorProviderKey::ColorMode::kDark;

  // Surfaces.
  mixer[kColorSysSurface] = {dark_mode ? kColorRefNeutral10
                                       : kColorRefNeutral99};
  mixer[kColorSysSurfaceNumberedForeground] = {kColorSysPrimary};

  // General.
  mixer[kColorSysOnSurfaceSecondary] = {dark_mode ? kColorRefSecondary80
                                                  : kColorRefSecondary30};
  mixer[kColorSysTonalContainer] = {dark_mode ? kColorRefPrimary30
                                              : kColorRefPrimary90};
  mixer[kColorSysBaseTonalContainer] = {dark_mode ? kColorRefPrimary10
                                                  : kColorRefPrimary90};
  mixer[kColorSysNeutralContainer] = {dark_mode ? kColorRefNeutralVariant15
                                                : kColorRefNeutral94};
  mixer[kColorSysDivider] = {dark_mode ? kColorRefSecondary35
                                       : kColorRefPrimary90};

  // Chrome surfaces.
  mixer[kColorSysBase] = {dark_mode ? kColorRefSecondary25
                                    : kColorRefNeutral98};
  mixer[kColorSysBaseContainer] = {dark_mode ? kColorRefSecondary15
                                             : kColorSysSurface4};
  mixer[kColorSysBaseContainerElevated] = {dark_mode ? kColorRefSecondary25
                                                     : kColorRefNeutral98};

  mixer[kColorSysHeader] = {dark_mode ? kColorRefSecondary12
                                      : kColorRefSecondary90};
  mixer[kColorSysHeaderContainer] = {dark_mode ? kColorRefSecondary25
                                               : kColorRefPrimary95};
  mixer[kColorSysHeaderContainerInactive] = {dark_mode ? kColorRefNeutral25
                                                       : kColorRefNeutral99};
  mixer[kColorSysOnHeaderDivider] = {dark_mode ? kColorRefSecondary25
                                               : kColorRefPrimary80};

  // States.
  mixer[kColorSysStateInactiveRing] = {
      dark_mode ? SetAlpha({kColorRefPrimary70}, 0x8C)
                : SetAlpha({kColorRefPrimary20}, 0x8C)};
  mixer[kColorSysStateOnHeaderHover] = {dark_mode ? kColorRefPrimary90
                                                  : kColorRefPrimary20};
  mixer[kColorSysStateHeaderHover] = {dark_mode ? kColorRefPrimary30
                                                : kColorRefPrimary80};

  // Experimentation.
  mixer[kColorSysOmniboxContainer] = {dark_mode ? kColorRefSecondary15
                                                : kColorSysSurface4};
}

// Overrides for the grayscale baseline case.
// TODO(tluk): This can probably be migrated to the kMonochrome SchemeVariant
// when available.
void AddGrayscaleSysColorOverrides(ColorMixer& mixer,
                                   const ColorProviderKey& key) {
  const bool dark_mode = key.color_mode == ColorProviderKey::ColorMode::kDark;

  // General
  mixer[kColorSysOnSurfacePrimary] = {dark_mode ? kColorRefNeutral90
                                                : kColorRefNeutral10};
  mixer[kColorSysDivider] = {dark_mode ? kColorRefNeutral40
                                       : kColorRefNeutral90};

  // Chrome surfaces.
  mixer[kColorSysHeader] = {dark_mode ? kColorRefNeutral12
                                      : kColorRefNeutral90};
  mixer[kColorSysHeaderInactive] = {
      dark_mode ? AlphaBlend({kColorSysHeader}, {kColorRefNeutral25}, 0x99)
                : AlphaBlend({kColorSysHeader}, {kColorRefNeutral98}, 0x48)};
  mixer[kColorSysHeaderContainer] = {dark_mode ? kColorRefNeutral25
                                               : kColorRefNeutral95};
  mixer[kColorSysOnHeaderDivider] = {dark_mode ? kColorRefNeutral25
                                               : kColorRefNeutral80};
  mixer[kColorSysOnHeaderPrimary] = {dark_mode ? kColorRefNeutral80
                                               : kColorRefNeutral40};

  // States.
  mixer[kColorSysStateInactiveRing] = {
      dark_mode ? SetAlpha({kColorRefNeutral70}, 0x8C)
                : SetAlpha({kColorRefNeutral20}, 0x8C)};
  mixer[kColorSysStateOnHeaderHover] = {dark_mode ? kColorRefNeutral90
                                                  : kColorRefNeutral20};
  mixer[kColorSysStateHeaderHover] = {dark_mode ? kColorRefNeutral30
                                                : kColorRefNeutral80};

  // Experimentation.
  mixer[kColorSysOmniboxContainer] = {dark_mode ? kColorRefNeutral15
                                                : kColorRefNeutral94};
}

}  // namespace

void AddSysColorMixer(ColorProvider* provider, const ColorProviderKey& key) {
  const bool dark_mode = key.color_mode == ColorProviderKey::ColorMode::kDark;
  ColorMixer& mixer = provider->AddMixer();

  // Primary.
  mixer[kColorSysPrimary] = {dark_mode ? kColorRefPrimary80
                                       : kColorRefPrimary40};
  mixer[kColorSysOnPrimary] = {dark_mode ? kColorRefPrimary20
                                         : kColorRefPrimary100};
  mixer[kColorSysPrimaryContainer] = {dark_mode ? kColorRefPrimary30
                                                : kColorRefPrimary90};
  mixer[kColorSysOnPrimaryContainer] = {dark_mode ? kColorRefPrimary90
                                                  : kColorRefPrimary10};

  // Secondary.
  mixer[kColorSysSecondary] = {dark_mode ? kColorRefSecondary80
                                         : kColorRefSecondary40};
  mixer[kColorSysOnSecondary] = {dark_mode ? kColorRefSecondary20
                                           : kColorRefSecondary100};
  mixer[kColorSysSecondaryContainer] = {dark_mode ? kColorRefSecondary30
                                                  : kColorRefSecondary90};
  mixer[kColorSysOnSecondaryContainer] = {dark_mode ? kColorRefSecondary90
                                                    : kColorRefSecondary10};
  // Tertiary.
  mixer[kColorSysTertiary] = {dark_mode ? kColorRefTertiary80
                                        : kColorRefTertiary40};
  mixer[kColorSysOnTertiary] = {dark_mode ? kColorRefTertiary20
                                          : kColorRefTertiary100};
  mixer[kColorSysTertiaryContainer] = {dark_mode ? kColorRefTertiary30
                                                 : kColorRefTertiary90};
  mixer[kColorSysOnTertiaryContainer] = {dark_mode ? kColorRefTertiary90
                                                   : kColorRefTertiary10};

  // Error.
  mixer[kColorSysError] = {dark_mode ? kColorRefError80 : kColorRefError40};
  mixer[kColorSysOnError] = {dark_mode ? kColorRefError20 : kColorRefError100};
  mixer[kColorSysErrorContainer] = {dark_mode ? kColorRefError30
                                              : kColorRefError90};
  mixer[kColorSysOnErrorContainer] = {dark_mode ? kColorRefError90
                                                : kColorRefError10};
  // Neutral.
  mixer[kColorSysOnSurface] = {dark_mode ? kColorRefNeutral90
                                         : kColorRefNeutral10};
  mixer[kColorSysOnSurfaceVariant] = {dark_mode ? kColorRefNeutralVariant80
                                                : kColorRefNeutralVariant30};
  mixer[kColorSysOutline] = {dark_mode ? kColorRefNeutralVariant60
                                       : kColorRefNeutralVariant50};
  mixer[kColorSysSurfaceVariant] = {dark_mode ? kColorRefNeutralVariant30
                                              : kColorRefNeutralVariant90};

  // Constant.
  mixer[kColorSysBlack] = {kColorRefNeutral0};
  mixer[kColorSysWhite] = {kColorRefNeutral100};

  // Inverse.
  mixer[kColorSysInversePrimary] = {dark_mode ? kColorRefPrimary40
                                              : kColorRefPrimary80};
  mixer[kColorSysInverseOnSurface] = {dark_mode ? kColorRefNeutral10
                                                : kColorRefNeutral95};
  mixer[kColorSysInverseSurface] = {dark_mode ? kColorRefNeutral90
                                              : kColorRefNeutral20};
  mixer[kColorSysInverseSurfacePrimary] = {dark_mode ? kColorRefPrimary95
                                                     : kColorRefPrimary20};

  // Surfaces.
  mixer[kColorSysSurface] = {dark_mode ? kColorRefNeutral10
                                       : kColorRefNeutral100};
  mixer[kColorSysSurfaceNumberedForeground] = {
      dark_mode ? SkColorSetRGB(0xD1, 0xE1, 0xFF)
                : SkColorSetRGB(0x69, 0x91, 0xD6)};
  mixer[kColorSysSurface1] = AlphaBlend({kColorSysSurfaceNumberedForeground},
                                        {kColorSysSurface}, 0x0C);
  mixer[kColorSysSurface2] = AlphaBlend({kColorSysSurfaceNumberedForeground},
                                        {kColorSysSurface}, 0x14);
  mixer[kColorSysSurface3] = AlphaBlend({kColorSysSurfaceNumberedForeground},
                                        {kColorSysSurface}, 0x1C);
  mixer[kColorSysSurface4] = AlphaBlend({kColorSysSurfaceNumberedForeground},
                                        {kColorSysSurface}, 0x1E);
  mixer[kColorSysSurface5] = AlphaBlend({kColorSysSurfaceNumberedForeground},
                                        {kColorSysSurface}, 0x23);

  // General.
  mixer[kColorSysOnSurfaceSecondary] = {dark_mode ? kColorRefNeutral80
                                                  : kColorRefNeutral30};
  mixer[kColorSysOnSurfaceSubtle] = {dark_mode ? kColorRefNeutral80
                                               : kColorRefNeutral30};
  mixer[kColorSysOnSurfacePrimary] = {dark_mode ? kColorRefPrimary90
                                                : kColorRefPrimary10};
  mixer[kColorSysOnSurfacePrimaryInactive] = {dark_mode ? kColorRefNeutral90
                                                        : kColorRefNeutral10};

  mixer[kColorSysTonalContainer] = {dark_mode ? kColorRefSecondary30
                                              : kColorRefPrimary90};
  mixer[kColorSysOnTonalContainer] = {dark_mode ? kColorRefSecondary90
                                                : kColorRefPrimary10};
  mixer[kColorSysBaseTonalContainer] = {dark_mode ? kColorRefSecondary10
                                                  : kColorRefPrimary90};
  mixer[kColorSysOnBaseTonalContainer] = {dark_mode ? kColorRefSecondary90
                                                    : kColorRefPrimary10};
  mixer[kColorSysTonalOutline] = {dark_mode ? kColorRefSecondary50
                                            : kColorRefPrimary80};
  mixer[kColorSysNeutralOutline] = {dark_mode ? kColorRefNeutral50
                                              : kColorRefNeutral80};
  mixer[kColorSysNeutralContainer] = {dark_mode ? kColorRefNeutral15
                                                : kColorRefNeutral95};
  mixer[kColorSysDivider] = {dark_mode ? kColorRefNeutral40
                                       : kColorRefPrimary90};

  // Chrome surfaces.
  mixer[kColorSysBase] = {dark_mode ? kColorRefNeutral25 : kColorRefNeutral100};
  mixer[kColorSysBaseContainer] = {dark_mode ? kColorRefNeutral15
                                             : kColorSysSurface4};
  mixer[kColorSysBaseContainerElevated] = {dark_mode ? kColorRefNeutral25
                                                     : kColorRefNeutral100};

  mixer[kColorSysHeader] = {dark_mode ? kColorRefNeutral12
                                      : kColorRefPrimary90};
  mixer[kColorSysHeaderInactive] = {
      dark_mode
          ? AlphaBlend({kColorSysHeader}, {kColorRefNeutral25}, 0x99)
          : AlphaBlend({kColorSysHeader}, {kColorSysSurfaceVariant}, 0x48)};
  mixer[kColorSysHeaderContainer] = {dark_mode ? kColorRefNeutral25
                                               : kColorRefPrimary95};
  mixer[kColorSysHeaderContainerInactive] = {dark_mode ? kColorRefNeutral25
                                                       : kColorRefNeutral100};
  mixer[kColorSysOnHeaderDivider] = {dark_mode ? kColorRefNeutral25
                                               : kColorRefPrimary80};
  mixer[kColorSysOnHeaderDividerInactive] = {dark_mode ? kColorRefNeutral25
                                                       : kColorRefNeutral80};
  mixer[kColorSysOnHeaderPrimary] = {dark_mode ? kColorRefPrimary80
                                               : kColorRefPrimary40};
  mixer[kColorSysOnHeaderPrimaryInactive] = {dark_mode ? kColorRefNeutral80
                                                       : kColorRefNeutral40};

  // States.
  mixer[kColorSysStateHoverOnProminent] = {
      dark_mode ? SetAlpha({kColorRefNeutral10}, 0x0F)
                : SetAlpha({kColorRefNeutral99}, 0x1A)};
  mixer[kColorSysStateHoverOnSubtle] = {
      dark_mode ? SetAlpha({kColorRefNeutral99}, 0x1A)
                : SetAlpha({kColorRefNeutral10}, 0x0F)};
  mixer[kColorSysStateRippleNeutralOnProminent] = {
      dark_mode ? SetAlpha({kColorRefNeutral10}, 0x1F)
                : SetAlpha({kColorRefNeutral99}, 0x29)};
  mixer[kColorSysStateRippleNeutralOnSubtle] = {
      dark_mode ? SetAlpha({kColorRefNeutral99}, 0x29)
                : SetAlpha({kColorRefNeutral10}, 0x14)};
  mixer[kColorSysStateRipplePrimary] = {
      dark_mode ? SetAlpha({kColorRefPrimary60}, 0x52)
                : SetAlpha({kColorRefPrimary70}, 0x52)};
  mixer[kColorSysStateFocusRing] = {dark_mode ? kColorRefPrimary80
                                              : kColorRefPrimary40};
  mixer[kColorSysStateTextHighlight] = {dark_mode ? kColorRefPrimary80
                                                  : kColorRefPrimary40};
  mixer[kColorSysStateOnTextHighlight] = {dark_mode ? kColorRefNeutral0
                                                    : kColorRefNeutral100};
  mixer[kColorSysStateFocusHighlight] = {
      dark_mode ? SetAlpha({kColorRefNeutral99}, 0x1A)
                : SetAlpha({kColorRefNeutral10}, 0x0F)};
  mixer[kColorSysStateDisabled] = dark_mode
                                      ? SetAlpha({kColorRefNeutral90}, 0x60)
                                      : SetAlpha({kColorRefNeutral10}, 0x60);
  mixer[kColorSysStateDisabledContainer] =
      dark_mode ? SetAlpha({kColorRefNeutral90}, 0x1E)
                : SetAlpha({kColorRefNeutral10}, 0x1E);
  mixer[kColorSysStateHoverDimBlendProtection] = {
      dark_mode ? SetAlpha({kColorRefNeutral99}, 0x1A)
                : SetAlpha({kColorRefPrimary20}, 0x2E)};
  mixer[kColorSysStateHoverBrightBlendProtection] = {
      dark_mode ? SetAlpha({kColorRefNeutral99}, 0x29)
                : SetAlpha({kColorRefNeutral10}, 0x0F)};
  mixer[kColorSysStateInactiveRing] = {
      dark_mode ? SetAlpha({kColorRefNeutral70}, 0x8C)
                : SetAlpha({kColorRefPrimary20}, 0x8C)};
  mixer[kColorSysStateScrim] = {SetAlpha({kColorRefNeutral0}, 0x99)};
  mixer[kColorSysStateOnHeaderHover] = {dark_mode ? kColorRefSecondary90
                                                  : kColorRefPrimary20};
  mixer[kColorSysStateHeaderHover] = {dark_mode ? kColorRefSecondary30
                                                : kColorRefPrimary80};
  mixer[kColorSysStateHeaderHoverInactive] = {kColorSysStateHoverOnSubtle};
  mixer[kColorSysStateHeaderSelect] = {SetAlpha({kColorSysBase}, 0x9A)};

  // Effects.
  mixer[kColorSysShadow] = {kColorRefNeutral0};
  mixer[kColorSysGradientPrimary] = {dark_mode ? kColorRefPrimary30
                                               : kColorRefPrimary90};
  mixer[kColorSysGradientTertiary] = {dark_mode ? kColorRefTertiary30
                                                : kColorRefTertiary95};

  // Illustration.
  mixer[kColorSysIlloPrimaryMin] = {dark_mode ? kColorRefPrimary30
                                              : kColorRefPrimary90};
  mixer[kColorSysIlloPrimaryLow] = {dark_mode ? kColorRefPrimary40
                                              : kColorRefPrimary80};
  mixer[kColorSysIlloPrimaryMid] = {dark_mode ? kColorRefPrimary50
                                              : kColorRefPrimary70};
  mixer[kColorSysIlloPrimaryHigh] = {dark_mode ? kColorRefPrimary70
                                               : kColorRefPrimary60};
  mixer[kColorSysIlloPrimaryMax] = {dark_mode ? kColorRefPrimary80
                                              : kColorRefPrimary40};
  mixer[kColorSysIlloSecondaryMin] = {dark_mode ? kColorRefSecondary30
                                                : kColorRefSecondary90};
  mixer[kColorSysIlloSecondaryLow] = {dark_mode ? kColorRefSecondary40
                                                : kColorRefSecondary80};
  mixer[kColorSysIlloSecondaryMid] = {dark_mode ? kColorRefSecondary50
                                                : kColorRefSecondary70};
  mixer[kColorSysIlloSecondaryHigh] = {dark_mode ? kColorRefSecondary70
                                                 : kColorRefSecondary60};
  mixer[kColorSysIlloSecondaryMax] = {dark_mode ? kColorRefSecondary80
                                                : kColorRefSecondary40};
  mixer[kColorSysIlloTertiaryMin] = {dark_mode ? kColorRefTertiary30
                                               : kColorRefTertiary90};
  mixer[kColorSysIlloTertiaryLow] = {dark_mode ? kColorRefTertiary40
                                               : kColorRefTertiary80};
  mixer[kColorSysIlloTertiaryMid] = {dark_mode ? kColorRefTertiary50
                                               : kColorRefTertiary70};
  mixer[kColorSysIlloTertiaryHigh] = {dark_mode ? kColorRefTertiary70
                                                : kColorRefTertiary60};
  mixer[kColorSysIlloTertiaryMax] = {dark_mode ? kColorRefTertiary80
                                               : kColorRefTertiary40};
  mixer[kColorSysIlloNeutralMin] = {dark_mode ? kColorRefNeutral0
                                              : kColorRefNeutral100};
  mixer[kColorSysIlloNeutralLow] = {dark_mode ? kColorRefNeutral25
                                              : kColorRefNeutral90};
  mixer[kColorSysIlloNeutralMid] = {dark_mode ? kColorRefNeutral40
                                              : kColorRefNeutral80};
  mixer[kColorSysIlloNeutralHigh] = {dark_mode ? kColorRefNeutral60
                                               : kColorRefNeutral50};
  mixer[kColorSysIlloNeutralMax] = {dark_mode ? kColorRefNeutral100
                                              : kColorRefNeutral0};

  // AI.
  mixer[kColorSysAiIllustrationShapeSurface1] = {
      dark_mode ? ui::kColorRefPrimary40 : ui::kColorRefPrimary70};
  mixer[kColorSysAiIllustrationShapeSurface2] = {
      dark_mode ? ui::kColorRefPrimary50 : ui::kColorRefPrimary95};
  mixer[kColorSysAiIllustrationShapeSurfaceGradientStart] = {
      dark_mode ? ui::kColorRefPrimary30 : ui::kColorRefSecondary90};
  mixer[kColorSysAiIllustrationShapeSurfaceGradientEnd] = {
      dark_mode ? ui::kColorRefPrimary40 : ui::kColorRefPrimary80};

  // Experimentation.
  mixer[kColorSysOmniboxContainer] = {dark_mode ? kColorRefNeutral15
                                                : kColorSysSurface4};

  // Deprecated.
  // TODO(crbug.com/350783235): Remove remaining uses of these deprecated sys
  // tokens.
  mixer[kColorSysStateHover] = dark_mode ? SetAlpha({kColorRefNeutral90}, 0x14)
                                         : SetAlpha({kColorRefNeutral10}, 0x14);
  mixer[kColorSysStateFocus] = dark_mode ? SetAlpha({kColorRefNeutral90}, 0x1E)
                                         : SetAlpha({kColorRefNeutral10}, 0x1E);
  mixer[kColorSysStatePressed] = dark_mode
                                     ? SetAlpha({kColorRefNeutral90}, 0x1E)
                                     : SetAlpha({kColorRefNeutral10}, 0x1E);

  // If grayscale is specified the design intention is to apply the grayscale
  // overrides over the baseline palette.
  if (key.user_color_source == ColorProviderKey::UserColorSource::kGrayscale) {
    AddGrayscaleSysColorOverrides(mixer, key);
  } else if (key.user_color_source ==
                 ColorProviderKey::UserColorSource::kAccent &&
             key.user_color.has_value()) {
    AddThemedSysColorOverrides(mixer, key);
  }
}

}  // namespace ui