blob: 13939c3793529077410099ff7c6e3a99543d5e27 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/vr/model/color_scheme.h"
#include "base/lazy_instance.h"
#include "base/logging.h"
#include "chrome/browser/vr/assets_loader.h"
#include "ui/gfx/color_palette.h"
namespace vr {
namespace {
SkColor BuildColor(uint32_t color, int percentage) {
DCHECK_GE(percentage, 0);
DCHECK_LE(percentage, 100);
return (static_cast<uint8_t>((2.55f * percentage + 0.5)) << 24) | color;
}
SkColor MakeColor(uint32_t color, int percentage) {
DCHECK(!(color & 0xFF000000));
return BuildColor(color, percentage);
}
SkColor MakeBlack(int percentage) {
return BuildColor(0, percentage);
}
SkColor MakeWhite(int percentage) {
return BuildColor(0xFFFFFF, percentage);
}
base::LazyInstance<ColorScheme>::Leaky g_normal_scheme =
LAZY_INSTANCE_INITIALIZER;
base::LazyInstance<ColorScheme>::Leaky g_fullscreen_scheme =
LAZY_INSTANCE_INITIALIZER;
base::LazyInstance<ColorScheme>::Leaky g_incognito_scheme =
LAZY_INSTANCE_INITIALIZER;
void InitializeColorSchemes() {
static bool initialized = false;
if (initialized)
return;
ColorScheme& normal_scheme = g_normal_scheme.Get();
normal_scheme.world_background = 0xFF999999;
normal_scheme.floor = 0xFF8C8C8C;
normal_scheme.ceiling = normal_scheme.floor;
normal_scheme.floor_grid = 0x26FFFFFF;
normal_scheme.web_vr_background = SK_ColorBLACK;
normal_scheme.disc_button_colors.foreground = 0x87000000;
normal_scheme.disc_button_colors.foreground_disabled = 0x33333333;
normal_scheme.disc_button_colors.background = 0xCCB3B3B3;
normal_scheme.disc_button_colors.background_hover = 0xCCE3E3E3;
normal_scheme.disc_button_colors.background_down = 0xCCF3F3F3;
normal_scheme.web_vr_floor_edge = SK_ColorBLACK;
normal_scheme.web_vr_floor_center = 0xD9212121;
normal_scheme.web_vr_floor_grid = 0xD9212121;
normal_scheme.loading_indicator_foreground = MakeColor(0x4285F4, 100);
normal_scheme.loading_indicator_background = MakeColor(0xD1E1FC, 100);
normal_scheme.exit_warning_foreground = SK_ColorWHITE;
normal_scheme.exit_warning_background = 0xCC1A1A1A;
normal_scheme.web_vr_transient_toast_foreground = 0xFFF3F3F3;
normal_scheme.web_vr_transient_toast_background = SK_ColorBLACK;
normal_scheme.toast_foreground = 0xCCFFFFFF;
normal_scheme.toast_background = 0xCC2F2F2F;
normal_scheme.modal_prompt_icon_foreground = 0xFF4285F4;
normal_scheme.modal_prompt_background = 0xFFF5F5F5;
normal_scheme.modal_prompt_foreground = 0xFF333333;
normal_scheme.modal_prompt_secondary_button_colors.foreground = 0xFF4285F4;
normal_scheme.modal_prompt_secondary_button_colors.foreground_disabled =
normal_scheme.disc_button_colors.foreground_disabled;
normal_scheme.modal_prompt_secondary_button_colors.background =
normal_scheme.modal_prompt_background;
normal_scheme.modal_prompt_secondary_button_colors.background_hover =
0x19999999;
normal_scheme.modal_prompt_secondary_button_colors.background_down =
0x33999999;
normal_scheme.modal_prompt_primary_button_colors.foreground =
normal_scheme.modal_prompt_background;
normal_scheme.modal_prompt_secondary_button_colors.foreground_disabled =
normal_scheme.disc_button_colors.foreground_disabled;
normal_scheme.modal_prompt_primary_button_colors.background = 0xFF4285F4;
normal_scheme.modal_prompt_primary_button_colors.background_hover =
0xFF3E7DE6;
normal_scheme.modal_prompt_primary_button_colors.background_down = 0xFF3E7DE6;
normal_scheme.prompt_foreground = 0xCC000000;
normal_scheme.prompt_primary_button_colors.foreground = 0xA6000000;
normal_scheme.prompt_primary_button_colors.foreground_disabled = 0xA6000000;
normal_scheme.prompt_primary_button_colors.background = 0xBFFFFFFF;
normal_scheme.prompt_primary_button_colors.background_hover = 0xFFFFFFFF;
normal_scheme.prompt_primary_button_colors.background_down = 0xE6FFFFFF;
normal_scheme.prompt_secondary_button_colors.foreground = 0xA6000000;
normal_scheme.prompt_secondary_button_colors.foreground_disabled = 0xA6000000;
normal_scheme.prompt_secondary_button_colors.background = 0x66FFFFFF;
normal_scheme.prompt_secondary_button_colors.background_hover = 0xFFFFFFFF;
normal_scheme.prompt_secondary_button_colors.background_down = 0xE6FFFFFF;
normal_scheme.url_bar_background = 0xCCB3B3B3;
normal_scheme.url_bar_separator = MakeBlack(12);
normal_scheme.url_bar_text = MakeBlack(65);
normal_scheme.url_bar_hint_text = MakeBlack(50);
normal_scheme.url_bar_dangerous_icon = gfx::kGoogleRed700;
normal_scheme.url_bar_button.background = SK_ColorTRANSPARENT;
normal_scheme.url_bar_button.background_hover = MakeBlack(8);
normal_scheme.url_bar_button.background_down = MakeBlack(8);
normal_scheme.url_bar_button.foreground = MakeBlack(65);
normal_scheme.url_bar_button.foreground_disabled = MakeBlack(24);
normal_scheme.url_text_emphasized = MakeBlack(80);
normal_scheme.url_text_deemphasized = MakeBlack(30);
normal_scheme.omnibox_background = 0xFFEEEEEE;
normal_scheme.omnibox_text_selection.cursor = 0xFF5595FE; // TODO
normal_scheme.omnibox_text_selection.background = 0xFFC6DAFC; // TODO
normal_scheme.omnibox_text_selection.foreground = normal_scheme.url_bar_text;
normal_scheme.hyperlink = MakeColor(0x4285F4, 100);
normal_scheme.tab_item_background = normal_scheme.omnibox_background;
normal_scheme.tab_item_text = normal_scheme.url_bar_text;
normal_scheme.tab_mode_button_selected = normal_scheme.disc_button_colors;
normal_scheme.tab_mode_button_selected.foreground = MakeWhite(100);
normal_scheme.tab_mode_button_selected.background = MakeColor(0x4286F4, 100);
normal_scheme.tab_mode_button_selected.background_hover =
MakeColor(0x4B89ED, 100);
normal_scheme.tab_mode_button_selected.background_down =
MakeColor(0x5F7DAD, 100);
normal_scheme.dimmer_inner = 0xCC0D0D0D;
normal_scheme.dimmer_outer = 0xE6000000;
normal_scheme.splash_screen_background = SK_ColorBLACK;
normal_scheme.splash_screen_text_color = 0xA6FFFFFF;
normal_scheme.web_vr_timeout_spinner = 0xFFF3F3F3;
normal_scheme.web_vr_timeout_message_background = 0xFF444444;
normal_scheme.web_vr_timeout_message_foreground =
normal_scheme.web_vr_timeout_spinner;
normal_scheme.speech_recognition_circle_background = 0xFF4285F4;
normal_scheme.snackbar_foreground = 0xFFEEEEEE;
normal_scheme.snackbar_background = 0xDD212121;
normal_scheme.snackbar_button_colors.background =
normal_scheme.snackbar_background;
normal_scheme.snackbar_button_colors.foreground = 0xFFFFD500;
normal_scheme.snackbar_button_colors.background_hover = 0xDD2D2D2D;
normal_scheme.snackbar_button_colors.background_down = 0xDD2D2D2D;
normal_scheme.controller_label_callout = SK_ColorWHITE;
normal_scheme.controller_button = 0xFFEFEFEF;
normal_scheme.controller_button_down = 0xFF2979FF;
normal_scheme.reposition_label = SK_ColorWHITE;
normal_scheme.reposition_label_background = 0xAA333333;
normal_scheme.normal_factor = 1.0f;
normal_scheme.incognito_factor = 0.0f;
normal_scheme.fullscreen_factor = 0.0f;
normal_scheme.content_reposition_frame = 0x66FFFFFF;
normal_scheme.cursor_background_center = 0x66000000;
normal_scheme.cursor_background_edge = SK_ColorTRANSPARENT;
normal_scheme.cursor_foreground = SK_ColorWHITE;
normal_scheme.webvr_permission_background = 0xD9212121;
normal_scheme.webvr_permission_foreground = SK_ColorWHITE;
normal_scheme.indicator.background = 0x73212121;
normal_scheme.indicator.background_hover = 0xDE212121;
normal_scheme.indicator.background_down = 0xDE212121;
normal_scheme.indicator.foreground = SK_ColorWHITE;
normal_scheme.indicator.foreground_disabled = SK_ColorWHITE;
g_fullscreen_scheme.Get() = normal_scheme;
ColorScheme& fullscreen_scheme = g_fullscreen_scheme.Get();
fullscreen_scheme.world_background = 0xFF000714;
fullscreen_scheme.floor = 0xFF070F1C;
fullscreen_scheme.ceiling = 0xFF04080F;
fullscreen_scheme.floor_grid = 0x40A3E0FF;
fullscreen_scheme.disc_button_colors.foreground = 0x80FFFFFF;
fullscreen_scheme.disc_button_colors.foreground_disabled = 0x80FFFFFF;
fullscreen_scheme.disc_button_colors.background = 0xCC2B3E48;
fullscreen_scheme.disc_button_colors.background_hover = 0xCC536B77;
fullscreen_scheme.disc_button_colors.background_down = 0xCC96AFBB;
fullscreen_scheme.normal_factor = 0.0f;
fullscreen_scheme.incognito_factor = 0.0f;
fullscreen_scheme.fullscreen_factor = 1.0f;
g_incognito_scheme.Get() = normal_scheme;
ColorScheme& incognito_scheme = g_incognito_scheme.Get();
incognito_scheme.world_background = 0xFF2E2E2E;
incognito_scheme.floor = 0xFF282828;
incognito_scheme.ceiling = 0xFF2F2F2F;
incognito_scheme.floor_grid = 0xCC595959;
incognito_scheme.disc_button_colors.foreground = 0x80FFFFFF;
incognito_scheme.disc_button_colors.foreground_disabled = 0x33E6E6E6;
incognito_scheme.disc_button_colors.background = 0xCC2B3E48;
incognito_scheme.disc_button_colors.background_hover = 0xCC505050;
incognito_scheme.disc_button_colors.background_down = 0xCC888888;
incognito_scheme.prompt_foreground = 0xCCFFFFFF;
incognito_scheme.prompt_primary_button_colors.foreground = 0xD9000000;
incognito_scheme.prompt_primary_button_colors.foreground_disabled =
0xD9000000;
incognito_scheme.prompt_primary_button_colors.background = 0xD9FFFFFF;
incognito_scheme.prompt_primary_button_colors.background_hover = 0xFF8C8C8C;
incognito_scheme.prompt_primary_button_colors.background_down = 0xE6FFFFFF;
incognito_scheme.prompt_secondary_button_colors.foreground = 0xD9000000;
incognito_scheme.prompt_secondary_button_colors.foreground_disabled =
0xD9000000;
incognito_scheme.prompt_secondary_button_colors.background = 0x80FFFFFF;
incognito_scheme.prompt_secondary_button_colors.background_hover = 0xFF8C8C8C;
incognito_scheme.prompt_secondary_button_colors.background_down = 0xE6FFFFFF;
incognito_scheme.url_bar_background = 0xFF454545;
incognito_scheme.url_bar_separator = MakeWhite(12);
incognito_scheme.url_bar_text = MakeWhite(65);
incognito_scheme.url_bar_hint_text = MakeWhite(50);
incognito_scheme.url_bar_dangerous_icon = SK_ColorWHITE;
incognito_scheme.url_bar_button.background_hover = MakeWhite(8);
incognito_scheme.url_bar_button.background_down = MakeWhite(8);
incognito_scheme.url_bar_button.foreground = MakeWhite(65);
incognito_scheme.url_bar_button.foreground_disabled = MakeWhite(24);
incognito_scheme.url_text_emphasized = MakeWhite(80);
incognito_scheme.url_text_deemphasized = MakeWhite(30);
incognito_scheme.omnibox_background = incognito_scheme.url_bar_background;
incognito_scheme.omnibox_text_selection.foreground =
incognito_scheme.url_bar_text;
incognito_scheme.omnibox_text_selection.background = MakeWhite(8);
incognito_scheme.tab_item_background = incognito_scheme.omnibox_background;
incognito_scheme.tab_item_text = incognito_scheme.url_bar_text;
incognito_scheme.normal_factor = 0.0f;
incognito_scheme.incognito_factor = 1.0f;
incognito_scheme.fullscreen_factor = 0.0f;
initialized = true;
}
static constexpr size_t kButtonColorsSize = 20;
} // namespace
ColorScheme::ColorScheme() = default;
ColorScheme::ColorScheme(const ColorScheme& other) {
*this = other;
}
static_assert(kButtonColorsSize == sizeof(ButtonColors),
"If the new colors are added to ButtonColors, we must explicitly "
"bump this size and update operator== below");
bool ButtonColors::operator==(const ButtonColors& other) const {
return background == other.background &&
background_hover == other.background_hover &&
background_down == other.background_down &&
foreground == other.foreground &&
foreground_disabled == other.foreground_disabled;
}
bool ButtonColors::operator!=(const ButtonColors& other) const {
return !(*this == other);
}
SkColor ButtonColors::GetBackgroundColor(bool hovered, bool pressed) const {
if (pressed)
return background_down;
if (hovered)
return background_hover;
return background;
}
SkColor ButtonColors::GetForegroundColor(bool disabled) const {
return disabled ? foreground_disabled : foreground;
}
bool TextSelectionColors::operator==(const TextSelectionColors& other) const {
return cursor == other.cursor && background == other.background &&
foreground == other.foreground;
}
bool TextSelectionColors::operator!=(const TextSelectionColors& other) const {
return !(*this == other);
}
const ColorScheme& ColorScheme::GetColorScheme(ColorScheme::Mode mode) {
InitializeColorSchemes();
if (mode == kModeIncognito)
return g_incognito_scheme.Get();
if (mode == kModeFullscreen)
return g_fullscreen_scheme.Get();
return g_normal_scheme.Get();
}
void ColorScheme::UpdateForComponent(const base::Version& component_version) {
if (component_version >= AssetsLoader::MinVersionWithGradients()) {
ColorScheme& normal_scheme = g_normal_scheme.Get();
normal_scheme.disc_button_colors.foreground = 0xA6000000;
normal_scheme.disc_button_colors.foreground_disabled = 0x33000000;
normal_scheme.disc_button_colors.background = 0xFFEEEEEE;
normal_scheme.disc_button_colors.background_hover = SK_ColorWHITE;
normal_scheme.modal_prompt_secondary_button_colors.foreground_disabled =
normal_scheme.disc_button_colors.foreground_disabled;
normal_scheme.modal_prompt_secondary_button_colors.background =
normal_scheme.modal_prompt_background;
normal_scheme.url_bar_background = MakeColor(0xEEEEEE, 87);
normal_scheme.omnibox_background = MakeColor(0xEEEEEE, 100);
normal_scheme.tab_item_background = normal_scheme.omnibox_background;
ColorScheme& incognito_scheme = g_incognito_scheme.Get();
incognito_scheme.disc_button_colors.background = MakeColor(0x263238, 100);
incognito_scheme.disc_button_colors.background_hover = 0xCC404A50;
incognito_scheme.disc_button_colors.background_down = 0xCC212B31;
incognito_scheme.url_bar_background = MakeColor(0x263238, 87);
incognito_scheme.omnibox_background = MakeColor(0x263238, 100);
incognito_scheme.tab_item_background = incognito_scheme.omnibox_background;
}
}
} // namespace vr