summaryrefslogtreecommitdiff
path: root/bouncer/richtext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'bouncer/richtext.cpp')
-rw-r--r--bouncer/richtext.cpp51
1 files changed, 48 insertions, 3 deletions
diff --git a/bouncer/richtext.cpp b/bouncer/richtext.cpp
index 2deebda..396f666 100644
--- a/bouncer/richtext.cpp
+++ b/bouncer/richtext.cpp
@@ -177,15 +177,60 @@ const char *RichTextBuilder::c_str() {
+inline static float hslValue(float n1, float n2, float hue) {
+ if (hue > 6.0f)
+ hue -= 6.0f;
+ else if (hue < 0.0f)
+ hue += 6.0f;
+
+ if (hue < 1.0f)
+ return n1 + (n2 - n1) * hue;
+ else if (hue < 3.0f)
+ return n2;
+ else if (hue < 4.0f)
+ return n1 + (n2 - n1) * (4.0f - hue);
+ else
+ return n1;
+}
+
+void calculateHSL(float h, float s, float l, uint8_t *r, uint8_t *g, uint8_t *b) {
+ // make it RGB
+
+ if (s == 0) {
+ *r = *g = *b = l*255.0f;
+ } else {
+ float m1, m2;
+ if (l <= 0.5f)
+ m2 = l * (1.0f + s);
+ else
+ m2 = l + s - l * s;
+
+ m1 = 2.0f * s - m2;
+
+ *r = hslValue(m1, m2, h * 6.0f + 2.0) * 255.0f;
+ *g = hslValue(m1, m2, h * 6.0f) * 255.0f;
+ *b = hslValue(m1, m2, h * 6.0f - 2.0) * 255.0f;
+ }
+}
+
+
+
void RichTextBuilder::appendNick(const char *nick) {
uint32_t hash = 0;
const char *c = nick;
while (*c)
hash = (hash * 17) + *(c++);
- int r = ((hash & 0xFF0000) >> 16);
- int g = ((hash & 0xFF00) >> 8);
- int b = (hash & 0xFF);
+ int hueBase = ((hash & 0xFF0000) >> 16);
+ int satBase = ((hash & 0xFF00) >> 8);
+ int lumBase = (hash & 0xFF);
+ uint8_t r, g, b;
+
+ calculateHSL(
+ hueBase / 255.0f,
+ (0.50f + (satBase / 765.0f)),
+ (0.40f + (lumBase / 1020.0f)),
+ &r, &g, &b);
foreground(COL_LEVEL_NICK, r, g, b);
append(nick);