Skip to content

Commit c004e49

Browse files
committed
Micro-optimize _to_rgba_no_colorcycle.
This patch speeds up conversions of `#rgba`-type formats by between 25% and 40% (while shortening the implementation), although real benefits should be limited because of caching in to_rgba.
1 parent 2f6589d commit c004e49

File tree

1 file changed

+20
-29
lines changed

1 file changed

+20
-29
lines changed

lib/matplotlib/colors.py

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -372,40 +372,31 @@ def _to_rgba_no_colorcycle(c, alpha=None):
372372
# This may turn c into a non-string, so we check again below.
373373
c = _colors_full_map[c]
374374
except KeyError:
375-
if len(orig_c) != 1:
375+
if len(c) != 1:
376376
try:
377377
c = _colors_full_map[c.lower()]
378378
except KeyError:
379379
pass
380380
if isinstance(c, str):
381-
# hex color in #rrggbb format.
382-
match = re.match(r"\A#[a-fA-F0-9]{6}\Z", c)
383-
if match:
384-
return (tuple(int(n, 16) / 255
385-
for n in [c[1:3], c[3:5], c[5:7]])
386-
+ (alpha if alpha is not None else 1.,))
387-
# hex color in #rgb format, shorthand for #rrggbb.
388-
match = re.match(r"\A#[a-fA-F0-9]{3}\Z", c)
389-
if match:
390-
return (tuple(int(n, 16) / 255
391-
for n in [c[1]*2, c[2]*2, c[3]*2])
392-
+ (alpha if alpha is not None else 1.,))
393-
# hex color with alpha in #rrggbbaa format.
394-
match = re.match(r"\A#[a-fA-F0-9]{8}\Z", c)
395-
if match:
396-
color = [int(n, 16) / 255
397-
for n in [c[1:3], c[3:5], c[5:7], c[7:9]]]
398-
if alpha is not None:
399-
color[-1] = alpha
400-
return tuple(color)
401-
# hex color with alpha in #rgba format, shorthand for #rrggbbaa.
402-
match = re.match(r"\A#[a-fA-F0-9]{4}\Z", c)
403-
if match:
404-
color = [int(n, 16) / 255
405-
for n in [c[1]*2, c[2]*2, c[3]*2, c[4]*2]]
406-
if alpha is not None:
407-
color[-1] = alpha
408-
return tuple(color)
381+
if re.fullmatch("#[a-fA-F0-9]+", c):
382+
if len(c) == 7: # #rrggbb hex format.
383+
return (*[n / 0xff for n in bytes.fromhex(c[1:])],
384+
alpha if alpha is not None else 1.)
385+
elif len(c) == 4: # #rgb hex format, shorthand for #rrggbb.
386+
return (*[int(n, 16) / 0xf for n in c[1:]],
387+
alpha if alpha is not None else 1.)
388+
elif len(c) == 9: # #rrggbbaa hex format.
389+
color = [n / 0xff for n in bytes.fromhex(c[1:])]
390+
if alpha is not None:
391+
color[-1] = alpha
392+
return tuple(color)
393+
elif len(c) == 5: # #rgba hex format, shorthand for #rrggbbaa.
394+
color = [int(n, 16) / 0xf for n in c[1:]]
395+
if alpha is not None:
396+
color[-1] = alpha
397+
return tuple(color)
398+
else:
399+
raise ValueError(f"Invalid hex color specifier: {orig_c!r}")
409400
# string gray.
410401
try:
411402
c = float(c)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy