Skip to content

Commit 5c45805

Browse files
committed
FILETYPES: Newer XFree86 rgb.txt files use the key Xorg instead of
XConsortium. Now we can recognize these files!
1 parent d9e0e1f commit 5c45805

1 file changed

Lines changed: 68 additions & 67 deletions

File tree

Tools/pynche/ColorDB.py

Lines changed: 68 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -39,42 +39,42 @@ class ColorDB:
3939
def __init__(self, fp):
4040
lineno = 2
4141
self.__name = fp.name
42-
# Maintain several dictionaries for indexing into the color database.
43-
# Note that while Tk supports RGB intensities of 4, 8, 12, or 16 bits,
44-
# for now we only support 8 bit intensities. At least on OpenWindows,
45-
# all intensities in the /usr/openwin/lib/rgb.txt file are 8-bit
46-
#
47-
# key is (red, green, blue) tuple, value is (name, [aliases])
48-
self.__byrgb = {}
49-
# key is name, value is (red, green, blue)
50-
self.__byname = {}
42+
# Maintain several dictionaries for indexing into the color database.
43+
# Note that while Tk supports RGB intensities of 4, 8, 12, or 16 bits,
44+
# for now we only support 8 bit intensities. At least on OpenWindows,
45+
# all intensities in the /usr/openwin/lib/rgb.txt file are 8-bit
46+
#
47+
# key is (red, green, blue) tuple, value is (name, [aliases])
48+
self.__byrgb = {}
49+
# key is name, value is (red, green, blue)
50+
self.__byname = {}
5151
# all unique names (non-aliases). built-on demand
5252
self.__allnames = None
53-
while 1:
54-
line = fp.readline()
55-
if not line:
56-
break
57-
# get this compiled regular expression from derived class
58-
mo = self._re.match(line)
59-
if not mo:
53+
while 1:
54+
line = fp.readline()
55+
if not line:
56+
break
57+
# get this compiled regular expression from derived class
58+
mo = self._re.match(line)
59+
if not mo:
6060
print >> sys.stderr, 'Error in', fp.name, ' line', lineno
61-
lineno += 1
62-
continue
63-
# extract the red, green, blue, and name
61+
lineno += 1
62+
continue
63+
# extract the red, green, blue, and name
6464
red, green, blue = self._extractrgb(mo)
6565
name = self._extractname(mo)
66-
keyname = name.lower()
67-
# BAW: for now the `name' is just the first named color with the
68-
# rgb values we find. Later, we might want to make the two word
69-
# version the `name', or the CapitalizedVersion, etc.
70-
key = (red, green, blue)
71-
foundname, aliases = self.__byrgb.get(key, (name, []))
72-
if foundname <> name and foundname not in aliases:
73-
aliases.append(name)
74-
self.__byrgb[key] = (foundname, aliases)
75-
# add to byname lookup
76-
self.__byname[keyname] = key
77-
lineno = lineno + 1
66+
keyname = name.lower()
67+
# BAW: for now the `name' is just the first named color with the
68+
# rgb values we find. Later, we might want to make the two word
69+
# version the `name', or the CapitalizedVersion, etc.
70+
key = (red, green, blue)
71+
foundname, aliases = self.__byrgb.get(key, (name, []))
72+
if foundname <> name and foundname not in aliases:
73+
aliases.append(name)
74+
self.__byrgb[key] = (foundname, aliases)
75+
# add to byname lookup
76+
self.__byname[keyname] = key
77+
lineno = lineno + 1
7878

7979
# override in derived classes
8080
def _extractrgb(self, mo):
@@ -88,36 +88,36 @@ def filename(self):
8888

8989
def find_byrgb(self, rgbtuple):
9090
"""Return name for rgbtuple"""
91-
try:
92-
return self.__byrgb[rgbtuple]
93-
except KeyError:
94-
raise BadColor(rgbtuple)
91+
try:
92+
return self.__byrgb[rgbtuple]
93+
except KeyError:
94+
raise BadColor(rgbtuple)
9595

9696
def find_byname(self, name):
9797
"""Return (red, green, blue) for name"""
98-
name = name.lower()
99-
try:
100-
return self.__byname[name]
101-
except KeyError:
102-
raise BadColor(name)
98+
name = name.lower()
99+
try:
100+
return self.__byname[name]
101+
except KeyError:
102+
raise BadColor(name)
103103

