window_themes_generate_name.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #include "window/themes/window_themes_generate_name.h"
  8. #include "base/random.h"
  9. namespace Window {
  10. namespace Theme {
  11. namespace {
  12. const auto kColors = base::flat_map<uint32, const char*>{
  13. { 0x8e0000U, "Berry" },
  14. { 0xdec196U, "Brandy" },
  15. { 0x800b47U, "Cherry" },
  16. { 0xff7f50U, "Coral" },
  17. { 0xdb5079U, "Cranberry" },
  18. { 0xdc143cU, "Crimson" },
  19. { 0xe0b0ffU, "Mauve" },
  20. { 0xffc0cbU, "Pink" },
  21. { 0xff0000U, "Red" },
  22. { 0xff007fU, "Rose" },
  23. { 0x80461bU, "Russet" },
  24. { 0xff2400U, "Scarlet" },
  25. { 0xf1f1f1U, "Seashell" },
  26. { 0xff3399U, "Strawberry" },
  27. { 0xffbf00U, "Amber" },
  28. { 0xeb9373U, "Apricot" },
  29. { 0xfbe7b2U, "Banana" },
  30. { 0xa1c50aU, "Citrus" },
  31. { 0xb06500U, "Ginger" },
  32. { 0xffd700U, "Gold" },
  33. { 0xfde910U, "Lemon" },
  34. { 0xffa500U, "Orange" },
  35. { 0xffe5b4U, "Peach" },
  36. { 0xff6b53U, "Persimmon" },
  37. { 0xe4d422U, "Sunflower" },
  38. { 0xf28500U, "Tangerine" },
  39. { 0xffc87cU, "Topaz" },
  40. { 0xffff00U, "Yellow" },
  41. { 0x384910U, "Clover" },
  42. { 0x83aa5dU, "Cucumber" },
  43. { 0x50c878U, "Emerald" },
  44. { 0xb5b35cU, "Olive" },
  45. { 0x00ff00U, "Green" },
  46. { 0x00a86bU, "Jade" },
  47. { 0x29ab87U, "Jungle" },
  48. { 0xbfff00U, "Lime" },
  49. { 0x0bda51U, "Malachite" },
  50. { 0x98ff98U, "Mint" },
  51. { 0xaddfadU, "Moss" },
  52. { 0x315ba1U, "Azure" },
  53. { 0x0000ffU, "Blue" },
  54. { 0x0047abU, "Cobalt" },
  55. { 0x4f69c6U, "Indigo" },
  56. { 0x017987U, "Lagoon" },
  57. { 0x71d9e2U, "Aquamarine" },
  58. { 0x120a8fU, "Ultramarine" },
  59. { 0x000080U, "Navy" },
  60. { 0x2f519eU, "Sapphire" },
  61. { 0x76d7eaU, "Sky" },
  62. { 0x008080U, "Teal" },
  63. { 0x40e0d0U, "Turquoise" },
  64. { 0x9966ccU, "Amethyst" },
  65. { 0x4d0135U, "Blackberry" },
  66. { 0x614051U, "Eggplant" },
  67. { 0xc8a2c8U, "Lilac" },
  68. { 0xb57edcU, "Lavender" },
  69. { 0xccccffU, "Periwinkle" },
  70. { 0x843179U, "Plum" },
  71. { 0x660099U, "Purple" },
  72. { 0xd8bfd8U, "Thistle" },
  73. { 0xda70d6U, "Orchid" },
  74. { 0x240a40U, "Violet" },
  75. { 0x3f2109U, "Bronze" },
  76. { 0x370202U, "Chocolate" },
  77. { 0x7b3f00U, "Cinnamon" },
  78. { 0x301f1eU, "Cocoa" },
  79. { 0x706555U, "Coffee" },
  80. { 0x796989U, "Rum" },
  81. { 0x4e0606U, "Mahogany" },
  82. { 0x782d19U, "Mocha" },
  83. { 0xc2b280U, "Sand" },
  84. { 0x882d17U, "Sienna" },
  85. { 0x780109U, "Maple" },
  86. { 0xf0e68cU, "Khaki" },
  87. { 0xb87333U, "Copper" },
  88. { 0xb94e48U, "Chestnut" },
  89. { 0xeed9c4U, "Almond" },
  90. { 0xfffdd0U, "Cream" },
  91. { 0xb9f2ffU, "Diamond" },
  92. { 0xa98307U, "Honey" },
  93. { 0xfffff0U, "Ivory" },
  94. { 0xeae0c8U, "Pearl" },
  95. { 0xeff2f3U, "Porcelain" },
  96. { 0xd1bea8U, "Vanilla" },
  97. { 0xffffffU, "White" },
  98. { 0x808080U, "Gray" },
  99. { 0x000000U, "Black" },
  100. { 0xe8f1d4U, "Chrome" },
  101. { 0x36454fU, "Charcoal" },
  102. { 0x0c0b1dU, "Ebony" },
  103. { 0xc0c0c0U, "Silver" },
  104. { 0xf5f5f5U, "Smoke" },
  105. { 0x262335U, "Steel" },
  106. { 0x4fa83dU, "Apple" },
  107. { 0x80b3c4U, "Glacier" },
  108. { 0xfebaadU, "Melon" },
  109. { 0xc54b8cU, "Mulberry" },
  110. { 0xa9c6c2U, "Opal" },
  111. { 0x54a5f8U, "Blue" }
  112. };
  113. const auto kAdjectives = std::vector<const char*>{
  114. "Ancient",
  115. "Antique",
  116. "Autumn",
  117. "Baby",
  118. "Barely",
  119. "Baroque",
  120. "Blazing",
  121. "Blushing",
  122. "Bohemian",
  123. "Bubbly",
  124. "Burning",
  125. "Buttered",
  126. "Classic",
  127. "Clear",
  128. "Cool",
  129. "Cosmic",
  130. "Cotton",
  131. "Cozy",
  132. "Crystal",
  133. "Dark",
  134. "Daring",
  135. "Darling",
  136. "Dawn",
  137. "Dazzling",
  138. "Deep",
  139. "Deepest",
  140. "Delicate",
  141. "Delightful",
  142. "Divine",
  143. "Double",
  144. "Downtown",
  145. "Dreamy",
  146. "Dusky",
  147. "Dusty",
  148. "Electric",
  149. "Enchanted",
  150. "Endless",
  151. "Evening",
  152. "Fantastic",
  153. "Flirty",
  154. "Forever",
  155. "Frigid",
  156. "Frosty",
  157. "Frozen",
  158. "Gentle",
  159. "Heavenly",
  160. "Hyper",
  161. "Icy",
  162. "Infinite",
  163. "Innocent",
  164. "Instant",
  165. "Luscious",
  166. "Lunar",
  167. "Lustrous",
  168. "Magic",
  169. "Majestic",
  170. "Mambo",
  171. "Midnight",
  172. "Millennium",
  173. "Morning",
  174. "Mystic",
  175. "Natural",
  176. "Neon",
  177. "Night",
  178. "Opaque",
  179. "Paradise",
  180. "Perfect",
  181. "Perky",
  182. "Polished",
  183. "Powerful",
  184. "Rich",
  185. "Royal",
  186. "Sheer",
  187. "Simply",
  188. "Sizzling",
  189. "Solar",
  190. "Sparkling",
  191. "Splendid",
  192. "Spicy",
  193. "Spring",
  194. "Stellar",
  195. "Sugared",
  196. "Summer",
  197. "Sunny",
  198. "Super",
  199. "Sweet",
  200. "Tender",
  201. "Tenacious",
  202. "Tidal",
  203. "Toasted",
  204. "Totally",
  205. "Tranquil",
  206. "Tropical",
  207. "True",
  208. "Twilight",
  209. "Twinkling",
  210. "Ultimate",
  211. "Ultra",
  212. "Velvety",
  213. "Vibrant",
  214. "Vintage",
  215. "Virtual",
  216. "Warm",
  217. "Warmest",
  218. "Whipped",
  219. "Wild",
  220. "Winsome"
  221. };
  222. const auto kSubjectives = std::vector<const char*>{
  223. "Ambrosia",
  224. "Attack",
  225. "Avalanche",
  226. "Blast",
  227. "Bliss",
  228. "Blossom",
  229. "Blush",
  230. "Burst",
  231. "Butter",
  232. "Candy",
  233. "Carnival",
  234. "Charm",
  235. "Chiffon",
  236. "Cloud",
  237. "Comet",
  238. "Delight",
  239. "Dream",
  240. "Dust",
  241. "Fantasy",
  242. "Flame",
  243. "Flash",
  244. "Fire",
  245. "Freeze",
  246. "Frost",
  247. "Glade",
  248. "Glaze",
  249. "Gleam",
  250. "Glimmer",
  251. "Glitter",
  252. "Glow",
  253. "Grande",
  254. "Haze",
  255. "Highlight",
  256. "Ice",
  257. "Illusion",
  258. "Intrigue",
  259. "Jewel",
  260. "Jubilee",
  261. "Kiss",
  262. "Lights",
  263. "Lollypop",
  264. "Love",
  265. "Luster",
  266. "Madness",
  267. "Matte",
  268. "Mirage",
  269. "Mist",
  270. "Moon",
  271. "Muse",
  272. "Myth",
  273. "Nectar",
  274. "Nova",
  275. "Parfait",
  276. "Passion",
  277. "Pop",
  278. "Rain",
  279. "Reflection",
  280. "Rhapsody",
  281. "Romance",
  282. "Satin",
  283. "Sensation",
  284. "Silk",
  285. "Shine",
  286. "Shadow",
  287. "Shimmer",
  288. "Sky",
  289. "Spice",
  290. "Star",
  291. "Sugar",
  292. "Sunrise",
  293. "Sunset",
  294. "Sun",
  295. "Twist",
  296. "Unbound",
  297. "Velvet",
  298. "Vibrant",
  299. "Waters",
  300. "Wine",
  301. "Wink",
  302. "Wonder",
  303. "Zone"
  304. };
  305. } // namespace
  306. QString GenerateName(const QColor &accent) {
  307. const auto r1 = accent.red();
  308. const auto g1 = accent.green();
  309. const auto b1 = accent.blue();
  310. const auto distance = [&](const auto &pair) {
  311. const auto &[color, name] = pair;
  312. const auto b2 = int(color & 0xFFU);
  313. const auto g2 = int((color >> 8) & 0xFFU);
  314. const auto r2 = int((color >> 16) & 0xFFU);
  315. const auto rMean = (r1 + r2) / 2;
  316. const auto r = r1 - r2;
  317. const auto g = g1 - g2;
  318. const auto b = b1 - b2;
  319. return (((512 + rMean) * r * r) >> 8)
  320. + (4 * g * g)
  321. + (((767 - rMean) * b * b) >> 8);
  322. };
  323. const auto pred = [&](const auto &a, const auto &b) {
  324. return distance(a) < distance(b);
  325. };
  326. const auto capitalized = [](const char *value) {
  327. Expects(*value != 0);
  328. auto result = QString::fromLatin1(value);
  329. result[0] = result[0].toUpper();
  330. return result;
  331. };
  332. const auto random = [&](const std::vector<const char*> &values) {
  333. const auto index = base::RandomValue<size_t>() % values.size();
  334. return capitalized(values[index]);
  335. };
  336. const auto min = ranges::min_element(kColors, pred);
  337. Assert(min != end(kColors));
  338. const auto color = capitalized(min->second);
  339. return (base::RandomValue<uint8>() % 2 == 0)
  340. ? random(kAdjectives) + ' ' + color
  341. : color + ' ' + random(kSubjectives);
  342. }
  343. } // namespace Theme
  344. } // namespace Window