diff --git a/pygal/colors.py b/pygal/colors.py new file mode 100644 index 0000000..4c08f7c --- /dev/null +++ b/pygal/colors.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- +# This file is part of pygal +# +# A python svg graph plotting library +# Copyright © 2012-2013 Kozea +# +# This library is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) any +# later version. +# +# This library is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with pygal. If not, see . +""" +Color utils + +""" +from __future__ import division + + +def normalize_float(f): + if abs(f - round(f)) < .0000000000001: + return round(f) + return f + + +def rgb_to_hsl(r, g, b): + r /= 255 + g /= 255 + b /= 255 + max_ = max((r, g, b)) + min_ = min((r, g, b)) + d = max_ - min_ + + if not d: + h = 0 + elif r is max_: + h = 60 * (g - b) / d + elif g is max_: + h = 60 * (b - r) / d + 120 + else: + h = 60 * (r - g) / d + 240 + + l = .5 * (max_ + min_) + if not d: + s = 0 + elif l < 0.5: + s = .5 * d / l + else: + s = .5 * d / (1 - l) + return tuple(map(normalize_float, (h % 360, s * 100, l * 100))) + + +def hsl_to_rgb(h, s, l): + h /= 360 + s /= 100 + l /= 100 + + m2 = l * (s + 1) if l <= .5 else l + s - l * s + m1 = 2 * l - m2 + + def h_to_rgb(h): + h = h % 1 + if 6 * h < 1: + return m1 + 6 * h * (m2 - m1) + if 2 * h < 1: + return m2 + if 3 * h < 2: + return m1 + 6 * (2 / 3 - h) * (m2 - m1) + return m1 + r, g, b = map(lambda x: round(x * 255), + map(h_to_rgb, (h + 1 / 3, h, h - 1 / 3))) + + return r, g, b + + +def adjust(color, attribute, percent): + assert color[0] == '#', '#rrggbb and #rgb format are supported' + color = color[1:] + assert len(color) in (3, 6), '#rrggbb and #rgb format are supported' + if len(color) == 3: + color = [a for b in zip(color, color) for a in b] + + bound = lambda x: max(0, min(100, x)) + + def _adjust(hsl): + hsl = list(hsl) + if attribute > 0: + hsl[attribute] = bound(hsl[attribute] + percent) + else: + hsl[attribute] += percent + + return hsl + return '#%02x%02x%02x' % hsl_to_rgb( + *_adjust( + rgb_to_hsl(*map(lambda x: int(''.join(x), 16), + zip(color[::2], color[1::2]))))) + + +def rotate(color, percent): + return adjust(color, 0, percent) + + +def saturate(color, percent): + return adjust(color, 1, percent) + + +def desaturate(color, percent): + return adjust(color, 1, -percent) + + +def lighten(color, percent): + return adjust(color, 2, percent) + + +def darken(color, percent): + return adjust(color, 2, -percent) diff --git a/pygal/style.py b/pygal/style.py index 7e2d477..50f9846 100644 --- a/pygal/style.py +++ b/pygal/style.py @@ -20,23 +20,7 @@ Charts styling """ from __future__ import division -from pygal.util import cycle_fill, rgb_to_hsl, hsl_to_rgb - - -def darken(color, percent): - assert color[0] == '#', '#rrggbb and #rgb format are supported' - color = color[1:] - assert len(color) in (3, 6), '#rrggbb and #rgb format are supported' - if len(color) == 3: - color = [a for b in zip(color, color) for a in b] - return '#%02x%02x%02x' % hsl_to_rgb( - *(lambda h, s, l: (h, s, max(0, min(100, l - percent))))( - *rgb_to_hsl(*map(lambda x: int(''.join(x), 16), - zip(color[::2], color[1::2]))))) - - -def lighten(color, percent): - return darken(color, -percent) +from pygal.util import cycle_fill class Style(object): diff --git a/pygal/test/test_colors.py b/pygal/test/test_colors.py new file mode 100644 index 0000000..c60f72b --- /dev/null +++ b/pygal/test/test_colors.py @@ -0,0 +1,446 @@ +from pygal.colors import ( + rgb_to_hsl, hsl_to_rgb, darken, lighten, saturate, desaturate, rotate) + + +def test_darken(): + assert darken('#800', 20) == '#220000' + assert darken('#800', 0) == '#880000' + assert darken('#ffffff', 10) == '#e6e6e6' + assert darken('#000000', 10) == '#000000' + assert darken('#f3148a', 25) == '#810747' + assert darken('#121212', 1) == '#0f0f0f' + assert darken('#999999', 100) == '#000000' + assert darken('#1479ac', 8) == '#105f87' + + +def test_lighten(): + assert lighten('#800', 20) == '#ee0000' + assert lighten('#800', 0) == '#880000' + assert lighten('#ffffff', 10) == '#ffffff' + assert lighten('#000000', 10) == '#1a1a1a' + assert lighten('#f3148a', 25) == '#f98dc6' + assert lighten('#121212', 1) == '#151515' + assert lighten('#999999', 100) == '#ffffff' + assert lighten('#1479ac', 8) == '#1893d1' + + +def test_saturate(): + assert saturate('#000', 20) == '#000000' + assert saturate('#fff', 20) == '#ffffff' + assert saturate('#8a8', 100) == '#33ff33' + assert saturate('#855', 20) == '#9e3f3f' + + +def test_desaturate(): + assert desaturate('#000', 20) == '#000000' + assert desaturate('#fff', 20) == '#ffffff' + assert desaturate('#8a8', 100) == '#999999' + assert desaturate('#855', 20) == '#726b6b' + + +def test_rotate(): + assert rotate('#000', 45) == '#000000' + assert rotate('#fff', 45) == '#ffffff' + assert rotate('#811', 45) == '#886a11' + assert rotate('#8a8', 360) == '#88aa88' + assert rotate('#8a8', 0) == '#88aa88' + assert rotate('#8a8', -360) == '#88aa88' + + +def test_hsl_to_rgb_part_0(): + assert hsl_to_rgb(0, 100, 50) == (255, 0, 0) + assert hsl_to_rgb(60, 100, 50) == (255, 255, 0) + assert hsl_to_rgb(120, 100, 50) == (0, 255, 0) + assert hsl_to_rgb(180, 100, 50) == (0, 255, 255) + assert hsl_to_rgb(240, 100, 50) == (0, 0, 255) + assert hsl_to_rgb(300, 100, 50) == (255, 0, 255) + + +def test_rgb_to_hsl_part_0(): + assert rgb_to_hsl(255, 0, 0) == (0, 100, 50) + assert rgb_to_hsl(255, 255, 0) == (60, 100, 50) + assert rgb_to_hsl(0, 255, 0) == (120, 100, 50) + assert rgb_to_hsl(0, 255, 255) == (180, 100, 50) + assert rgb_to_hsl(0, 0, 255) == (240, 100, 50) + assert rgb_to_hsl(255, 0, 255) == (300, 100, 50) + + +def test_hsl_to_rgb_part_1(): + assert hsl_to_rgb(-360, 100, 50) == (255, 0, 0) + assert hsl_to_rgb(-300, 100, 50) == (255, 255, 0) + assert hsl_to_rgb(-240, 100, 50) == (0, 255, 0) + assert hsl_to_rgb(-180, 100, 50) == (0, 255, 255) + assert hsl_to_rgb(-120, 100, 50) == (0, 0, 255) + assert hsl_to_rgb(-60, 100, 50) == (255, 0, 255) + + +def test_rgb_to_hsl_part_1(): + # assert rgb_to_hsl(255, 0, 0) == (-360, 100, 50) + # assert rgb_to_hsl(255, 255, 0) == (-300, 100, 50) + # assert rgb_to_hsl(0, 255, 0) == (-240, 100, 50) + # assert rgb_to_hsl(0, 255, 255) == (-180, 100, 50) + # assert rgb_to_hsl(0, 0, 255) == (-120, 100, 50) + # assert rgb_to_hsl(255, 0, 255) == (-60, 100, 50) + pass + + +def test_hsl_to_rgb_part_2(): + assert hsl_to_rgb(360, 100, 50) == (255, 0, 0) + assert hsl_to_rgb(420, 100, 50) == (255, 255, 0) + assert hsl_to_rgb(480, 100, 50) == (0, 255, 0) + assert hsl_to_rgb(540, 100, 50) == (0, 255, 255) + assert hsl_to_rgb(600, 100, 50) == (0, 0, 255) + assert hsl_to_rgb(660, 100, 50) == (255, 0, 255) + + +def test_rgb_to_hsl_part_2(): + # assert rgb_to_hsl(255, 0, 0) == (360, 100, 50) + # assert rgb_to_hsl(255, 255, 0) == (420, 100, 50) + # assert rgb_to_hsl(0, 255, 0) == (480, 100, 50) + # assert rgb_to_hsl(0, 255, 255) == (540, 100, 50) + # assert rgb_to_hsl(0, 0, 255) == (600, 100, 50) + # assert rgb_to_hsl(255, 0, 255) == (660, 100, 50) + pass + + +def test_hsl_to_rgb_part_3(): + assert hsl_to_rgb(6120, 100, 50) == (255, 0, 0) + assert hsl_to_rgb(-9660, 100, 50) == (255, 255, 0) + assert hsl_to_rgb(99840, 100, 50) == (0, 255, 0) + assert hsl_to_rgb(-900, 100, 50) == (0, 255, 255) + assert hsl_to_rgb(-104880, 100, 50) == (0, 0, 255) + assert hsl_to_rgb(2820, 100, 50) == (255, 0, 255) + + +def test_rgb_to_hsl_part_3(): + # assert rgb_to_hsl(255, 0, 0) == (6120, 100, 50) + # assert rgb_to_hsl(255, 255, 0) == (-9660, 100, 50) + # assert rgb_to_hsl(0, 255, 0) == (99840, 100, 50) + # assert rgb_to_hsl(0, 255, 255) == (-900, 100, 50) + # assert rgb_to_hsl(0, 0, 255) == (-104880, 100, 50) + # assert rgb_to_hsl(255, 0, 255) == (2820, 100, 50) + pass + + +def test_hsl_to_rgb_part_4(): + assert hsl_to_rgb(0, 100, 50) == (255, 0, 0) + assert hsl_to_rgb(12, 100, 50) == (255, 51, 0) + assert hsl_to_rgb(24, 100, 50) == (255, 102, 0) + assert hsl_to_rgb(36, 100, 50) == (255, 153, 0) + assert hsl_to_rgb(48, 100, 50) == (255, 204, 0) + assert hsl_to_rgb(60, 100, 50) == (255, 255, 0) + assert hsl_to_rgb(72, 100, 50) == (204, 255, 0) + assert hsl_to_rgb(84, 100, 50) == (153, 255, 0) + assert hsl_to_rgb(96, 100, 50) == (102, 255, 0) + assert hsl_to_rgb(108, 100, 50) == (51, 255, 0) + assert hsl_to_rgb(120, 100, 50) == (0, 255, 0) + + +def test_rgb_to_hsl_part_4(): + assert rgb_to_hsl(255, 0, 0) == (0, 100, 50) + assert rgb_to_hsl(255, 51, 0) == (12, 100, 50) + assert rgb_to_hsl(255, 102, 0) == (24, 100, 50) + assert rgb_to_hsl(255, 153, 0) == (36, 100, 50) + assert rgb_to_hsl(255, 204, 0) == (48, 100, 50) + assert rgb_to_hsl(255, 255, 0) == (60, 100, 50) + assert rgb_to_hsl(204, 255, 0) == (72, 100, 50) + assert rgb_to_hsl(153, 255, 0) == (84, 100, 50) + assert rgb_to_hsl(102, 255, 0) == (96, 100, 50) + assert rgb_to_hsl(51, 255, 0) == (108, 100, 50) + assert rgb_to_hsl(0, 255, 0) == (120, 100, 50) + + +def test_hsl_to_rgb_part_5(): + assert hsl_to_rgb(120, 100, 50) == (0, 255, 0) + assert hsl_to_rgb(132, 100, 50) == (0, 255, 51) + assert hsl_to_rgb(144, 100, 50) == (0, 255, 102) + assert hsl_to_rgb(156, 100, 50) == (0, 255, 153) + assert hsl_to_rgb(168, 100, 50) == (0, 255, 204) + assert hsl_to_rgb(180, 100, 50) == (0, 255, 255) + assert hsl_to_rgb(192, 100, 50) == (0, 204, 255) + assert hsl_to_rgb(204, 100, 50) == (0, 153, 255) + assert hsl_to_rgb(216, 100, 50) == (0, 102, 255) + assert hsl_to_rgb(228, 100, 50) == (0, 51, 255) + assert hsl_to_rgb(240, 100, 50) == (0, 0, 255) + + +def test_rgb_to_hsl_part_5(): + assert rgb_to_hsl(0, 255, 0) == (120, 100, 50) + assert rgb_to_hsl(0, 255, 51) == (132, 100, 50) + assert rgb_to_hsl(0, 255, 102) == (144, 100, 50) + assert rgb_to_hsl(0, 255, 153) == (156, 100, 50) + assert rgb_to_hsl(0, 255, 204) == (168, 100, 50) + assert rgb_to_hsl(0, 255, 255) == (180, 100, 50) + assert rgb_to_hsl(0, 204, 255) == (192, 100, 50) + assert rgb_to_hsl(0, 153, 255) == (204, 100, 50) + assert rgb_to_hsl(0, 102, 255) == (216, 100, 50) + assert rgb_to_hsl(0, 51, 255) == (228, 100, 50) + assert rgb_to_hsl(0, 0, 255) == (240, 100, 50) + + +def test_hsl_to_rgb_part_6(): + assert hsl_to_rgb(240, 100, 50) == (0, 0, 255) + assert hsl_to_rgb(252, 100, 50) == (51, 0, 255) + assert hsl_to_rgb(264, 100, 50) == (102, 0, 255) + assert hsl_to_rgb(276, 100, 50) == (153, 0, 255) + assert hsl_to_rgb(288, 100, 50) == (204, 0, 255) + assert hsl_to_rgb(300, 100, 50) == (255, 0, 255) + assert hsl_to_rgb(312, 100, 50) == (255, 0, 204) + assert hsl_to_rgb(324, 100, 50) == (255, 0, 153) + assert hsl_to_rgb(336, 100, 50) == (255, 0, 102) + assert hsl_to_rgb(348, 100, 50) == (255, 0, 51) + assert hsl_to_rgb(360, 100, 50) == (255, 0, 0) + + +def test_rgb_to_hsl_part_6(): + assert rgb_to_hsl(0, 0, 255) == (240, 100, 50) + assert rgb_to_hsl(51, 0, 255) == (252, 100, 50) + assert rgb_to_hsl(102, 0, 255) == (264, 100, 50) + assert rgb_to_hsl(153, 0, 255) == (276, 100, 50) + assert rgb_to_hsl(204, 0, 255) == (288, 100, 50) + assert rgb_to_hsl(255, 0, 255) == (300, 100, 50) + assert rgb_to_hsl(255, 0, 204) == (312, 100, 50) + assert rgb_to_hsl(255, 0, 153) == (324, 100, 50) + assert rgb_to_hsl(255, 0, 102) == (336, 100, 50) + assert rgb_to_hsl(255, 0, 51) == (348, 100, 50) + # assert rgb_to_hsl(255, 0, 0) == (360, 100, 50) + + +def test_hsl_to_rgb_part_7(): + assert hsl_to_rgb(0, 20, 50) == (153, 102, 102) + assert hsl_to_rgb(0, 60, 50) == (204, 51, 51) + assert hsl_to_rgb(0, 100, 50) == (255, 0, 0) + + +def test_rgb_to_hsl_part_7(): + assert rgb_to_hsl(153, 102, 102) == (0, 20, 50) + assert rgb_to_hsl(204, 51, 51) == (0, 60, 50) + assert rgb_to_hsl(255, 0, 0) == (0, 100, 50) + + +def test_hsl_to_rgb_part_8(): + assert hsl_to_rgb(60, 20, 50) == (153, 153, 102) + assert hsl_to_rgb(60, 60, 50) == (204, 204, 51) + assert hsl_to_rgb(60, 100, 50) == (255, 255, 0) + + +def test_rgb_to_hsl_part_8(): + assert rgb_to_hsl(153, 153, 102) == (60, 20, 50) + assert rgb_to_hsl(204, 204, 51) == (60, 60, 50) + assert rgb_to_hsl(255, 255, 0) == (60, 100, 50) + + +def test_hsl_to_rgb_part_9(): + assert hsl_to_rgb(120, 20, 50) == (102, 153, 102) + assert hsl_to_rgb(120, 60, 50) == (51, 204, 51) + assert hsl_to_rgb(120, 100, 50) == (0, 255, 0) + + +def test_rgb_to_hsl_part_9(): + assert rgb_to_hsl(102, 153, 102) == (120, 20, 50) + assert rgb_to_hsl(51, 204, 51) == (120, 60, 50) + assert rgb_to_hsl(0, 255, 0) == (120, 100, 50) + + +def test_hsl_to_rgb_part_10(): + assert hsl_to_rgb(180, 20, 50) == (102, 153, 153) + assert hsl_to_rgb(180, 60, 50) == (51, 204, 204) + assert hsl_to_rgb(180, 100, 50) == (0, 255, 255) + + +def test_rgb_to_hsl_part_10(): + assert rgb_to_hsl(102, 153, 153) == (180, 20, 50) + assert rgb_to_hsl(51, 204, 204) == (180, 60, 50) + assert rgb_to_hsl(0, 255, 255) == (180, 100, 50) + + +def test_hsl_to_rgb_part_11(): + assert hsl_to_rgb(240, 20, 50) == (102, 102, 153) + assert hsl_to_rgb(240, 60, 50) == (51, 51, 204) + assert hsl_to_rgb(240, 100, 50) == (0, 0, 255) + + +def test_rgb_to_hsl_part_11(): + assert rgb_to_hsl(102, 102, 153) == (240, 20, 50) + assert rgb_to_hsl(51, 51, 204) == (240, 60, 50) + assert rgb_to_hsl(0, 0, 255) == (240, 100, 50) + + +def test_hsl_to_rgb_part_12(): + assert hsl_to_rgb(300, 20, 50) == (153, 102, 153) + assert hsl_to_rgb(300, 60, 50) == (204, 51, 204) + assert hsl_to_rgb(300, 100, 50) == (255, 0, 255) + + +def test_rgb_to_hsl_part_12(): + assert rgb_to_hsl(153, 102, 153) == (300, 20, 50) + assert rgb_to_hsl(204, 51, 204) == (300, 60, 50) + assert rgb_to_hsl(255, 0, 255) == (300, 100, 50) + + +def test_hsl_to_rgb_part_13(): + assert hsl_to_rgb(0, 100, 0) == (0, 0, 0) + assert hsl_to_rgb(0, 100, 10) == (51, 0, 0) + assert hsl_to_rgb(0, 100, 20) == (102, 0, 0) + assert hsl_to_rgb(0, 100, 30) == (153, 0, 0) + assert hsl_to_rgb(0, 100, 40) == (204, 0, 0) + assert hsl_to_rgb(0, 100, 50) == (255, 0, 0) + assert hsl_to_rgb(0, 100, 60) == (255, 51, 51) + assert hsl_to_rgb(0, 100, 70) == (255, 102, 102) + assert hsl_to_rgb(0, 100, 80) == (255, 153, 153) + assert hsl_to_rgb(0, 100, 90) == (255, 204, 204) + assert hsl_to_rgb(0, 100, 100) == (255, 255, 255) + + +def test_rgb_to_hsl_part_13(): + assert rgb_to_hsl(0, 0, 0) == (0, 0, 0) + assert rgb_to_hsl(51, 0, 0) == (0, 100, 10) + assert rgb_to_hsl(102, 0, 0) == (0, 100, 20) + assert rgb_to_hsl(153, 0, 0) == (0, 100, 30) + assert rgb_to_hsl(204, 0, 0) == (0, 100, 40) + assert rgb_to_hsl(255, 0, 0) == (0, 100, 50) + assert rgb_to_hsl(255, 51, 51) == (0, 100, 60) + assert rgb_to_hsl(255, 102, 102) == (0, 100, 70) + assert rgb_to_hsl(255, 153, 153) == (0, 100, 80) + assert rgb_to_hsl(255, 204, 204) == (0, 100, 90) + assert rgb_to_hsl(255, 255, 255) == (0, 0, 100) + + +def test_hsl_to_rgb_part_14(): + assert hsl_to_rgb(60, 100, 0) == (0, 0, 0) + assert hsl_to_rgb(60, 100, 10) == (51, 51, 0) + assert hsl_to_rgb(60, 100, 20) == (102, 102, 0) + assert hsl_to_rgb(60, 100, 30) == (153, 153, 0) + assert hsl_to_rgb(60, 100, 40) == (204, 204, 0) + assert hsl_to_rgb(60, 100, 50) == (255, 255, 0) + assert hsl_to_rgb(60, 100, 60) == (255, 255, 51) + assert hsl_to_rgb(60, 100, 70) == (255, 255, 102) + assert hsl_to_rgb(60, 100, 80) == (255, 255, 153) + assert hsl_to_rgb(60, 100, 90) == (255, 255, 204) + assert hsl_to_rgb(60, 100, 100) == (255, 255, 255) + + +def test_rgb_to_hsl_part_14(): + # assert rgb_to_hsl(0, 0, 0) == (60, 100, 0) + assert rgb_to_hsl(51, 51, 0) == (60, 100, 10) + assert rgb_to_hsl(102, 102, 0) == (60, 100, 20) + assert rgb_to_hsl(153, 153, 0) == (60, 100, 30) + assert rgb_to_hsl(204, 204, 0) == (60, 100, 40) + assert rgb_to_hsl(255, 255, 0) == (60, 100, 50) + assert rgb_to_hsl(255, 255, 51) == (60, 100, 60) + assert rgb_to_hsl(255, 255, 102) == (60, 100, 70) + assert rgb_to_hsl(255, 255, 153) == (60, 100, 80) + assert rgb_to_hsl(255, 255, 204) == (60, 100, 90) + # assert rgb_to_hsl(255, 255, 255) == (60, 100, 100) + + +def test_hsl_to_rgb_part_15(): + assert hsl_to_rgb(120, 100, 0) == (0, 0, 0) + assert hsl_to_rgb(120, 100, 10) == (0, 51, 0) + assert hsl_to_rgb(120, 100, 20) == (0, 102, 0) + assert hsl_to_rgb(120, 100, 30) == (0, 153, 0) + assert hsl_to_rgb(120, 100, 40) == (0, 204, 0) + assert hsl_to_rgb(120, 100, 50) == (0, 255, 0) + assert hsl_to_rgb(120, 100, 60) == (51, 255, 51) + assert hsl_to_rgb(120, 100, 70) == (102, 255, 102) + assert hsl_to_rgb(120, 100, 80) == (153, 255, 153) + assert hsl_to_rgb(120, 100, 90) == (204, 255, 204) + assert hsl_to_rgb(120, 100, 100) == (255, 255, 255) + + +def test_rgb_to_hsl_part_15(): + # assert rgb_to_hsl(0, 0, 0) == (120, 100, 0) + assert rgb_to_hsl(0, 51, 0) == (120, 100, 10) + assert rgb_to_hsl(0, 102, 0) == (120, 100, 20) + assert rgb_to_hsl(0, 153, 0) == (120, 100, 30) + assert rgb_to_hsl(0, 204, 0) == (120, 100, 40) + assert rgb_to_hsl(0, 255, 0) == (120, 100, 50) + assert rgb_to_hsl(51, 255, 51) == (120, 100, 60) + assert rgb_to_hsl(102, 255, 102) == (120, 100, 70) + assert rgb_to_hsl(153, 255, 153) == (120, 100, 80) + assert rgb_to_hsl(204, 255, 204) == (120, 100, 90) + # assert rgb_to_hsl(255, 255, 255) == (120, 100, 100) + + +def test_hsl_to_rgb_part_16(): + assert hsl_to_rgb(180, 100, 0) == (0, 0, 0) + assert hsl_to_rgb(180, 100, 10) == (0, 51, 51) + assert hsl_to_rgb(180, 100, 20) == (0, 102, 102) + assert hsl_to_rgb(180, 100, 30) == (0, 153, 153) + assert hsl_to_rgb(180, 100, 40) == (0, 204, 204) + assert hsl_to_rgb(180, 100, 50) == (0, 255, 255) + assert hsl_to_rgb(180, 100, 60) == (51, 255, 255) + assert hsl_to_rgb(180, 100, 70) == (102, 255, 255) + assert hsl_to_rgb(180, 100, 80) == (153, 255, 255) + assert hsl_to_rgb(180, 100, 90) == (204, 255, 255) + assert hsl_to_rgb(180, 100, 100) == (255, 255, 255) + + +def test_rgb_to_hsl_part_16(): + # assert rgb_to_hsl(0, 0, 0) == (180, 100, 0) + assert rgb_to_hsl(0, 51, 51) == (180, 100, 10) + assert rgb_to_hsl(0, 102, 102) == (180, 100, 20) + assert rgb_to_hsl(0, 153, 153) == (180, 100, 30) + assert rgb_to_hsl(0, 204, 204) == (180, 100, 40) + assert rgb_to_hsl(0, 255, 255) == (180, 100, 50) + assert rgb_to_hsl(51, 255, 255) == (180, 100, 60) + assert rgb_to_hsl(102, 255, 255) == (180, 100, 70) + assert rgb_to_hsl(153, 255, 255) == (180, 100, 80) + assert rgb_to_hsl(204, 255, 255) == (180, 100, 90) + # assert rgb_to_hsl(255, 255, 255) == (180, 100, 100) + + +def test_hsl_to_rgb_part_17(): + assert hsl_to_rgb(240, 100, 0) == (0, 0, 0) + assert hsl_to_rgb(240, 100, 10) == (0, 0, 51) + assert hsl_to_rgb(240, 100, 20) == (0, 0, 102) + assert hsl_to_rgb(240, 100, 30) == (0, 0, 153) + assert hsl_to_rgb(240, 100, 40) == (0, 0, 204) + assert hsl_to_rgb(240, 100, 50) == (0, 0, 255) + assert hsl_to_rgb(240, 100, 60) == (51, 51, 255) + assert hsl_to_rgb(240, 100, 70) == (102, 102, 255) + assert hsl_to_rgb(240, 100, 80) == (153, 153, 255) + assert hsl_to_rgb(240, 100, 90) == (204, 204, 255) + assert hsl_to_rgb(240, 100, 100) == (255, 255, 255) + + +def test_rgb_to_hsl_part_17(): + # assert rgb_to_hsl(0, 0, 0) == (240, 100, 0) + assert rgb_to_hsl(0, 0, 51) == (240, 100, 10) + assert rgb_to_hsl(0, 0, 102) == (240, 100, 20) + assert rgb_to_hsl(0, 0, 153) == (240, 100, 30) + assert rgb_to_hsl(0, 0, 204) == (240, 100, 40) + assert rgb_to_hsl(0, 0, 255) == (240, 100, 50) + assert rgb_to_hsl(51, 51, 255) == (240, 100, 60) + assert rgb_to_hsl(102, 102, 255) == (240, 100, 70) + assert rgb_to_hsl(153, 153, 255) == (240, 100, 80) + assert rgb_to_hsl(204, 204, 255) == (240, 100, 90) + # assert rgb_to_hsl(255, 255, 255) == (240, 100, 100) + + +def test_hsl_to_rgb_part_18(): + assert hsl_to_rgb(300, 100, 0) == (0, 0, 0) + assert hsl_to_rgb(300, 100, 10) == (51, 0, 51) + assert hsl_to_rgb(300, 100, 20) == (102, 0, 102) + assert hsl_to_rgb(300, 100, 30) == (153, 0, 153) + assert hsl_to_rgb(300, 100, 40) == (204, 0, 204) + assert hsl_to_rgb(300, 100, 50) == (255, 0, 255) + assert hsl_to_rgb(300, 100, 60) == (255, 51, 255) + assert hsl_to_rgb(300, 100, 70) == (255, 102, 255) + assert hsl_to_rgb(300, 100, 80) == (255, 153, 255) + assert hsl_to_rgb(300, 100, 90) == (255, 204, 255) + assert hsl_to_rgb(300, 100, 100) == (255, 255, 255) + + +def test_rgb_to_hsl_part_18(): + # assert rgb_to_hsl(0, 0, 0) == (300, 100, 0) + assert rgb_to_hsl(51, 0, 51) == (300, 100, 10) + assert rgb_to_hsl(102, 0, 102) == (300, 100, 20) + assert rgb_to_hsl(153, 0, 153) == (300, 100, 30) + assert rgb_to_hsl(204, 0, 204) == (300, 100, 40) + assert rgb_to_hsl(255, 0, 255) == (300, 100, 50) + assert rgb_to_hsl(255, 51, 255) == (300, 100, 60) + assert rgb_to_hsl(255, 102, 255) == (300, 100, 70) + assert rgb_to_hsl(255, 153, 255) == (300, 100, 80) + assert rgb_to_hsl(255, 204, 255) == (300, 100, 90) + # assert rgb_to_hsl(255, 255, 255) == (300, 100, 100) diff --git a/pygal/test/test_style.py b/pygal/test/test_style.py index 5048aee..73f0650 100644 --- a/pygal/test/test_style.py +++ b/pygal/test/test_style.py @@ -16,7 +16,7 @@ # # You should have received a copy of the GNU Lesser General Public License # along with pygal. If not, see . -from pygal.style import Style, darken, lighten +from pygal.style import Style def test_colors(): @@ -102,21 +102,3 @@ def test_colors(): fill: rgb(12, 231, 3); } ''' - - -def test_darken(): - assert darken('#800', 20) == '#220000' - assert darken('#ffffff', 10) == '#e6e6e6' - assert darken('#f3148a', 25) == '#810747' - assert darken('#121212', 1) == '#0f0f0f' - assert darken('#999999', 100) == '#000000' - assert darken('#1479ac', 8) == '#105f87' - - -def test_lighten(): - assert lighten('#800', 20) == '#ee0000' - assert lighten('#ffffff', 10) == '#ffffff' - assert lighten('#f3148a', 25) == '#f98dc6' - assert lighten('#121212', 1) == '#151515' - assert lighten('#999999', 100) == '#ffffff' - assert lighten('#1479ac', 8) == '#1893d1' diff --git a/pygal/test/test_util.py b/pygal/test/test_util.py index c301066..4051253 100644 --- a/pygal/test/test_util.py +++ b/pygal/test/test_util.py @@ -19,7 +19,7 @@ from pygal._compat import u from pygal.util import ( round_to_int, round_to_float, _swap_curly, template, humanize, - is_major, truncate, minify_css, rgb_to_hsl, hsl_to_rgb) + is_major, truncate, minify_css) from pytest import raises diff --git a/pygal/util.py b/pygal/util.py index 02ec6a2..0f82fa6 100644 --- a/pygal/util.py +++ b/pygal/util.py @@ -382,54 +382,3 @@ def split_title(title, width, title_fs): title = title[i:].strip() titles.append(title) return titles - - -def rgb_to_hsl(r, g, b): - r /= 255 - g /= 255 - b /= 255 - max_ = max((r, g, b)) - min_ = min((r, g, b)) - d = max_ - min_ - - if not d: - h = 0 - elif r is max_: - h = 60 * (g - b) / d - elif g is max_: - h = 60 * (b - r) / d + 120 - else: - h = 60 * (r - g) / d + 240 - - l = .5 * (max_ + min_) - if not d: - s = 0 - elif l < 0.5: - s = .5 * d / l - else: - s = .5 * d / (1 - l) - - return h % 360, s * 100, l * 100 - - -def hsl_to_rgb(h, s, l): - h /= 360 - s /= 100 - l /= 100 - - m2 = l * (s + 1) if l <= .5 else l + s - l * s - m1 = 2 * l - m2 - - def h_to_rgb(h): - h = h % 1 - if 6 * h < 1: - return m1 + 6 * h * (m2 - m1) - if 2 * h < 1: - return m2 - if 3 * h < 2: - return m1 + 6 * (2 / 3 - h) * (m2 - m1) - return m1 - r, g, b = map(lambda x: round(x * 255), - map(h_to_rgb, (h + 1 / 3, h, h - 1 / 3))) - - return r, g, b