104104
def nearest(self, red, green, blue):
105105
"""Return the name of color nearest (red, green, blue)"""
106-
# BAW: should we use Voronoi diagrams, Delaunay triangulation, or
107-
# octree for speeding up the locating of nearest point? Exhaustive
108-
# search is inefficient, but seems fast enough.
109-
nearest = -1
110-
nearest_name = ''
111-
for name, aliases in self.__byrgb.values():
112-
r, g, b = self.__byname[name.lower()]
113-
rdelta = red - r
114-
gdelta = green - g
115-
bdelta = blue - b
116-
distance = rdelta * rdelta + gdelta * gdelta + bdelta * bdelta
117-
if nearest == -1 or distance < nearest:
118-
nearest = distance
119-
nearest_name = name
120-
return nearest_name
106+
# BAW: should we use Voronoi diagrams, Delaunay triangulation, or
107+
# octree for speeding up the locating of nearest point? Exhaustive
108+
# search is inefficient, but seems fast enough.
109+
nearest = -1
110+
nearest_name = ''
111+
for name, aliases in self.__byrgb.values():
112+
r, g, b = self.__byname[name.lower()]
113+
rdelta = red - r
114+
gdelta = green - g
115+
bdelta = blue - b
116+
distance = rdelta * rdelta + gdelta * gdelta + bdelta * bdelta
117+
if nearest == -1 or distance < nearest:
118+
nearest = distance
119+
nearest_name = name
120+
return nearest_name
121121

122122
def unique_names(self):
123123
# sorted
@@ -137,7 +137,7 @@ def aliases_of(self, red, green, blue):
137137
except KeyError:
138138
raise BadColor((red, green, blue))
139139
return [name] + aliases
140-
140+
141141

142142
class RGBColorDB(ColorDB):
143143
_re = re.compile(
@@ -172,6 +172,7 @@ def _extractname(self, mo):
172172
# the class to instantiate if a match is found
173173

174174
FILETYPES = [
175+
(re.compile('Xorg'), RGBColorDB),
175176
(re.compile('XConsortium'), RGBColorDB),
176177
(re.compile('HTML'), HTML40DB),
177178
(re.compile('lightlink'), LightlinkDB),
@@ -216,11 +217,11 @@ def rrggbb_to_triplet(color):
216217
if rgbtuple is None:
217218
if color[0] <> '#':
218219
raise BadColor(color)
219-
red = color[1:3]
220-
green = color[3:5]
221-
blue = color[5:7]
220+
red = color[1:3]
221+
green = color[3:5]
222+
blue = color[5:7]
222223
rgbtuple = int(red, 16), int(green, 16), int(blue, 16)
223-
_namedict[color] = rgbtuple
224+
_namedict[color] = rgbtuple
224225
return rgbtuple
225226

226227

@@ -230,8 +231,8 @@ def triplet_to_rrggbb(rgbtuple):
230231
global _tripdict
231232
hexname = _tripdict.get(rgbtuple)
232233
if hexname is None:
233-
hexname = '#%02x%02x%02x' % rgbtuple
234-
_tripdict[rgbtuple] = hexname
234+
hexname = '#%02x%02x%02x' % rgbtuple
235+
_tripdict[rgbtuple] = hexname
235236
return hexname
236237

237238

@@ -253,17 +254,17 @@ def triplet_to_brightness(rgbtuple):
253254
if __name__ == '__main__':
254255
colordb = get_colordb('/usr/openwin/lib/rgb.txt')
255256
if not colordb:
256-
print 'No parseable color database found'
257-
sys.exit(1)
257+
print 'No parseable color database found'
258+
sys.exit(1)
258259
# on my system, this color matches exactly
259260
target = 'navy'
260261
red, green, blue = rgbtuple = colordb.find_byname(target)
261262
print target, ':', red, green, blue, triplet_to_rrggbb(rgbtuple)
262263
name, aliases = colordb.find_byrgb(rgbtuple)
263264
print 'name:', name, 'aliases:', COMMASPACE.join(aliases)
264-
r, g, b = (1, 1, 128) # nearest to navy
265-
r, g, b = (145, 238, 144) # nearest to lightgreen
266-
r, g, b = (255, 251, 250) # snow
265+
r, g, b = (1, 1, 128) # nearest to navy
266+
r, g, b = (145, 238, 144) # nearest to lightgreen
267+
r, g, b = (255, 251, 250) # snow
267268
print 'finding nearest to', target, '...'
268269
import time
269270
t0 = time.time()

0 commit comments

Comments
 (0)