355 lines
6.4 KiB
C++
355 lines
6.4 KiB
C++
/*
|
|
This file is part of Telegram Desktop,
|
|
the official desktop application for the Telegram messaging service.
|
|
|
|
For license and copyright information please follow this link:
|
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|
*/
|
|
#include "window/themes/window_themes_generate_name.h"
|
|
|
|
#include "base/openssl_help.h"
|
|
|
|
namespace Window {
|
|
namespace Theme {
|
|
namespace {
|
|
|
|
const auto kColors = base::flat_map<uint32, const char*>{
|
|
{ 0x8e0000U, "Berry" },
|
|
{ 0xdec196U, "Brandy" },
|
|
{ 0x800b47U, "Cherry" },
|
|
{ 0xff7f50U, "Coral" },
|
|
{ 0xdb5079U, "Cranberry" },
|
|
{ 0xdc143cU, "Crimson" },
|
|
{ 0xe0b0ffU, "Mauve" },
|
|
{ 0xffc0cbU, "Pink" },
|
|
{ 0xff0000U, "Red" },
|
|
{ 0xff007fU, "Rose" },
|
|
{ 0x80461bU, "Russet" },
|
|
{ 0xff2400U, "Scarlet" },
|
|
{ 0xf1f1f1U, "Seashell" },
|
|
{ 0xff3399U, "Strawberry" },
|
|
{ 0xffbf00U, "Amber" },
|
|
{ 0xeb9373U, "Apricot" },
|
|
{ 0xfbe7b2U, "Banana" },
|
|
{ 0xa1c50aU, "Citrus" },
|
|
{ 0xb06500U, "Ginger" },
|
|
{ 0xffd700U, "Gold" },
|
|
{ 0xfde910U, "Lemon" },
|
|
{ 0xffa500U, "Orange" },
|
|
{ 0xffe5b4U, "Peach" },
|
|
{ 0xff6b53U, "Persimmon" },
|
|
{ 0xe4d422U, "Sunflower" },
|
|
{ 0xf28500U, "Tangerine" },
|
|
{ 0xffc87cU, "Topaz" },
|
|
{ 0xffff00U, "Yellow" },
|
|
{ 0x384910U, "Clover" },
|
|
{ 0x83aa5dU, "Cucumber" },
|
|
{ 0x50c878U, "Emerald" },
|
|
{ 0xb5b35cU, "Olive" },
|
|
{ 0x00ff00U, "Green" },
|
|
{ 0x00a86bU, "Jade" },
|
|
{ 0x29ab87U, "Jungle" },
|
|
{ 0xbfff00U, "Lime" },
|
|
{ 0x0bda51U, "Malachite" },
|
|
{ 0x98ff98U, "Mint" },
|
|
{ 0xaddfadU, "Moss" },
|
|
{ 0x315ba1U, "Azure" },
|
|
{ 0x0000ffU, "Blue" },
|
|
{ 0x0047abU, "Cobalt" },
|
|
{ 0x4f69c6U, "Indigo" },
|
|
{ 0x017987U, "Lagoon" },
|
|
{ 0x71d9e2U, "Aquamarine" },
|
|
{ 0x120a8fU, "Ultramarine" },
|
|
{ 0x000080U, "Navy" },
|
|
{ 0x2f519eU, "Sapphire" },
|
|
{ 0x76d7eaU, "Sky" },
|
|
{ 0x008080U, "Teal" },
|
|
{ 0x40e0d0U, "Turquoise" },
|
|
{ 0x9966ccU, "Amethyst" },
|
|
{ 0x4d0135U, "Blackberry" },
|
|
{ 0x614051U, "Eggplant" },
|
|
{ 0xc8a2c8U, "Lilac" },
|
|
{ 0xb57edcU, "Lavender" },
|
|
{ 0xccccffU, "Periwinkle" },
|
|
{ 0x843179U, "Plum" },
|
|
{ 0x660099U, "Purple" },
|
|
{ 0xd8bfd8U, "Thistle" },
|
|
{ 0xda70d6U, "Orchid" },
|
|
{ 0x240a40U, "Violet" },
|
|
{ 0x3f2109U, "Bronze" },
|
|
{ 0x370202U, "Chocolate" },
|
|
{ 0x7b3f00U, "Cinnamon" },
|
|
{ 0x301f1eU, "Cocoa" },
|
|
{ 0x706555U, "Coffee" },
|
|
{ 0x796989U, "Rum" },
|
|
{ 0x4e0606U, "Mahogany" },
|
|
{ 0x782d19U, "Mocha" },
|
|
{ 0xc2b280U, "Sand" },
|
|
{ 0x882d17U, "Sienna" },
|
|
{ 0x780109U, "Maple" },
|
|
{ 0xf0e68cU, "Khaki" },
|
|
{ 0xb87333U, "Copper" },
|
|
{ 0xb94e48U, "Chestnut" },
|
|
{ 0xeed9c4U, "Almond" },
|
|
{ 0xfffdd0U, "Cream" },
|
|
{ 0xb9f2ffU, "Diamond" },
|
|
{ 0xa98307U, "Honey" },
|
|
{ 0xfffff0U, "Ivory" },
|
|
{ 0xeae0c8U, "Pearl" },
|
|
{ 0xeff2f3U, "Porcelain" },
|
|
{ 0xd1bea8U, "Vanilla" },
|
|
{ 0xffffffU, "White" },
|
|
{ 0x808080U, "Gray" },
|
|
{ 0x000000U, "Black" },
|
|
{ 0xe8f1d4U, "Chrome" },
|
|
{ 0x36454fU, "Charcoal" },
|
|
{ 0x0c0b1dU, "Ebony" },
|
|
{ 0xc0c0c0U, "Silver" },
|
|
{ 0xf5f5f5U, "Smoke" },
|
|
{ 0x262335U, "Steel" },
|
|
{ 0x4fa83dU, "Apple" },
|
|
{ 0x80b3c4U, "Glacier" },
|
|
{ 0xfebaadU, "Melon" },
|
|
{ 0xc54b8cU, "Mulberry" },
|
|
{ 0xa9c6c2U, "Opal" },
|
|
{ 0x54a5f8U, "Blue" }
|
|
};
|
|
|
|
const auto kAdjectives = std::vector<const char*>{
|
|
"Ancient",
|
|
"Antique",
|
|
"Autumn",
|
|
"Baby",
|
|
"Barely",
|
|
"Baroque",
|
|
"Blazing",
|
|
"Blushing",
|
|
"Bohemian",
|
|
"Bubbly",
|
|
"Burning",
|
|
"Buttered",
|
|
"Classic",
|
|
"Clear",
|
|
"Cool",
|
|
"Cosmic",
|
|
"Cotton",
|
|
"Cozy",
|
|
"Crystal",
|
|
"Dark",
|
|
"Daring",
|
|
"Darling",
|
|
"Dawn",
|
|
"Dazzling",
|
|
"Deep",
|
|
"Deepest",
|
|
"Delicate",
|
|
"Delightful",
|
|
"Divine",
|
|
"Double",
|
|
"Downtown",
|
|
"Dreamy",
|
|
"Dusky",
|
|
"Dusty",
|
|
"Electric",
|
|
"Enchanted",
|
|
"Endless",
|
|
"Evening",
|
|
"Fantastic",
|
|
"Flirty",
|
|
"Forever",
|
|
"Frigid",
|
|
"Frosty",
|
|
"Frozen",
|
|
"Gentle",
|
|
"Heavenly",
|
|
"Hyper",
|
|
"Icy",
|
|
"Infinite",
|
|
"Innocent",
|
|
"Instant",
|
|
"Luscious",
|
|
"Lunar",
|
|
"Lustrous",
|
|
"Magic",
|
|
"Majestic",
|
|
"Mambo",
|
|
"Midnight",
|
|
"Millennium",
|
|
"Morning",
|
|
"Mystic",
|
|
"Natural",
|
|
"Neon",
|
|
"Night",
|
|
"Opaque",
|
|
"Paradise",
|
|
"Perfect",
|
|
"Perky",
|
|
"Polished",
|
|
"Powerful",
|
|
"Rich",
|
|
"Royal",
|
|
"Sheer",
|
|
"Simply",
|
|
"Sizzling",
|
|
"Solar",
|
|
"Sparkling",
|
|
"Splendid",
|
|
"Spicy",
|
|
"Spring",
|
|
"Stellar",
|
|
"Sugared",
|
|
"Summer",
|
|
"Sunny",
|
|
"Super",
|
|
"Sweet",
|
|
"Tender",
|
|
"Tenacious",
|
|
"Tidal",
|
|
"Toasted",
|
|
"Totally",
|
|
"Tranquil",
|
|
"Tropical",
|
|
"True",
|
|
"Twilight",
|
|
"Twinkling",
|
|
"Ultimate",
|
|
"Ultra",
|
|
"Velvety",
|
|
"Vibrant",
|
|
"Vintage",
|
|
"Virtual",
|
|
"Warm",
|
|
"Warmest",
|
|
"Whipped",
|
|
"Wild",
|
|
"Winsome"
|
|
};
|
|
|
|
const auto kSubjectives = std::vector<const char*>{
|
|
"Ambrosia",
|
|
"Attack",
|
|
"Avalanche",
|
|
"Blast",
|
|
"Bliss",
|
|
"Blossom",
|
|
"Blush",
|
|
"Burst",
|
|
"Butter",
|
|
"Candy",
|
|
"Carnival",
|
|
"Charm",
|
|
"Chiffon",
|
|
"Cloud",
|
|
"Comet",
|
|
"Delight",
|
|
"Dream",
|
|
"Dust",
|
|
"Fantasy",
|
|
"Flame",
|
|
"Flash",
|
|
"Fire",
|
|
"Freeze",
|
|
"Frost",
|
|
"Glade",
|
|
"Glaze",
|
|
"Gleam",
|
|
"Glimmer",
|
|
"Glitter",
|
|
"Glow",
|
|
"Grande",
|
|
"Haze",
|
|
"Highlight",
|
|
"Ice",
|
|
"Illusion",
|
|
"Intrigue",
|
|
"Jewel",
|
|
"Jubilee",
|
|
"Kiss",
|
|
"Lights",
|
|
"Lollypop",
|
|
"Love",
|
|
"Luster",
|
|
"Madness",
|
|
"Matte",
|
|
"Mirage",
|
|
"Mist",
|
|
"Moon",
|
|
"Muse",
|
|
"Myth",
|
|
"Nectar",
|
|
"Nova",
|
|
"Parfait",
|
|
"Passion",
|
|
"Pop",
|
|
"Rain",
|
|
"Reflection",
|
|
"Rhapsody",
|
|
"Romance",
|
|
"Satin",
|
|
"Sensation",
|
|
"Silk",
|
|
"Shine",
|
|
"Shadow",
|
|
"Shimmer",
|
|
"Sky",
|
|
"Spice",
|
|
"Star",
|
|
"Sugar",
|
|
"Sunrise",
|
|
"Sunset",
|
|
"Sun",
|
|
"Twist",
|
|
"Unbound",
|
|
"Velvet",
|
|
"Vibrant",
|
|
"Waters",
|
|
"Wine",
|
|
"Wink",
|
|
"Wonder",
|
|
"Zone"
|
|
};
|
|
|
|
} // namespace
|
|
|
|
QString GenerateName(const QColor &accent) {
|
|
const auto r1 = accent.red();
|
|
const auto g1 = accent.green();
|
|
const auto b1 = accent.blue();
|
|
const auto distance = [&](const auto &pair) {
|
|
const auto &[color, name] = pair;
|
|
const auto b2 = int(color & 0xFFU);
|
|
const auto g2 = int((color >> 8) & 0xFFU);
|
|
const auto r2 = int((color >> 16) & 0xFFU);
|
|
const auto rMean = (r1 + r2) / 2;
|
|
const auto r = r1 - r2;
|
|
const auto g = g1 - g2;
|
|
const auto b = b1 - b2;
|
|
return (((512 + rMean) * r * r) >> 8)
|
|
+ (4 * g * g)
|
|
+ (((767 - rMean) * b * b) >> 8);
|
|
};
|
|
const auto pred = [&](const auto &a, const auto &b) {
|
|
return distance(a) < distance(b);
|
|
};
|
|
const auto capitalized = [](const char *value) {
|
|
Expects(*value != 0);
|
|
|
|
auto result = QString::fromLatin1(value);
|
|
result[0] = result[0].toUpper();
|
|
return result;
|
|
};
|
|
const auto random = [&](const std::vector<const char*> &values) {
|
|
const auto index = openssl::RandomValue<size_t>() % values.size();
|
|
return capitalized(values[index]);
|
|
};
|
|
const auto min = ranges::min_element(kColors, pred);
|
|
Assert(min != end(kColors));
|
|
const auto color = capitalized(min->second);
|
|
return (openssl::RandomValue<uint8>() % 2 == 0)
|
|
? random(kAdjectives) + ' ' + color
|
|
: color + ' ' + random(kSubjectives);
|
|
}
|
|
|
|
} // namespace Theme
|
|
} // namespace Window
|