1 // ==========================================================
2 // X11 and SVG Color name lookup
3 //
4 // Design and implementation by
5 // - Karl-Heinz Bussian (khbussian@moss.de)
6 //
7 // This file is part of FreeImage 3
8 //
9 // COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
10 // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
11 // THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
12 // OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
13 // CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
14 // THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
15 // SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
16 // PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
17 // THIS DISCLAIMER.
18 //
19 // Use at your own risk!
20 //
21 // ==========================================================
22 
23 #include "FreeImage.h"
24 #include "Utilities.h"
25 
26 // RGB color names  ---------------------------------------------------------
27 
28 typedef struct tagNamedColor {
29 	const char *name;	//! color name
30 	BYTE  r;			//! red value
31 	BYTE  g;			//! green value
32 	BYTE  b;			//! blue value
33 } NamedColor;
34 
35 // --------------------------------------------------------------------------
36 
37 /**
38 Helper function : perform a binary search on a color array
39 @param name Color name
40 @param color_array Color array
41 @param n Length of the color array
42 @return Returns the color index in the array if successful, returns -1 otherwise
43 */
44 static int
binsearch(const char * name,const NamedColor * color_array,int n)45 binsearch(const char *name, const NamedColor *color_array, int n) {
46 	int cond, low, mid, high;
47 
48     low = 0;
49     high = n - 1;
50     while (low <= high) {
51 		mid = (low + high) / 2;
52 		if ((cond = strcmp(name, color_array[mid].name)) < 0) {
53 			high = mid - 1;
54 		} else if (cond > 0) {
55 			low = mid + 1;
56 		} else {
57 			return mid;
58 		}
59 	}
60 	return -1;
61 }
62 
63 /**
64 Perform a binary search on a color array
65 @param szColor Color name
66 @param color_array Color array
67 @param ncolors Length of the color array
68 @return Returns the color index in the array if successful, returns -1 otherwise
69 */
70 static int
FreeImage_LookupNamedColor(const char * szColor,const NamedColor * color_array,int ncolors)71 FreeImage_LookupNamedColor(const char *szColor, const NamedColor *color_array, int ncolors) {
72 	int i;
73     char color[64];
74 
75     // make lower case name, squezze white space
76 
77     for (i = 0; szColor[i] && i < sizeof(color) - 1; i++) {
78 		if (isspace(szColor[i])) {
79             continue;
80 		}
81 		if (isupper(szColor[i])) {
82 			color[i] = (char)tolower(szColor[i]);
83 		} else {
84             color[i] = szColor[i];
85 		}
86     }
87     color[i] = 0;
88 
89     return binsearch(color, color_array, ncolors);
90 }
91 
92 // ==========================================================
93 // X11 Color name lookup
94 
95 /**
96  This big list of color names was formed from the file: /usr/X11R6/lib/X11/rgb.txt
97  found on a standard Linux installation.
98 */
99 
100 static NamedColor X11ColorMap[] = {
101     { "aliceblue",            240, 248, 255 },
102     { "antiquewhite",         250, 235, 215 },
103     { "antiquewhite1",        255, 239, 219 },
104     { "antiquewhite2",        238, 223, 204 },
105     { "antiquewhite3",        205, 192, 176 },
106     { "antiquewhite4",        139, 131, 120 },
107     { "aquamarine",           127, 255, 212 },
108     { "aquamarine1",          127, 255, 212 },
109     { "aquamarine2",          118, 238, 198 },
110     { "aquamarine3",          102, 205, 170 },
111     { "aquamarine4",           69, 139, 116 },
112     { "azure",                240, 255, 255 },
113     { "azure1",               240, 255, 255 },
114     { "azure2",               224, 238, 238 },
115     { "azure3",               193, 205, 205 },
116     { "azure4",               131, 139, 139 },
117     { "beige",                245, 245, 220 },
118     { "bisque",               255, 228, 196 },
119     { "bisque1",              255, 228, 196 },
120     { "bisque2",              238, 213, 183 },
121     { "bisque3",              205, 183, 158 },
122     { "bisque4",              139, 125, 107 },
123     { "black",                  0,   0,   0 },
124     { "blanchedalmond",       255, 235, 205 },
125     { "blue",                   0,   0, 255 },
126     { "blue1",                  0,   0, 255 },
127     { "blue2",                  0,   0, 238 },
128     { "blue3",                  0,   0, 205 },
129     { "blue4",                  0,   0, 139 },
130     { "blueviolet",           138,  43, 226 },
131     { "brown",                165,  42,  42 },
132     { "brown1",               255,  64,  64 },
133     { "brown2",               238,  59,  59 },
134     { "brown3",               205,  51,  51 },
135     { "brown4",               139,  35,  35 },
136     { "burlywood",            222, 184, 135 },
137     { "burlywood1",           255, 211, 155 },
138     { "burlywood2",           238, 197, 145 },
139     { "burlywood3",           205, 170, 125 },
140     { "burlywood4",           139, 115,  85 },
141     { "cadetblue",             95, 158, 160 },
142     { "cadetblue1",           152, 245, 255 },
143     { "cadetblue2",           142, 229, 238 },
144     { "cadetblue3",           122, 197, 205 },
145     { "cadetblue4",            83, 134, 139 },
146     { "chartreuse",           127, 255,   0 },
147     { "chartreuse1",          127, 255,   0 },
148     { "chartreuse2",          118, 238,   0 },
149     { "chartreuse3",          102, 205,   0 },
150     { "chartreuse4",           69, 139,   0 },
151     { "chocolate",            210, 105,  30 },
152     { "chocolate1",           255, 127,  36 },
153     { "chocolate2",           238, 118,  33 },
154     { "chocolate3",           205, 102,  29 },
155     { "chocolate4",           139,  69,  19 },
156     { "coral",                255, 127,  80 },
157     { "coral1",               255, 114,  86 },
158     { "coral2",               238, 106,  80 },
159     { "coral3",               205,  91,  69 },
160     { "coral4",               139,  62,  47 },
161     { "cornflowerblue",       100, 149, 237 },
162     { "cornsilk",             255, 248, 220 },
163     { "cornsilk1",            255, 248, 220 },
164     { "cornsilk2",            238, 232, 205 },
165     { "cornsilk3",            205, 200, 177 },
166     { "cornsilk4",            139, 136, 120 },
167     { "cyan",                   0, 255, 255 },
168     { "cyan1",                  0, 255, 255 },
169     { "cyan2",                  0, 238, 238 },
170     { "cyan3",                  0, 205, 205 },
171     { "cyan4",                  0, 139, 139 },
172     { "darkblue",               0,   0, 139 },
173     { "darkcyan",               0, 139, 139 },
174     { "darkgoldenrod",        184, 134,  11 },
175     { "darkgoldenrod1",       255, 185,  15 },
176     { "darkgoldenrod2",       238, 173,  14 },
177     { "darkgoldenrod3",       205, 149,  12 },
178     { "darkgoldenrod4",       139, 101,   8 },
179     { "darkgreen",              0, 100,   0 },
180     { "darkkhaki",            189, 183, 107 },
181     { "darkmagenta",          139,   0, 139 },
182     { "darkolivegreen",        85, 107,  47 },
183     { "darkolivegreen1",      202, 255, 112 },
184     { "darkolivegreen2",      188, 238, 104 },
185     { "darkolivegreen3",      162, 205,  90 },
186     { "darkolivegreen4",      110, 139,  61 },
187     { "darkorange",           255, 140,   0 },
188     { "darkorange1",          255, 127,   0 },
189     { "darkorange2",          238, 118,   0 },
190     { "darkorange3",          205, 102,   0 },
191     { "darkorange4",          139,  69,   0 },
192     { "darkorchid",           153,  50, 204 },
193     { "darkorchid1",          191,  62, 255 },
194     { "darkorchid2",          178,  58, 238 },
195     { "darkorchid3",          154,  50, 205 },
196     { "darkorchid4",          104,  34, 139 },
197     { "darkred",              139,   0,   0 },
198     { "darksalmon",           233, 150, 122 },
199     { "darkseagreen",         143, 188, 143 },
200     { "darkseagreen1",        193, 255, 193 },
201     { "darkseagreen2",        180, 238, 180 },
202     { "darkseagreen3",        155, 205, 155 },
203     { "darkseagreen4",        105, 139, 105 },
204     { "darkslateblue",         72,  61, 139 },
205     { "darkslategray",         47,  79,  79 },
206     { "darkslategray1",       151, 255, 255 },
207     { "darkslategray2",       141, 238, 238 },
208     { "darkslategray3",       121, 205, 205 },
209     { "darkslategray4",        82, 139, 139 },
210     { "darkslategrey",         47,  79,  79 },
211     { "darkturquoise",          0, 206, 209 },
212     { "darkviolet",           148,   0, 211 },
213     { "deeppink",             255,  20, 147 },
214     { "deeppink1",            255,  20, 147 },
215     { "deeppink2",            238,  18, 137 },
216     { "deeppink3",            205,  16, 118 },
217     { "deeppink4",            139,  10,  80 },
218     { "deepskyblue",            0, 191, 255 },
219     { "deepskyblue1",           0, 191, 255 },
220     { "deepskyblue2",           0, 178, 238 },
221     { "deepskyblue3",           0, 154, 205 },
222     { "deepskyblue4",           0, 104, 139 },
223     { "dimgray",              105, 105, 105 },
224     { "dimgrey",              105, 105, 105 },
225     { "dodgerblue",            30, 144, 255 },
226     { "dodgerblue1",           30, 144, 255 },
227     { "dodgerblue2",           28, 134, 238 },
228     { "dodgerblue3",           24, 116, 205 },
229     { "dodgerblue4",           16,  78, 139 },
230     { "firebrick",            178,  34,  34 },
231     { "firebrick1",           255,  48,  48 },
232     { "firebrick2",           238,  44,  44 },
233     { "firebrick3",           205,  38,  38 },
234     { "firebrick4",           139,  26,  26 },
235     { "floralwhite",          255, 250, 240 },
236     { "forestgreen",          176,  48,  96 },
237     { "gainsboro",            220, 220, 220 },
238     { "ghostwhite",           248, 248, 255 },
239     { "gold",                 255, 215,   0 },
240     { "gold1",                255, 215,   0 },
241     { "gold2",                238, 201,   0 },
242     { "gold3",                205, 173,   0 },
243     { "gold4",                139, 117,   0 },
244     { "goldenrod",            218, 165,  32 },
245     { "goldenrod1",           255, 193,  37 },
246     { "goldenrod2",           238, 180,  34 },
247     { "goldenrod3",           205, 155,  29 },
248     { "goldenrod4",           139, 105,  20 },
249     { "gray",                 190, 190, 190 },
250     { "green",                  0, 255,   0 },
251     { "green1",                 0, 255,   0 },
252     { "green2",                 0, 238,   0 },
253     { "green3",                 0, 205,   0 },
254     { "green4",                 0, 139,   0 },
255     { "greenyellow",          173, 255,  47 },
256     { "grey",                 190, 190, 190 },
257     { "honeydew",             240, 255, 240 },
258     { "honeydew1",            240, 255, 240 },
259     { "honeydew2",            224, 238, 224 },
260     { "honeydew3",            193, 205, 193 },
261     { "honeydew4",            131, 139, 131 },
262     { "hotpink",              255, 105, 180 },
263     { "hotpink1",             255, 110, 180 },
264     { "hotpink2",             238, 106, 167 },
265     { "hotpink3",             205,  96, 144 },
266     { "hotpink4",             139,  58,  98 },
267     { "indianred",            205,  92,  92 },
268     { "indianred1",           255, 106, 106 },
269     { "indianred2",           238,  99,  99 },
270     { "indianred3",           205,  85,  85 },
271     { "indianred4",           139,  58,  58 },
272     { "ivory",                255, 255, 240 },
273     { "ivory1",               255, 255, 240 },
274     { "ivory2",               238, 238, 224 },
275     { "ivory3",               205, 205, 193 },
276     { "ivory4",               139, 139, 131 },
277     { "khaki",                240, 230, 140 },
278     { "khaki1",               255, 246, 143 },
279     { "khaki2",               238, 230, 133 },
280     { "khaki3",               205, 198, 115 },
281     { "khaki4",               139, 134,  78 },
282     { "lavender",             230, 230, 250 },
283     { "lavenderblush",        255, 240, 245 },
284     { "lavenderblush1",       255, 240, 245 },
285     { "lavenderblush2",       238, 224, 229 },
286     { "lavenderblush3",       205, 193, 197 },
287     { "lavenderblush4",       139, 131, 134 },
288     { "lawngreen",            124, 252,   0 },
289     { "lemonchiffon",         255, 250, 205 },
290     { "lemonchiffon1",        255, 250, 205 },
291     { "lemonchiffon2",        238, 233, 191 },
292     { "lemonchiffon3",        205, 201, 165 },
293     { "lemonchiffon4",        139, 137, 112 },
294     { "lightblue",            173, 216, 230 },
295     { "lightblue1",           191, 239, 255 },
296     { "lightblue2",           178, 223, 238 },
297     { "lightblue3",           154, 192, 205 },
298     { "lightblue4",           104, 131, 139 },
299     { "lightcoral",           240, 128, 128 },
300     { "lightcyan",            224, 255, 255 },
301     { "lightcyan1",           224, 255, 255 },
302     { "lightcyan2",           209, 238, 238 },
303     { "lightcyan3",           180, 205, 205 },
304     { "lightcyan4",           122, 139, 139 },
305     { "lightgoldenrod",       238, 221, 130 },
306     { "lightgoldenrod1",      255, 236, 139 },
307     { "lightgoldenrod2",      238, 220, 130 },
308     { "lightgoldenrod3",      205, 190, 112 },
309     { "lightgoldenrod4",      139, 129,  76 },
310     { "lightgoldenrodyellow", 250, 250, 210 },
311     { "lightgray",            211, 211, 211 },
312     { "lightgreen",           144, 238, 144 },
313     { "lightgrey",            211, 211, 211 },
314     { "lightpink",            255, 182, 193 },
315     { "lightpink1",           255, 174, 185 },
316     { "lightpink2",           238, 162, 173 },
317     { "lightpink3",           205, 140, 149 },
318     { "lightpink4",           139,  95, 101 },
319     { "lightsalmon",          255, 160, 122 },
320     { "lightsalmon1",         255, 160, 122 },
321     { "lightsalmon2",         238, 149, 114 },
322     { "lightsalmon3",         205, 129,  98 },
323     { "lightsalmon4",         139,  87,  66 },
324     { "lightseagreen",         32, 178, 170 },
325     { "lightskyblue",         135, 206, 250 },
326     { "lightskyblue1",        176, 226, 255 },
327     { "lightskyblue2",        164, 211, 238 },
328     { "lightskyblue3",        141, 182, 205 },
329     { "lightskyblue4",         96, 123, 139 },
330     { "lightslateblue",       132, 112, 255 },
331     { "lightslategray",       119, 136, 153 },
332     { "lightslategrey",       119, 136, 153 },
333     { "lightsteelblue",       176, 196, 222 },
334     { "lightsteelblue1",      202, 225, 255 },
335     { "lightsteelblue2",      188, 210, 238 },
336     { "lightsteelblue3",      162, 181, 205 },
337     { "lightsteelblue4",      110, 123, 139 },
338     { "lightyellow",          255, 255, 224 },
339     { "lightyellow1",         255, 255, 224 },
340     { "lightyellow2",         238, 238, 209 },
341     { "lightyellow3",         205, 205, 180 },
342     { "lightyellow4",         139, 139, 122 },
343     { "limegreen",             50, 205,  50 },
344     { "linen",                250, 240, 230 },
345     { "magenta",              255,   0, 255 },
346     { "magenta1",             255,   0, 255 },
347     { "magenta2",             238,   0, 238 },
348     { "magenta3",             205,   0, 205 },
349     { "magenta4",             139,   0, 139 },
350     { "maroon",                 0, 255, 255 },
351     { "maroon1",              255,  52, 179 },
352     { "maroon2",              238,  48, 167 },
353     { "maroon3",              205,  41, 144 },
354     { "maroon4",              139,  28,  98 },
355     { "mediumaquamarine",     102, 205, 170 },
356     { "mediumblue",             0,   0, 205 },
357     { "mediumorchid",         186,  85, 211 },
358     { "mediumorchid1",        224, 102, 255 },
359     { "mediumorchid2",        209,  95, 238 },
360     { "mediumorchid3",        180,  82, 205 },
361     { "mediumorchid4",        122,  55, 139 },
362     { "mediumpurple",         147, 112, 219 },
363     { "mediumpurple1",        171, 130, 255 },
364     { "mediumpurple2",        159, 121, 238 },
365     { "mediumpurple3",        137, 104, 205 },
366     { "mediumpurple4",         93,  71, 139 },
367     { "mediumseagreen",        60, 179, 113 },
368     { "mediumslateblue",      123, 104, 238 },
369     { "mediumspringgreen",      0, 250, 154 },
370     { "mediumturquoise",       72, 209, 204 },
371     { "mediumvioletred",      199,  21, 133 },
372     { "midnightblue",          25,  25, 112 },
373     { "mintcream",            245, 255, 250 },
374     { "mistyrose",            255, 228, 225 },
375     { "mistyrose1",           255, 228, 225 },
376     { "mistyrose2",           238, 213, 210 },
377     { "mistyrose3",           205, 183, 181 },
378     { "mistyrose4",           139, 125, 123 },
379     { "moccasin",             255, 228, 181 },
380     { "navajowhite",          255, 222, 173 },
381     { "navajowhite1",         255, 222, 173 },
382     { "navajowhite2",         238, 207, 161 },
383     { "navajowhite3",         205, 179, 139 },
384     { "navajowhite4",         139, 121,  94 },
385     { "navy",                   0,   0, 128 },
386     { "navyblue",               0,   0, 128 },
387     { "oldlace",              253, 245, 230 },
388     { "olivedrab",            107, 142,  35 },
389     { "olivedrab1",           192, 255,  62 },
390     { "olivedrab2",           179, 238,  58 },
391     { "olivedrab3",           154, 205,  50 },
392     { "olivedrab4",           105, 139,  34 },
393     { "orange",               255, 165,   0 },
394     { "orange1",              255, 165,   0 },
395     { "orange2",              238, 154,   0 },
396     { "orange3",              205, 133,   0 },
397     { "orange4",              139,  90,   0 },
398     { "orangered",            255,  69,   0 },
399     { "orangered1",           255,  69,   0 },
400     { "orangered2",           238,  64,   0 },
401     { "orangered3",           205,  55,   0 },
402     { "orangered4",           139,  37,   0 },
403     { "orchid",               218, 112, 214 },
404     { "orchid1",              255, 131, 250 },
405     { "orchid2",              238, 122, 233 },
406     { "orchid3",              205, 105, 201 },
407     { "orchid4",              139,  71, 137 },
408     { "palegoldenrod",        238, 232, 170 },
409     { "palegreen",            152, 251, 152 },
410     { "palegreen1",           154, 255, 154 },
411     { "palegreen2",           144, 238, 144 },
412     { "palegreen3",           124, 205, 124 },
413     { "palegreen4",            84, 139,  84 },
414     { "paleturquoise",        175, 238, 238 },
415     { "paleturquoise1",       187, 255, 255 },
416     { "paleturquoise2",       174, 238, 238 },
417     { "paleturquoise3",       150, 205, 205 },
418     { "paleturquoise4",       102, 139, 139 },
419     { "palevioletred",        219, 112, 147 },
420     { "palevioletred1",       255, 130, 171 },
421     { "palevioletred2",       238, 121, 159 },
422     { "palevioletred3",       205, 104, 137 },
423     { "palevioletred4",       139,  71,  93 },
424     { "papayawhip",           255, 239, 213 },
425     { "peachpuff",            255, 218, 185 },
426     { "peachpuff1",           255, 218, 185 },
427     { "peachpuff2",           238, 203, 173 },
428     { "peachpuff3",           205, 175, 149 },
429     { "peachpuff4",           139, 119, 101 },
430     { "peru",                 205, 133,  63 },
431     { "pink",                 255, 192, 203 },
432     { "pink1",                255, 181, 197 },
433     { "pink2",                238, 169, 184 },
434     { "pink3",                205, 145, 158 },
435     { "pink4",                139,  99, 108 },
436     { "plum",                 221, 160, 221 },
437     { "plum1",                255, 187, 255 },
438     { "plum2",                238, 174, 238 },
439     { "plum3",                205, 150, 205 },
440     { "plum4",                139, 102, 139 },
441     { "powderblue",           176, 224, 230 },
442     { "purple",               160,  32, 240 },
443     { "purple1",              155,  48, 255 },
444     { "purple2",              145,  44, 238 },
445     { "purple3",              125,  38, 205 },
446     { "purple4",               85,  26, 139 },
447     { "red",                  255,   0,   0 },
448     { "red1",                 255,   0,   0 },
449     { "red2",                 238,   0,   0 },
450     { "red3",                 205,   0,   0 },
451     { "red4",                 139,   0,   0 },
452     { "rosybrown",            188, 143, 143 },
453     { "rosybrown1",           255, 193, 193 },
454     { "rosybrown2",           238, 180, 180 },
455     { "rosybrown3",           205, 155, 155 },
456     { "rosybrown4",           139, 105, 105 },
457     { "royalblue",             65, 105, 225 },
458     { "royalblue1",            72, 118, 255 },
459     { "royalblue2",            67, 110, 238 },
460     { "royalblue3",            58,  95, 205 },
461     { "royalblue4",            39,  64, 139 },
462     { "saddlebrown",          139,  69,  19 },
463     { "salmon",               250, 128, 114 },
464     { "salmon1",              255, 140, 105 },
465     { "salmon2",              238, 130,  98 },
466     { "salmon3",              205, 112,  84 },
467     { "salmon4",              139,  76,  57 },
468     { "sandybrown",           244, 164,  96 },
469     { "seagreen",              46, 139,  87 },
470     { "seagreen1",             84, 255, 159 },
471     { "seagreen2",             78, 238, 148 },
472     { "seagreen3",             67, 205, 128 },
473     { "seagreen4",             46, 139,  87 },
474     { "seashell",             255, 245, 238 },
475     { "seashell1",            255, 245, 238 },
476     { "seashell2",            238, 229, 222 },
477     { "seashell3",            205, 197, 191 },
478     { "seashell4",            139, 134, 130 },
479     { "sienna",               160,  82,  45 },
480     { "sienna1",              255, 130,  71 },
481     { "sienna2",              238, 121,  66 },
482     { "sienna3",              205, 104,  57 },
483     { "sienna4",              139,  71,  38 },
484     { "skyblue",              135, 206, 235 },
485     { "skyblue1",             135, 206, 255 },
486     { "skyblue2",             126, 192, 238 },
487     { "skyblue3",             108, 166, 205 },
488     { "skyblue4",              74, 112, 139 },
489     { "slateblue",            106,  90, 205 },
490     { "slateblue1",           131, 111, 255 },
491     { "slateblue2",           122, 103, 238 },
492     { "slateblue3",           105,  89, 205 },
493     { "slateblue4",            71,  60, 139 },
494     { "slategray",            112, 128, 144 },
495     { "slategray1",           198, 226, 255 },
496     { "slategray2",           185, 211, 238 },
497     { "slategray3",           159, 182, 205 },
498     { "slategray4",           108, 123, 139 },
499     { "slategrey",            112, 128, 144 },
500     { "snow",                 255, 250, 250 },
501     { "snow1",                255, 250, 250 },
502     { "snow2",                238, 233, 233 },
503     { "snow3",                205, 201, 201 },
504     { "snow4",                139, 137, 137 },
505     { "springgreen",            0, 255, 127 },
506     { "springgreen1",           0, 255, 127 },
507     { "springgreen2",           0, 238, 118 },
508     { "springgreen3",           0, 205, 102 },
509     { "springgreen4",           0, 139,  69 },
510     { "steelblue",             70, 130, 180 },
511     { "steelblue1",            99, 184, 255 },
512     { "steelblue2",            92, 172, 238 },
513     { "steelblue3",            79, 148, 205 },
514     { "steelblue4",            54, 100, 139 },
515     { "tan",                  210, 180, 140 },
516     { "tan1",                 255, 165,  79 },
517     { "tan2",                 238, 154,  73 },
518     { "tan3",                 205, 133,  63 },
519     { "tan4",                 139,  90,  43 },
520     { "thistle",              216, 191, 216 },
521     { "thistle1",             255, 225, 255 },
522     { "thistle2",             238, 210, 238 },
523     { "thistle3",             205, 181, 205 },
524     { "thistle4",             139, 123, 139 },
525     { "tomato",               255,  99,  71 },
526     { "tomato1",              255,  99,  71 },
527     { "tomato2",              238,  92,  66 },
528     { "tomato3",              205,  79,  57 },
529     { "tomato4",              139,  54,  38 },
530     { "turquoise",             64, 224, 208 },
531     { "turquoise1",             0, 245, 255 },
532     { "turquoise2",             0, 229, 238 },
533     { "turquoise3",             0, 197, 205 },
534     { "turquoise4",             0, 134, 139 },
535     { "violet",               238, 130, 238 },
536     { "violetred",            208,  32, 144 },
537     { "violetred1",           255,  62, 150 },
538     { "violetred2",           238,  58, 140 },
539     { "violetred3",           205,  50, 120 },
540     { "violetred4",           139,  34,  82 },
541     { "wheat",                245, 222, 179 },
542     { "wheat1",               255, 231, 186 },
543     { "wheat2",               238, 216, 174 },
544     { "wheat3",               205, 186, 150 },
545     { "wheat4",               139, 126, 102 },
546     { "white",                255, 255, 255 },
547     { "whitesmoke",           245, 245, 245 },
548     { "yellow",               255, 255,   0 },
549     { "yellow1",              255, 255,   0 },
550     { "yellow2",              238, 238,   0 },
551     { "yellow3",              205, 205,   0 },
552     { "yellow4",              139, 139,   0 },
553     { "yellowgreen",          154, 205,  50 }
554 };
555 
556 
557 BOOL DLL_CALLCONV
FreeImage_LookupX11Color(const char * szColor,BYTE * nRed,BYTE * nGreen,BYTE * nBlue)558 FreeImage_LookupX11Color(const char *szColor, BYTE *nRed, BYTE *nGreen, BYTE *nBlue) {
559     int i;
560 
561     // lookup color
562     i = FreeImage_LookupNamedColor(szColor, X11ColorMap, sizeof(X11ColorMap)/sizeof(X11ColorMap[0]));
563     if (i >= 0) {
564         *nRed   = X11ColorMap[i].r;
565         *nGreen = X11ColorMap[i].g;
566         *nBlue  = X11ColorMap[i].b;
567         return TRUE;
568     }
569 
570     // not found, try for grey color with attached percent value
571     if ( (szColor[0] == 'g' || szColor[0] == 'G') &&
572          (szColor[1] == 'r' || szColor[1] == 'R') &&
573          (szColor[2] == 'e' || szColor[2] == 'E' || szColor[2] == 'a' || szColor[2] == 'A' ) &&
574          (szColor[3] == 'y' || szColor[3] == 'Y' ) )  {
575 
576         // grey<num>, or gray<num>, num 1...100
577         i = strtol(szColor+4, NULL, 10);
578         *nRed   = (BYTE)(255.0/100.0 * i);
579         *nGreen = *nRed;
580         *nBlue  = *nRed;
581 
582         return TRUE;
583     }
584 
585     // not found at all
586     *nRed   = 0;
587     *nGreen = 0;
588     *nBlue  = 0;
589 
590     return FALSE;
591 }
592 
593 // ==========================================================
594 // SVG Color name lookup
595 
596 /**
597  These are the colors defined in the SVG standard (I haven't checked
598  the final recommendation for changes)
599 */
600 static NamedColor SVGColorMap[] = {
601 	{ "aliceblue",                  240, 248, 255 },
602 	{ "antiquewhite",               250, 235, 215 },
603 	{ "aqua",                         0, 255, 255 },
604 	{ "aquamarine",                 127, 255, 212 },
605 	{ "azure",                      240, 255, 255 },
606 	{ "beige",                      245, 245, 220 },
607 	{ "bisque",                     255, 228, 196 },
608 	{ "black",                        0,   0,   0 },
609 	{ "blanchedalmond",             255, 235, 205 },
610 	{ "blue",                         0,   0, 255 },
611 	{ "blueviolet",                 138,  43, 226 },
612 	{ "brown",                      165,  42,  42 },
613 	{ "burlywood",                  222, 184, 135 },
614 	{ "cadetblue",                   95, 158, 160 },
615 	{ "chartreuse",                 127, 255,   0 },
616 	{ "chocolate",                  210, 105,  30 },
617 	{ "coral",                      255, 127,  80 },
618 	{ "cornflowerblue",             100, 149, 237 },
619 	{ "cornsilk",                   255, 248, 220 },
620 	{ "crimson",                    220,  20,  60 },
621 	{ "cyan",                         0, 255, 255 },
622 	{ "darkblue",                     0,   0, 139 },
623 	{ "darkcyan",                     0, 139, 139 },
624 	{ "darkgoldenrod",              184, 134,  11 },
625 	{ "darkgray",                   169, 169, 169 },
626 	{ "darkgreen",                    0, 100,   0 },
627 	{ "darkgrey",                   169, 169, 169 },
628 	{ "darkkhaki",                  189, 183, 107 },
629 	{ "darkmagenta",                139,   0, 139 },
630 	{ "darkolivegreen",              85, 107,  47 },
631 	{ "darkorange",                 255, 140,   0 },
632 	{ "darkorchid",                 153,  50, 204 },
633 	{ "darkred",                    139,   0,   0 },
634 	{ "darksalmon",                 233, 150, 122 },
635 	{ "darkseagreen",               143, 188, 143 },
636 	{ "darkslateblue",               72,  61, 139 },
637 	{ "darkslategray",               47,  79,  79 },
638 	{ "darkslategrey",               47,  79,  79 },
639 	{ "darkturquoise",                0, 206, 209 },
640 	{ "darkviolet",                 148,   0, 211 },
641 	{ "deeppink",                   255,  20, 147 },
642 	{ "deepskyblue",                  0, 191, 255 },
643 	{ "dimgray",                    105, 105, 105 },
644 	{ "dimgrey",                    105, 105, 105 },
645 	{ "dodgerblue",                  30, 144, 255 },
646 	{ "firebrick",                  178,  34,  34 },
647 	{ "floralwhite",                255, 250, 240 },
648 	{ "forestgreen",                 34, 139,  34 },
649 	{ "fuchsia",                    255,   0, 255 },
650 	{ "gainsboro",                  220, 220, 220 },
651 	{ "ghostwhite",                 248, 248, 255 },
652 	{ "gold",                       255, 215,   0 },
653 	{ "goldenrod",                  218, 165,  32 },
654 	{ "gray",                       128, 128, 128 },
655 	{ "green",                        0, 128,   0 },
656 	{ "greenyellow",                173, 255,  47 },
657 	{ "grey",                       128, 128, 128 },
658 	{ "honeydew",                   240, 255, 240 },
659 	{ "hotpink",                    255, 105, 180 },
660 	{ "indianred",                  205,  92,  92 },
661 	{ "indigo",                      75,   0, 130 },
662 	{ "ivory",                      255, 255, 240 },
663 	{ "khaki",                      240, 230, 140 },
664 	{ "lavender",                   230, 230, 250 },
665 	{ "lavenderblush",              255, 240, 245 },
666 	{ "lawngreen",                  124, 252,   0 },
667 	{ "lemonchiffon",               255, 250, 205 },
668 	{ "lightblue",                  173, 216, 230 },
669 	{ "lightcoral",                 240, 128, 128 },
670 	{ "lightcyan",                  224, 255, 255 },
671 	{ "lightgoldenrodyellow",       250, 250, 210 },
672 	{ "lightgray",                  211, 211, 211 },
673 	{ "lightgreen",                 144, 238, 144 },
674 	{ "lightgrey",                  211, 211, 211 },
675 	{ "lightpink",                  255, 182, 193 },
676 	{ "lightsalmon",                255, 160, 122 },
677 	{ "lightseagreen",               32, 178, 170 },
678 	{ "lightskyblue",               135, 206, 250 },
679 	{ "lightslategray",             119, 136, 153 },
680 	{ "lightslategrey",             119, 136, 153 },
681 	{ "lightsteelblue",             176, 196, 222 },
682 	{ "lightyellow",                255, 255, 224 },
683 	{ "lime",                         0, 255,   0 },
684 	{ "limegreen",                   50, 205,  50 },
685 	{ "linen",                      250, 240, 230 },
686 	{ "magenta",                    255,   0, 255 },
687 	{ "maroon",                     128,   0,   0 },
688 	{ "mediumaquamarine",           102, 205, 170 },
689 	{ "mediumblue",                   0,   0, 205 },
690 	{ "mediumorchid",               186,  85, 211 },
691 	{ "mediumpurple",               147, 112, 219 },
692 	{ "mediumseagreen",              60, 179, 113 },
693 	{ "mediumslateblue",            123, 104, 238 },
694 	{ "mediumspringgreen",            0, 250, 154 },
695 	{ "mediumturquoise",             72, 209, 204 },
696 	{ "mediumvioletred",            199,  21, 133 },
697 	{ "midnightblue",                25,  25, 112 },
698 	{ "mintcream",                  245, 255, 250 },
699 	{ "mistyrose",                  255, 228, 225 },
700 	{ "moccasin",                   255, 228, 181 },
701 	{ "navajowhite",                255, 222, 173 },
702 	{ "navy",                         0,   0, 128 },
703 	{ "oldlace",                    253, 245, 230 },
704 	{ "olive",                      128, 128,   0 },
705 	{ "olivedrab",                  107, 142,  35 },
706 	{ "orange",                     255, 165,   0 },
707 	{ "orangered",                  255,  69,   0 },
708 	{ "orchid",                     218, 112, 214 },
709 	{ "palegoldenrod",              238, 232, 170 },
710 	{ "palegreen",                  152, 251, 152 },
711 	{ "paleturquoise",              175, 238, 238 },
712 	{ "palevioletred",              219, 112, 147 },
713 	{ "papayawhip",                 255, 239, 213 },
714 	{ "peachpuff",                  255, 218, 185 },
715 	{ "peru",                       205, 133,  63 },
716 	{ "pink",                       255, 192, 203 },
717 	{ "plum",                       221, 160, 221 },
718 	{ "powderblue",                 176, 224, 230 },
719 	{ "purple",                     128,   0, 128 },
720 	{ "red",                        255,   0,   0 },
721 	{ "rosybrown",                  188, 143, 143 },
722 	{ "royalblue",                   65, 105, 225 },
723 	{ "saddlebrown",                139,  69,  19 },
724 	{ "salmon",                     250, 128, 114 },
725 	{ "sandybrown",                 244, 164,  96 },
726 	{ "seagreen",                    46, 139,  87 },
727 	{ "seashell",                   255, 245, 238 },
728 	{ "sienna",                     160,  82,  45 },
729 	{ "silver",                     192, 192, 192 },
730 	{ "skyblue",                    135, 206, 235 },
731 	{ "slateblue",                  106,  90, 205 },
732 	{ "slategray",                  112, 128, 144 },
733 	{ "slategrey",                  112, 128, 144 },
734 	{ "snow",                       255, 250, 250 },
735 	{ "springgreen",                  0, 255, 127 },
736 	{ "steelblue",                   70, 130, 180 },
737 	{ "tan",                        210, 180, 140 },
738 	{ "teal",                         0, 128, 128 },
739 	{ "thistle",                    216, 191, 216 },
740 	{ "tomato",                     255,  99,  71 },
741 	{ "turquoise",                   64, 224, 208 },
742 	{ "violet",                     238, 130, 238 },
743 	{ "wheat",                      245, 222, 179 },
744 	{ "white",                      255, 255, 255 },
745 	{ "whitesmoke",                 245, 245, 245 },
746 	{ "yellow",                     255, 255,   0 },
747 	{ "yellowgreen",                154, 205,  50 }
748 };
749 
750 
751 BOOL DLL_CALLCONV
FreeImage_LookupSVGColor(const char * szColor,BYTE * nRed,BYTE * nGreen,BYTE * nBlue)752 FreeImage_LookupSVGColor(const char *szColor, BYTE *nRed, BYTE *nGreen, BYTE *nBlue) {
753     int i;
754 
755     // lookup color
756     i = FreeImage_LookupNamedColor(szColor, SVGColorMap, sizeof(SVGColorMap)/sizeof(SVGColorMap[0]));
757     if (i >= 0) {
758         *nRed   = SVGColorMap[i].r;
759         *nGreen = SVGColorMap[i].g;
760         *nBlue  = SVGColorMap[i].b;
761         return TRUE;
762     }
763 
764     // not found, try for grey color with attached percent value
765     if ( (szColor[0] == 'g' || szColor[0] == 'G') &&
766          (szColor[1] == 'r' || szColor[1] == 'R') &&
767          (szColor[2] == 'e' || szColor[2] == 'E' || szColor[2] == 'a' || szColor[2] == 'A' ) &&
768          (szColor[3] == 'y' || szColor[3] == 'Y' ) )  {
769 
770         // grey<num>, or gray<num>, num 1...100
771         i = strtol(szColor+4, NULL, 10);
772         *nRed   = (BYTE)(255.0/100.0 * i);
773         *nGreen = *nRed;
774         *nBlue  = *nRed;
775         return TRUE;
776     }
777 
778     // not found at all
779     *nRed   = 0;
780     *nGreen = 0;
781     *nBlue  = 0;
782 
783     return FALSE;
784 }
785 
786