File: color.py

package info (click to toggle)
python-vispy 0.6.6-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 21,240 kB
  • sloc: python: 57,407; javascript: 6,810; makefile: 63; sh: 5
file content (219 lines) | stat: -rw-r--r-- 8,659 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# -*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
# Copyright (c) 2014, Nicolas P. Rougier
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
# -----------------------------------------------------------------------------

from itertools import product
from string import hexdigits


# See <http://www.w3.org/TR/SVG/types.html#ColorKeywords>
_keyword_colors = {
    "aliceblue":            (240, 248, 255),
    "antiquewhite":         (250, 235, 215),
    "aqua":                 (0, 255, 255),
    "aquamarine":           (127, 255, 212),
    "azure":                (240, 255, 255),
    "beige":                (245, 245, 220),
    "bisque":               (255, 228, 196),
    "black":                (0,   0,   0),
    "blanchedalmond":       (255, 235, 205),
    "blue":                 (0,   0, 255),
    "blueviolet":           (138,  43, 226),
    "brown":                (165,  42,  42),
    "burlywood":            (222, 184, 135),
    "cadetblue":            (95, 158, 160),
    "chartreuse":           (127, 255,   0),
    "chocolate":            (210, 105,  30),
    "coral":                (255, 127,  80),
    "cornflowerblue":       (100, 149, 237),
    "cornsilk":             (255, 248, 220),
    "crimson":              (220,  20,  60),
    "cyan":                 (0, 255, 255),
    "darkblue":             (0,   0, 139),
    "darkcyan":             (0, 139, 139),
    "darkgoldenrod":        (184, 134,  11),
    "darkgray":             (169, 169, 169),
    "darkgreen":            (0, 100,   0),
    "darkgrey":             (169, 169, 169),
    "darkkhaki":            (189, 183, 107),
    "darkmagenta":          (139,   0, 139),
    "darkolivegreen":       (85, 107,  47),
    "darkorange":           (255, 140,   0),
    "darkorchid":           (153,  50, 204),
    "darkred":              (139,   0,   0),
    "darksalmon":           (233, 150, 122),
    "darkseagreen":         (143, 188, 143),
    "darkslateblue":        (72,  61, 139),
    "darkslategray":        (47,  79,  79),
    "darkslategrey":        (47,  79,  79),
    "darkturquoise":        (0, 206, 209),
    "darkviolet":           (148,   0, 211),
    "deeppink":             (255,  20, 147),
    "deepskyblue":          (0, 191, 255),
    "dimgray":              (105, 105, 105),
    "dimgrey":              (105, 105, 105),
    "dodgerblue":           (30, 144, 255),
    "firebrick":            (178,  34,  34),
    "floralwhite":          (255, 250, 240),
    "forestgreen":          (34, 139,  34),
    "fuchsia":              (255,   0, 255),
    "gainsboro":            (220, 220, 220),
    "ghostwhite":           (248, 248, 255),
    "gold":                 (255, 215,   0),
    "goldenrod":            (218, 165,  32),
    "gray":                 (128, 128, 128),
    "grey":                 (128, 128, 128),
    "green":                (0, 128,   0),
    "greenyellow":          (173, 255,  47),
    "honeydew":             (240, 255, 240),
    "hotpink":              (255, 105, 180),
    "indianred":            (205,  92,  92),
    "indigo":               (75,   0, 130),
    "ivory":                (255, 255, 240),
    "khaki":                (240, 230, 140),
    "lavender":             (230, 230, 250),
    "lavenderblush":        (255, 240, 245),
    "lawngreen":            (124, 252,   0),
    "lemonchiffon":         (255, 250, 205),
    "lightblue":            (173, 216, 230),
    "lightcoral":           (240, 128, 128),
    "lightcyan":            (224, 255, 255),
    "lightgoldenrodyellow": (250, 250, 210),
    "lightgray":            (211, 211, 211),
    "lightgreen":           (144, 238, 144),
    "lightgrey":            (211, 211, 211),
    "lightpink":            (255, 182, 193),
    "lightsalmon":          (255, 160, 122),
    "lightseagreen":        (32, 178, 170),
    "lightskyblue":         (135, 206, 250),
    "lightslategray":       (119, 136, 153),
    "lightslategrey":       (119, 136, 153),
    "lightsteelblue":       (176, 196, 222),
    "lightyellow":          (255, 255, 224),
    "lime":                 (0, 255,   0),
    "limegreen":            (50, 205,  50),
    "linen":                (250, 240, 230),
    "magenta":              (255,   0, 255),
    "maroon":               (128,   0,   0),
    "mediumaquamarine":     (102, 205, 170),
    "mediumblue":           (0,   0, 205),
    "mediumorchid":         (186,  85, 211),
    "mediumpurple":         (147, 112, 219),
    "mediumseagreen":       (60, 179, 113),
    "mediumslateblue":      (123, 104, 238),
    "mediumspringgreen":    (0, 250, 154),
    "mediumturquoise":      (72, 209, 204),
    "mediumvioletred":      (199,  21, 133),
    "midnightblue":         (25,  25, 112),
    "mintcream":            (245, 255, 250),
    "mistyrose":            (255, 228, 225),
    "moccasin":             (255, 228, 181),
    "navajowhite":          (255, 222, 173),
    "navy":                 (0,   0, 128),
    "oldlace":              (253, 245, 230),
    "olive":                (128, 128,   0),
    "olivedrab":            (107, 142,  35),
    "orange":               (255, 165,   0),
    "orangered":            (255,  69,   0),
    "orchid":               (218, 112, 214),
    "palegoldenrod":        (238, 232, 170),
    "palegreen":            (152, 251, 152),
    "paleturquoise":        (175, 238, 238),
    "palevioletred":        (219, 112, 147),
    "papayawhip":           (255, 239, 213),
    "peachpuff":            (255, 218, 185),
    "peru":                 (205, 133,  63),
    "pink":                 (255, 192, 203),
    "plum":                 (221, 160, 221),
    "powderblue":           (176, 224, 230),
    "purple":               (128,   0, 128),
    "red":                  (255,   0,   0),
    "rosybrown":            (188, 143, 143),
    "royalblue":            (65, 105, 225),
    "saddlebrown":          (139,  69,  19),
    "salmon":               (250, 128, 114),
    "sandybrown":           (244, 164,  96),
    "seagreen":             (46, 139,  87),
    "seashell":             (255, 245, 238),
    "sienna":               (160,  82,  45),
    "silver":               (192, 192, 192),
    "skyblue":              (135, 206, 235),
    "slateblue":            (106,  90, 205),
    "slategray":            (112, 128, 144),
    "slategrey":            (112, 128, 144),
    "snow":                 (255, 250, 250),
    "springgreen":          (0, 255, 127),
    "steelblue":            (70, 130, 180),
    "tan":                  (210, 180, 140),
    "teal":                 (0, 128, 128),
    "thistle":              (216, 191, 216),
    "tomato":               (255,  99,  71),
    "turquoise":            (64, 224, 208),
    "violet":               (238, 130, 238),
    "wheat":                (245, 222, 179),
    "white":                (255, 255, 255),
    "whitesmoke":           (245, 245, 245),
    "yellow":               (255, 255,   0),
    "yellowgreen":          (154, 205,  50)}


