From 813470aa7d8a5a6ae1258dc8cab66c64de818cd4 Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Thu, 23 Feb 2023 14:04:41 +0000 Subject: [PATCH] moved rgb/hsl helpers inside the color class --- TermTk/TTkCore/color.py | 56 +++++++++++++++++++++++++++++++++++ TermTk/TTkWidgets/image.py | 60 ++------------------------------------ 2 files changed, 58 insertions(+), 58 deletions(-) diff --git a/TermTk/TTkCore/color.py b/TermTk/TTkCore/color.py index d6db80c4..f446cf59 100644 --- a/TermTk/TTkCore/color.py +++ b/TermTk/TTkCore/color.py @@ -104,6 +104,62 @@ class _TTkColor: ( TTkK.Background if self._bg else TTkK.NONE ) | \ ( TTkK.Modifier if self._mod else TTkK.NONE ) + @staticmethod + def rgb2hsl(rgb): + r = rgb[0]/255 + g = rgb[1]/255 + b = rgb[2]/255 + cmax = max(r,g,b) + cmin = min(r,g,b) + + lum = (cmax-cmin)/2 + if cmax == cmin: + return 0,0,lum + + delta = cmax-cmin + if cmax == r: + hue = ((g-b)/delta)%6 + elif cmax == g: + hue = (b-r)/delta+2 + else: + hue = (r-g)/delta+4 + + sat = delta / (1 - abs(delta-1)) + hue = int(hue*60) + ( 360 if hue < 0 else 0 ) + sat = int(sat*100) + lum = int(lum*100) + + return hue,sat,lum + + @staticmethod + def hsl2rgb(hsl): + hue = hsl[0] + sat = hsl[1] / 100 + lum = hsl[2] / 100 + + c = (1-abs(2*lum-1))*sat + x = c*(1-abs((hue/60)%2-1)) + m = lum-c/2 + + if 0 <= hue < 60: + r,g,b = c,x,0 + elif 60 <= hue < 120: + r,g,b = x,c,0 + elif 120 <= hue < 180: + r,g,b = 0,c,x + elif 180 <= hue < 240: + r,g,b = 0,x,c + elif 240 <= hue < 300: + r,g,b = x,0,c + elif 300 <= hue < 360: + r,g,b = c,0,x + + r = int((r + m) * 255) + g = int((g + m) * 255) + b = int((b + m) * 255) + + return r,g,b + def getHex(self, ctype): if ctype == TTkK.Foreground: r,g,b = self.fgToRGB() diff --git a/TermTk/TTkWidgets/image.py b/TermTk/TTkWidgets/image.py index dad03d81..1d2df3e9 100644 --- a/TermTk/TTkWidgets/image.py +++ b/TermTk/TTkWidgets/image.py @@ -100,72 +100,16 @@ class TTkImage(TTkWidget): # Use Blue as splitter return splitReduce(2) - @staticmethod - def _rgb2hsl(rgb): - r = rgb[0]/255 - g = rgb[1]/255 - b = rgb[2]/255 - cmax = max(r,g,b) - cmin = min(r,g,b) - - lum = (cmax-cmin)/2 - if cmax == cmin: - return 0,0,lum - - delta = cmax-cmin - if cmax == r: - hue = ((g-b)/delta)%6 - elif cmax == g: - hue = (b-r)/delta+2 - else: - hue = (r-g)/delta+4 - - sat = delta / (1 - abs(delta-1)) - hue = int(hue*60) + ( 360 if hue < 0 else 0 ) - sat = int(sat*100) - lum = int(lum*100) - - return hue,sat,lum - - @staticmethod - def _hsl2rgb(hsl): - hue = hsl[0] - sat = hsl[1] / 100 - lum = hsl[2] / 100 - - c = (1-abs(2*lum-1))*sat - x = c*(1-abs((hue/60)%2-1)) - m = lum-c/2 - - if 0 <= hue < 60: - r,g,b = c,x,0 - elif 60 <= hue < 120: - r,g,b = x,c,0 - elif 120 <= hue < 180: - r,g,b = 0,c,x - elif 180 <= hue < 240: - r,g,b = 0,x,c - elif 240 <= hue < 300: - r,g,b = x,0,c - elif 300 <= hue < 360: - r,g,b = c,0,x - - r = int((r + m) * 255) - g = int((g + m) * 255) - b = int((b + m) * 255) - - return r,g,b - def rotHue(self, deg): old = self._data self._data = [[p for p in l ] for l in old] for row in self._data: for i,pixel in enumerate(row): - h,s,l = self._rgb2hsl(pixel) + h,s,l = TTkColor.rgb2hsl(pixel) h += deg #TTkLog.debug(f"{h=}") if h >= 360: h-=360 - row[i] = self._hsl2rgb((h,s,l)) + row[i] = TTkColor.hsl2rgb((h,s,l)) def paintEvent(self): img = self._data