Cache conversions from triplets to rrggbb's and vice versa.  Wasteful
on space, but improves performance.  Also use map to calculate
triplet_to_pmwrgb().
diff --git a/Tools/pynche/ColorDB.py b/Tools/pynche/ColorDB.py
index f9ba27e..4e4045a 100644
--- a/Tools/pynche/ColorDB.py
+++ b/Tools/pynche/ColorDB.py
@@ -17,6 +17,7 @@
 import string
 import re
 from types import *
+import operator
 
 class BadColor(Exception):
     pass
@@ -143,17 +144,21 @@
 
 
 
+_namedict = {}
 def rrggbb_to_triplet(color):
     """Converts a #rrggbb color to the tuple (red, green, blue)."""
-    if color[0] <> '#':
-	raise BadColor(color)
-
-    red = color[1:3]
-    green = color[3:5]
-    blue = color[5:7]
-    return tuple(map(lambda v: string.atoi(v, 16), (red, green, blue)))
+    rgbtuple = _namedict.get(color)
+    if rgbtuple is None:
+	assert color[0] == '#'
+	red = color[1:3]
+	green = color[3:5]
+	blue = color[5:7]
+	rgbtuple = tuple(map(lambda v: string.atoi(v, 16), (red, green, blue)))
+	_namedict[color] = rgbtuple
+    return rgbtuple
 
 
+_tripdict = {}
 def triplet_to_rrggbb(rgbtuple):
     """Converts a (red, green, blue) tuple to #rrggbb."""
     def hexify(v):
@@ -161,12 +166,16 @@
 	if len(hexstr) < 2:
 	    hexstr = '0' + hexstr
 	return hexstr
-    return '#%s%s%s' % tuple(map(hexify, rgbtuple))
+    hexname = _tripdict.get(rgbtuple)
+    if hexname is None:
+	hexname = '#%s%s%s' % tuple(map(hexify, rgbtuple))
+	_tripdict[rgbtuple] = hexname
+    return hexname
 
 
-def triplet_to_pmwrgb(rgbtuple, MAX=256.0):
-    r, g, b = rgbtuple
-    return r/MAX, g/MAX, b/MAX
+_maxtuple = (256.0,) * 3
+def triplet_to_pmwrgb(rgbtuple):
+    return map(operator.__div__, rgbtuple, _maxtuple)