summaryrefslogtreecommitdiff
path: root/poezio/colors.py
diff options
context:
space:
mode:
authorJonas Schäfer <j.wielicki@sotecware.net>2018-10-01 17:30:25 +0200
committerJonas Schäfer <j.wielicki@sotecware.net>2018-10-15 19:56:22 +0200
commitd85ad57f1e7a2338e20176a4450732a3d52f2747 (patch)
tree774975a2130765a3f1e80d04a4f66ed634245a7a /poezio/colors.py
parent1ed666c5b541eb7e1a294681790e09eac8cc0f5d (diff)
downloadpoezio-d85ad57f1e7a2338e20176a4450732a3d52f2747.tar.gz
poezio-d85ad57f1e7a2338e20176a4450732a3d52f2747.tar.bz2
poezio-d85ad57f1e7a2338e20176a4450732a3d52f2747.tar.xz
poezio-d85ad57f1e7a2338e20176a4450732a3d52f2747.zip
from __future__ import xep_0392.v0_5
Ahem. Thes updates poezio to use the HSLuv colour space to generate colours according to XEP-0392. This will become the standard in XEP-0392 v0.5.
Diffstat (limited to 'poezio/colors.py')
-rw-r--r--poezio/colors.py39
1 files changed, 8 insertions, 31 deletions
diff --git a/poezio/colors.py b/poezio/colors.py
index 6bbbb12e..e8bbfa36 100644
--- a/poezio/colors.py
+++ b/poezio/colors.py
@@ -3,6 +3,8 @@ import curses
import hashlib
import math
+import hsluv
+
Palette = Dict[float, int]
# BT.601 (YCbCr) constants, see XEP-0392
@@ -33,13 +35,6 @@ def ncurses_color_to_rgb(color: int) -> Tuple[float, float, float]:
return r / 5, g / 5, b / 5
-def rgb_to_ycbcr(r: float, g: float, b: float) -> Tuple[float, float, float]:
- y = K_R * r + K_G * g + K_B * b
- cr = (r - y) / (1 - K_R) / 2
- cb = (b - y) / (1 - K_B) / 2
- return y, cb, cr
-
-
def generate_ccg_palette(curses_palette: List[int],
reference_y: float) -> Palette:
cbcr_palette = {} # type: Dict[float, Tuple[float, int]]
@@ -48,8 +43,10 @@ def generate_ccg_palette(curses_palette: List[int],
# drop grayscale
if r == g == b:
continue
- y, cb, cr = rgb_to_ycbcr(r, g, b)
- key = round(cbcr_to_angle(cb, cr), 2)
+ h, _, y = hsluv.rgb_to_hsluv((r, g, b))
+ # this is to keep the code compatible with earlier versions of XEP-0392
+ y = y / 100
+ key = round(h)
try:
existing_y, *_ = cbcr_palette[key]
except KeyError:
@@ -68,35 +65,15 @@ def text_to_angle(text: str) -> float:
hf = hashlib.sha1()
hf.update(text.encode("utf-8"))
hue = int.from_bytes(hf.digest()[:2], "little")
- return hue / 65535 * math.pi * 2
-
-
-def angle_to_cbcr_edge(angle: float) -> Tuple[float, float]:
- cr = math.sin(angle)
- cb = math.cos(angle)
- if abs(cr) > abs(cb):
- factor = 0.5 / abs(cr)
- else:
- factor = 0.5 / abs(cb)
- return cb * factor, cr * factor
-
-
-def cbcr_to_angle(cb: float, cr: float) -> float:
- magn = math.sqrt(cb**2 + cr**2)
- if magn > 0:
- cr /= magn
- cb /= magn
- return math.atan2(cr, cb) % (2 * math.pi)
+ return hue / 65535 * 360
def ccg_palette_lookup(palette: Palette, angle: float) -> int:
# try quick lookup first
try:
- color = palette[round(angle, 2)]
+ return palette[round(angle)]
except KeyError:
pass
- else:
- return color
best_metric = float("inf")
best = None