Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(456)

Unified Diff: chrome/browser/themes/theme_service.cc

Issue 1785613004: Dynamically compute tab/frame separator color. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Exclude test on Mac Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/themes/theme_service.h ('k') | chrome/browser/themes/theme_service_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/themes/theme_service.cc
diff --git a/chrome/browser/themes/theme_service.cc b/chrome/browser/themes/theme_service.cc
index 208f11fd22b1aa85fe82b1913ddc74daca91a0a2..8ce03c189ad2afd728937327d47a269f88cf7db0 100644
--- a/chrome/browser/themes/theme_service.cc
+++ b/chrome/browser/themes/theme_service.cc
@@ -425,12 +425,28 @@ SkColor ThemeService::GetDefaultColor(int id, bool incognito) const {
return SkColorSetA(
GetColor(ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON, incognito),
0x33);
+ case ThemeProperties::COLOR_TOOLBAR_TOP_SEPARATOR: {
+ const SkColor tab_color =
+ GetColor(ThemeProperties::COLOR_TOOLBAR, incognito);
+ const SkColor frame_color =
+ GetColor(ThemeProperties::COLOR_FRAME, incognito);
+ const SeparatorColorKey key(tab_color, frame_color);
+ auto i = separator_color_cache_.find(key);
+ if (i != separator_color_cache_.end())
+ return i->second;
+ const SkColor separator_color = GetSeparatorColor(tab_color, frame_color);
+ separator_color_cache_[key] = separator_color;
+ return separator_color;
+ }
case ThemeProperties::COLOR_BACKGROUND_TAB: {
// The tints here serve a different purpose than TINT_BACKGROUND_TAB.
// That tint is used to create background tab images for custom themes by
// lightening the frame images. The tints here create solid colors for
- // background tabs by darkening the foreground tab (toolbar) color.
- const color_utils::HSL kTint = {-1, -1, 0.4296875};
+ // background tabs by darkening the foreground tab (toolbar) color. These
+ // values are chosen to turn the default normal and incognito MD frame
+ // colors (0xf2f2f2 and 0x505050) into 0xd0d0d0 and 0x373737,
+ // respectively.
+ const color_utils::HSL kTint = {-1, -1, 0.42975};
const color_utils::HSL kTintIncognito = {-1, -1, 0.34375};
return color_utils::HSLShift(
GetColor(ThemeProperties::COLOR_TOOLBAR, incognito),
@@ -591,6 +607,62 @@ bool ThemeService::HasCustomImage(int id) const {
theme_supplier_->HasCustomImage(id);
}
+// static
+SkColor ThemeService::GetSeparatorColor(SkColor tab_color,
+ SkColor frame_color) {
+ // We use this alpha value for the separator if possible.
+ const SkAlpha kAlpha = 0x40;
+
+ // In most cases, if the tab is lighter than the frame, we darken the
+ // frame; if the tab is darker than the frame, we lighten the frame.
+ // However, if the frame is already very dark or very light, respectively,
+ // this won't contrast sufficiently with the frame color, so we'll need to
+ // reverse when we're lightening and darkening.
+ const double tab_luminance = color_utils::GetRelativeLuminance(tab_color);
+ const double frame_luminance = color_utils::GetRelativeLuminance(frame_color);
+ const bool lighten = tab_luminance < frame_luminance;
+ SkColor separator_color = lighten ? SK_ColorWHITE : SK_ColorBLACK;
+ double separator_luminance = color_utils::GetRelativeLuminance(
+ color_utils::AlphaBlend(separator_color, frame_color, kAlpha));
+ // The minimum contrast ratio here is just under the ~1.1469 in the default MD
+ // incognito theme. We want the separator to still darken the frame in that
+ // theme, but that's about as low of contrast as we're willing to accept.
+ const double kMinContrastRatio = 1.1465;
+ if (color_utils::GetContrastRatio(separator_luminance, frame_luminance) >=
+ kMinContrastRatio)
+ return SkColorSetA(separator_color, kAlpha);
+
+ // We need to reverse whether we're darkening or lightening. We know the new
+ // separator color will contrast with the frame; check whether it also
+ // contrasts at least as well with the tab.
+ separator_color = color_utils::InvertColor(separator_color);
+ separator_luminance = color_utils::GetRelativeLuminance(
+ color_utils::AlphaBlend(separator_color, frame_color, kAlpha));
+ if (color_utils::GetContrastRatio(separator_luminance, tab_luminance) >=
+ color_utils::GetContrastRatio(separator_luminance, frame_luminance))
+ return SkColorSetA(separator_color, kAlpha);
+
+ // The reversed separator doesn't contrast enough with the tab. Compute the
+ // resulting luminance from adjusting the tab color, instead of the frame
+ // color, by the separator color.
+ const double target_luminance = color_utils::GetRelativeLuminance(
+ color_utils::AlphaBlend(separator_color, tab_color, kAlpha));
+
+ // Now try to compute an alpha for the separator such that, when blended with
+ // the frame, it results in the above luminance. Because the luminance
+ // computation is not easily invertible, we use a binary search over the
+ // possible range of alpha values.
+ SkAlpha alpha = 128;
+ for (int delta = lighten ? 64 : -64; delta != 0; delta /= 2) {
+ const double luminance = color_utils::GetRelativeLuminance(
+ color_utils::AlphaBlend(separator_color, frame_color, alpha));
+ if (luminance == target_luminance)
+ break;
+ alpha += (luminance < target_luminance) ? -delta : delta;
+ }
+ return SkColorSetA(separator_color, alpha);
+}
+
gfx::ImageSkia* ThemeService::GetImageSkiaNamed(int id, bool incognito) const {
gfx::Image image = GetImageNamed(id, incognito);
if (image.IsEmpty())
« no previous file with comments | « chrome/browser/themes/theme_service.h ('k') | chrome/browser/themes/theme_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698