_HEXDEC = {}
for x, y in product(hexdigits, repeat=2):
    v = x + y
    _HEXDEC[v] = int(v, 16)
    

def _rgb(triplet):
    return _HEXDEC[triplet[0:2]], _HEXDEC[triplet[2:4]], _HEXDEC[triplet[4:6]]


class Color(object):

    def __init__(self, content):

        color = content.strip()
        if color.startswith("#"):
            rgb = color[1:]
            if len(rgb) == 3:
                r, g, b = tuple(ord((c + c).decode('hex')) for c in rgb)
            else:
                # r,g,b = tuple(ord(c) for c in rgb.decode('hex'))
                r, g, b = tuple(c for c in _rgb(rgb))
        elif color.startswith("rgb("):
            rgb = color[4:-1]
            r, g, b = [value.strip() for value in rgb.split(',')]
            if r.endswith("%"):
                r = 255 * int(r[:-1]) // 100
            else:
                r = int(r)
            if g.endswith("%"):
                g = 255 * int(g[:-1]) // 100
            else:
                g = int(r)
            if b.endswith("%"):
                b = 255 * int(b[:-1]) // 100
            else:
                b = int(r)
        elif color in _keyword_colors:
            r, g, b = _keyword_colors[color]
        else:
            # text = "Unknown color (%s)" % color
            r, g, b = 0, 0, 0
        self._rgb = r / 255., g / 255., b / 255.

    @property
    def rgb(self):
        r, g, b = self._rgb
        return r, g, b

    @property
    def rgba(self):
        r, g, b = self._rgb
        return r, g, b, 1

    def __repr__(self):
        r, g, b = self._rgb
        r, g, b = int(r * 255), int(g * 255), int(b * 255)
        return "#%02x%02x%02x" % (r, g, b)