5
|
1
|
|
2 class RGBA(object):
|
|
3 """Four channel color representation.
|
|
4
|
|
5 RGBA colors are floating point color representations with color channel
|
|
6 values between (0..1). Colors may be initialized from 3 or 4 floating
|
|
7 point numbers or a hex string::
|
|
8
|
|
9 RGBA(1.0, 1.0, 1.0) # Alpha defaults to 1.0
|
|
10 RGBA(1.0, 1.0, 0, 0.5)
|
|
11 RGBA("#333")
|
|
12 RGBA("#7F7F7F")
|
|
13
|
|
14 Individual color channels can be accessed by attribute name, or the
|
|
15 color object can be treated as a sequence of 4 floats.
|
|
16 """
|
|
17
|
|
18 def __init__(self, r_or_colorstr, g=None, b=None, a=None):
|
|
19 if isinstance(r_or_colorstr, str):
|
|
20 assert g is b is a is None, "Ambiguous color arguments"
|
|
21 self.r, self.g, self.b, self.a = self._parse_colorstr(r_or_colorstr)
|
|
22 elif g is b is a is None:
|
|
23 try:
|
|
24 self.r, self.g, self.b, self.a = r_or_colorstr
|
|
25 except ValueError:
|
|
26 self.r, self.g, self.b = r_or_colorstr
|
|
27 self.a = 1.0
|
|
28 else:
|
|
29 self.r = r_or_colorstr
|
|
30 self.g = g
|
|
31 self.b = b
|
|
32 self.a = a
|
|
33 if self.a is None:
|
|
34 self.a = 1.0
|
|
35
|
|
36 def _parse_colorstr(self, colorstr):
|
|
37 length = len(colorstr)
|
|
38 if not colorstr.startswith("#") or length not in (4, 5, 7, 9):
|
|
39 raise ValueError("Invalid color string: " + colorstr)
|
|
40 if length <= 5:
|
|
41 parsed = [int(c*2, 16) / 255.0 for c in colorstr[1:]]
|
|
42 else:
|
|
43 parsed = [int(colorstr[i:i+2], 16) / 255.0 for i in range(1, length, 2)]
|
|
44 if len(parsed) == 3:
|
|
45 parsed.append(1.0)
|
|
46 return parsed
|
|
47
|
|
48 def __len__(self):
|
|
49 return 4
|
|
50
|
|
51 def __getitem__(self, item):
|
|
52 return (self.r, self.g, self.b, self.a)[item]
|
|
53
|
|
54 def __iter__(self):
|
|
55 return iter((self.r, self.g, self.b, self.a))
|
|
56
|
|
57 def __eq__(self, other):
|
|
58 return tuple(self) == tuple(other)
|
|
59
|
|
60 def __repr__(self):
|
|
61 return "%s(%.2f, %.2f, %.2f, %.2f)" % (self.__class__.__name__,
|
|
62 self.r, self.g, self.b, self.a)
|
|
63
|
|
64
|