blob: 145495134a52dcb02631896ed6739cad8799ba88 [file] [log] [blame]
// 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/temp_palette.h"
#include <algorithm>
namespace ui {
namespace {
constexpr SkColor kPurple = 0xffca35c6U;
constexpr SkColor kTeal = 0xff3cc3b8U;
ToneMap PurpleTones() {
ToneMap tones;
tones.seed = kPurple; // purple
tones.primary[Luma::k100] = 0xffffffffU;
tones.primary[Luma::k99] = 0xfffffbffU;
tones.primary[Luma::k95] = 0xffffebf7U;
tones.primary[Luma::k90] = 0xffffd7f5U;
tones.primary[Luma::k80] = 0xffffabf3U;
tones.primary[Luma::k70] = 0xffff76f5U;
tones.primary[Luma::k60] = 0xffe651e0U;
tones.primary[Luma::k50] = 0xffc732c3U;
tones.primary[Luma::k40] = 0xffa901a8U;
tones.primary[Luma::k30] = 0xff810080U;
tones.primary[Luma::k20] = 0xff5b005bU;
tones.primary[Luma::k10] = 0xff380038U;
tones.primary[Luma::k0] = 0xff000000U;
tones.secondary[Luma::k100] = 0xffffffffU;
tones.secondary[Luma::k99] = 0xfffffbffU;
tones.secondary[Luma::k95] = 0xffffebf7U;
tones.secondary[Luma::k90] = 0xfff7daefU;
tones.secondary[Luma::k80] = 0xffdabfd2U;
tones.secondary[Luma::k70] = 0xffbea4b7U;
tones.secondary[Luma::k60] = 0xffa2899cU;
tones.secondary[Luma::k50] = 0xff877082U;
tones.secondary[Luma::k40] = 0xff6e5869U;
tones.secondary[Luma::k30] = 0xff554151U;
tones.secondary[Luma::k20] = 0xff3d2b3aU;
tones.secondary[Luma::k10] = 0xff271624U;
tones.secondary[Luma::k0] = 0xff000000U;
tones.tertiary[Luma::k100] = 0xffffffffU;
tones.tertiary[Luma::k99] = 0xfffffbffU;
tones.tertiary[Luma::k95] = 0xffffede8U;
tones.tertiary[Luma::k90] = 0xffffdbd1U;
tones.tertiary[Luma::k80] = 0xfff5b8a7U;
tones.tertiary[Luma::k70] = 0xffd79e8dU;
tones.tertiary[Luma::k60] = 0xffba8474U;
tones.tertiary[Luma::k50] = 0xff9d6b5cU;
tones.tertiary[Luma::k40] = 0xff815345U;
tones.tertiary[Luma::k30] = 0xff663c2fU;
tones.tertiary[Luma::k20] = 0xff4c261bU;
tones.tertiary[Luma::k10] = 0xff321208U;
tones.tertiary[Luma::k0] = 0xff000000U;
tones.neutral1[Luma::k100] = 0xffffffffU;
tones.neutral1[Luma::k99] = 0xfffffbffU;
tones.neutral1[Luma::k95] = 0xfff8eef2U;
tones.neutral1[Luma::k90] = 0xffe9e0e4U;
tones.neutral1[Luma::k80] = 0xffcdc4c8U;
tones.neutral1[Luma::k70] = 0xffb1a9adU;
tones.neutral1[Luma::k60] = 0xff968f92U;
tones.neutral1[Luma::k50] = 0xff7c7579U;
tones.neutral1[Luma::k40] = 0xff635d60U;
tones.neutral1[Luma::k30] = 0xff4b4548U;
tones.neutral1[Luma::k20] = 0xff342f32U;
tones.neutral1[Luma::k10] = 0xff1e1a1dU;
tones.neutral1[Luma::k0] = 0xff000000U;
tones.neutral2[Luma::k100] = 0xffffffffU;
tones.neutral2[Luma::k99] = 0xfffffbffU;
tones.neutral2[Luma::k95] = 0xfffcecf5U;
tones.neutral2[Luma::k90] = 0xffeedee7U;
tones.neutral2[Luma::k80] = 0xffd1c2cbU;
tones.neutral2[Luma::k70] = 0xffb5a7b0U;
tones.neutral2[Luma::k60] = 0xff9a8d95U;
tones.neutral2[Luma::k50] = 0xff80747bU;
tones.neutral2[Luma::k40] = 0xff665b63U;
tones.neutral2[Luma::k30] = 0xff4e444bU;
tones.neutral2[Luma::k20] = 0xff372e34U;
tones.neutral2[Luma::k10] = 0xff21191fU;
tones.neutral2[Luma::k0] = 0xff000000U;
return tones;
}
ToneMap TealTones() {
ToneMap tones;
tones.seed = kTeal; // teal
tones.primary[Luma::k100] = 0xffffffffU;
tones.primary[Luma::k99] = 0xfff2fffcU;
tones.primary[Luma::k95] = 0xffb2fff6U;
tones.primary[Luma::k90] = 0xff71f7ebU;
tones.primary[Luma::k80] = 0xff50dbcfU;
tones.primary[Luma::k70] = 0xff26bfb3U;
tones.primary[Luma::k60] = 0xff00a298U;
tones.primary[Luma::k50] = 0xff00867dU;
tones.primary[Luma::k40] = 0xff006a63U;
tones.primary[Luma::k30] = 0xff00504bU;
tones.primary[Luma::k20] = 0xff003733U;
tones.primary[Luma::k10] = 0xff00201dU;
tones.primary[Luma::k0] = 0xff000000U;
tones.secondary[Luma::k100] = 0xffffffffU;
tones.secondary[Luma::k99] = 0xfff2fffcU;
tones.secondary[Luma::k95] = 0xffdaf7f2U;
tones.secondary[Luma::k90] = 0xffcce8e4U;
tones.secondary[Luma::k80] = 0xffb1ccc8U;
tones.secondary[Luma::k70] = 0xff96b1adU;
tones.secondary[Luma::k60] = 0xff7b9692U;
tones.secondary[Luma::k50] = 0xff627c79U;
tones.secondary[Luma::k40] = 0xff4a6360U;
tones.secondary[Luma::k30] = 0xff324b48U;
tones.secondary[Luma::k20] = 0xff1c3532U;
tones.secondary[Luma::k10] = 0xff051f1dU;
tones.secondary[Luma::k0] = 0xff000000U;
tones.tertiary[Luma::k100] = 0xffffffffU;
tones.tertiary[Luma::k99] = 0xfffcfcffU;
tones.tertiary[Luma::k95] = 0xffe8f2ffU;
tones.tertiary[Luma::k90] = 0xffcee5ffU;
tones.tertiary[Luma::k80] = 0xffafc9e7U;
tones.tertiary[Luma::k70] = 0xff94aecaU;
tones.tertiary[Luma::k60] = 0xff7993afU;
tones.tertiary[Luma::k50] = 0xff607994U;
tones.tertiary[Luma::k40] = 0xff47617aU;
tones.tertiary[Luma::k30] = 0xff2f4961U;
tones.tertiary[Luma::k20] = 0xff17324aU;
tones.tertiary[Luma::k10] = 0xff001d33U;
tones.tertiary[Luma::k0] = 0xff000000U;
tones.neutral1[Luma::k100] = 0xffffffffU;
tones.neutral1[Luma::k99] = 0xfffafdfbU;
tones.neutral1[Luma::k95] = 0xffeff1f0U;
tones.neutral1[Luma::k90] = 0xffe0e3e1U;
tones.neutral1[Luma::k80] = 0xffc4c7c6U;
tones.neutral1[Luma::k70] = 0xffa9acaaU;
tones.neutral1[Luma::k60] = 0xff8e9190U;
tones.neutral1[Luma::k50] = 0xff747877U;
tones.neutral1[Luma::k40] = 0xff5b5f5eU;
tones.neutral1[Luma::k30] = 0xff444747U;
tones.neutral1[Luma::k20] = 0xff2d3130U;
tones.neutral1[Luma::k10] = 0xff191c1cU;
tones.neutral1[Luma::k0] = 0xff000000U;
tones.neutral2[Luma::k100] = 0xffffffffU;
tones.neutral2[Luma::k99] = 0xfff4fefcU;
tones.neutral2[Luma::k95] = 0xffe9f3f0U;
tones.neutral2[Luma::k90] = 0xffdae5e2U;
tones.neutral2[Luma::k80] = 0xffbec9c6U;
tones.neutral2[Luma::k70] = 0xffa3adabU;
tones.neutral2[Luma::k60] = 0xff899391U;
tones.neutral2[Luma::k50] = 0xff6f7977U;
tones.neutral2[Luma::k40] = 0xff56605fU;
tones.neutral2[Luma::k30] = 0xff3f4947U;
tones.neutral2[Luma::k20] = 0xff293231U;
tones.neutral2[Luma::k10] = 0xff141d1cU;
tones.neutral2[Luma::k0] = 0xff000000U;
return tones;
}
void AddErrorColors(ToneMap& tones) {
tones.error[Luma::k100] = 0xffffffffU;
tones.error[Luma::k99] = 0xfffffbffU;
tones.error[Luma::k95] = 0xffffedeaU;
tones.error[Luma::k90] = 0xffffdad6U;
tones.error[Luma::k80] = 0xffffb4abU;
tones.error[Luma::k70] = 0xffff897dU;
tones.error[Luma::k60] = 0xffff5449U;
tones.error[Luma::k50] = 0xffde3730U;
tones.error[Luma::k40] = 0xffba1a1aU;
tones.error[Luma::k30] = 0xff93000aU;
tones.error[Luma::k20] = 0xff690005U;
tones.error[Luma::k10] = 0xff410002U;
tones.error[Luma::k0] = 0xff000000U;
}
// Extracts the hue for |color| in degrees [0-360).
SkScalar GetHue(SkColor color) {
SkScalar hsv[3];
SkColorToHSV(color, hsv);
// Index 0 is hue.
return hsv[0];
}
// Returns the difference in hue of two colors in degrees.
SkScalar HueDistance(SkColor a, SkColor b) {
SkScalar hue_a = GetHue(a);
SkScalar hue_b = GetHue(b);
return std::min(360 - std::abs(hue_a - hue_b), std::abs(hue_a - hue_b));
}
} // namespace
ToneMap::ToneMap() = default;
ToneMap::ToneMap(const ToneMap&) = default;
ToneMap::~ToneMap() = default;
const ToneMap GetTempPalette(SkColor seed_color) {
const SkScalar teal_distance = HueDistance(seed_color, kTeal);
const SkScalar purple_distance = HueDistance(seed_color, kPurple);
ToneMap tones =
(teal_distance < purple_distance) ? TealTones() : PurpleTones();
AddErrorColors(tones);
return tones;
}
} // namespace ui