Milán Major

netscape-revival

1 branch
Code

lib/xp/xp_rgb.c

/* -*- Mode: C; tab-width: 4 -*-
   xp_rgb.c --- parsing color names to RGB triplets.
   Copyright © 1995 Netscape Communications Corporation, all rights reserved.
   Created: John Giannandrea <jg@netscape.com>, 28-Sep-95
 */

#include "xp_rgb.h"


static struct {
	uint8 r;
	uint8 g;
	uint8 b;
	char *name;
} xp_rgb_table[] = {
		{240, 248, 255,  "aliceblue" },
		{250, 235, 215,  "antiquewhite" },
		{  0, 255, 255,  "aqua" },
		{127, 255, 212,  "aquamarine" },
		{240, 255, 255,  "azure" },
		{245, 245, 220,  "beige" },
		{255, 228, 196,  "bisque" },
		{  0,   0,   0,  "black" },
		{255, 235, 205,  "blanchedalmond" },
		{  0,   0, 255,  "blue" },
		{138,  43, 226,  "blueviolet" },
		{165,  42,  42,  "brown" },
		{222, 184, 135,  "burlywood" },
		{ 95, 158, 160,  "cadetblue" },
		{127, 255,   0,  "chartreuse" },
		{210, 105,  30,  "chocolate" },
		{255, 127,  80,  "coral" },
		{100, 149, 237,  "cornflowerblue" },
		{255, 248, 220,  "cornsilk" },
		{220,  20,  60,  "crimson" },
		{  0, 255, 255,  "cyan" },
		{  0,   0, 139,  "darkblue" },
		{  0, 139, 139,  "darkcyan" },
		{184, 134,  11,  "darkgoldenrod" },
		{169, 169, 169,  "darkgray" },
		{  0, 100,   0,  "darkgreen" },
		{189, 183, 107,  "darkkhaki" },
		{139,   0, 139,  "darkmagenta" },
		{ 85, 107,  47,  "darkolivegreen" },
		{255, 140,   0,  "darkorange" },
		{153,  50, 204,  "darkorchid" },
		{139,   0,   0,  "darkred" },
		{233, 150, 122,  "darksalmon" },
		{143, 188, 143,  "darkseagreen" },
		{ 72,  61, 139,  "darkslateblue" },
		{ 47,  79,  79,  "darkslategray" },
		{  0, 206, 209,  "darkturquoise" },
		{148,   0, 211,  "darkviolet" },
		{255,  20, 147,  "deeppink" },
		{  0, 191, 255,  "deepskyblue" },
		{105, 105, 105,  "dimgray" },
		{ 30, 144, 255,  "dodgerblue" },
		{178,  34,  34,  "firebrick" },
		{255, 250, 240,  "floralwhite" },
		{ 34, 139,  34,  "forestgreen" },
		{255,   0, 255,  "fuchsia" },
		{220, 220, 220,  "gainsboro" },
		{248, 248, 255,  "ghostwhite" },
		{255, 215,   0,  "gold" },
		{218, 165,  32,  "goldenrod" },
		{128, 128, 128,  "gray" },
		{  0, 128,   0,  "green" },
		{173, 255,  47,  "greenyellow" },
		{240, 255, 240,  "honeydew" },
		{255, 105, 180,  "hotpink" },
		{205,  92,  92,  "indianred" },
		{ 75,   0, 130,  "indigo" },
		{255, 255, 240,  "ivory" },
		{240, 230, 140,  "khaki" },
		{230, 230, 250,  "lavender" },
		{255, 240, 245,  "lavenderblush" },
		{124, 252,   0,  "lawngreen" },
		{255, 250, 205,  "lemonchiffon" },
		{173, 216, 230,  "lightblue" },
		{240, 128, 128,  "lightcoral" },
		{224, 255, 255,  "lightcyan" },
		{250, 250, 210,  "lightgoldenrodyellow" },
		{144, 238, 144,  "lightgreen" },
		{211, 211, 211,  "lightgrey" },
		{255, 182, 193,  "lightpink" },
		{255, 160, 122,  "lightsalmon" },
		{ 32, 178, 170,  "lightseagreen" },
		{135, 206, 250,  "lightskyblue" },
		{119, 136, 153,  "lightslategray" },
		{176, 196, 222,  "lightsteelblue" },
		{255, 255, 224,  "lightyellow" },
		{  0, 255,   0,  "lime" },
		{ 50, 205,  50,  "limegreen" },
		{250, 240, 230,  "linen" },
		{255,   0, 255,  "magenta" },
		{128,   0,   0,  "maroon" },
		{102, 205, 170,  "mediumaquamarine" },
		{  0,   0, 205,  "mediumblue" },
		{186,  85, 211,  "mediumorchid" },
		{147, 112, 219,  "mediumpurple" },
		{ 60, 179, 113,  "mediumseagreen" },
		{123, 104, 238,  "mediumslateblue" },
		{  0, 250, 154,  "mediumspringgreen" },
		{ 72, 209, 204,  "mediumturquoise" },
		{199,  21, 133,  "mediumvioletred" },
		{ 25,  25, 112,  "midnightblue" },
		{245, 255, 250,  "mintcream" },
		{255, 228, 225,  "mistyrose" },
		{255, 228, 181,  "moccasin" },
		{255, 222, 173,  "navajowhite" },
		{  0,   0, 128,  "navy" },
		{253, 245, 230,  "oldlace" },
		{128, 128,   0,  "olive" },
		{107, 142,  35,  "olivedrab" },
		{255, 165,   0,  "orange" },
		{255,  69,   0,  "orangered" },
		{218, 112, 214,  "orchid" },
		{238, 232, 170,  "palegoldenrod" },
		{152, 251, 152,  "palegreen" },
		{175, 238, 238,  "paleturquoise" },
		{219, 112, 147,  "palevioletred" },
		{255, 239, 213,  "papayawhip" },
		{255, 218, 185,  "peachpuff" },
		{205, 133,  63,  "peru" },
		{255, 192, 203,  "pink" },
		{221, 160, 221,  "plum" },
		{176, 224, 230,  "powderblue" },
		{128,   0, 128,  "purple" },
		{255,   0,   0,  "red" },
		{188, 143, 143,  "rosybrown" },
		{ 65, 105, 225,  "royalblue" },
		{139,  69,  19,  "saddlebrown" },
		{250, 128, 114,  "salmon" },
		{244, 164,  96,  "sandybrown" },
		{ 46, 139,  87,  "seagreen" },
		{255, 245, 238,  "seashell" },
		{160,  82,  45,  "sienna" },
		{192, 192, 192,  "silver" },
		{135, 206, 235,  "skyblue" },
		{106,  90, 205,  "slateblue" },
		{112, 128, 144,  "slategray" },
		{255, 250, 250,  "snow" },
		{  0, 255, 127,  "springgreen" },
		{ 70, 130, 180,  "steelblue" },
		{210, 180, 140,  "tan" },
		{  0, 128, 128,  "teal" },
		{216, 191, 216,  "thistle" },
		{255,  99,  71,  "tomato" },
		{ 64, 224, 208,  "turquoise" },
		{238, 130, 238,  "violet" },
		{245, 222, 179,  "wheat" },
		{255, 255, 255,  "white" },
		{245, 245, 245,  "whitesmoke" },
		{255, 255,   0,  "yellow" },
		{154, 205,  50,  "yellowgreen" },
		{  0,   0,   0,  0 }
};

static int32 xp_rgb_tablesize = 0;


intn XP_ColorNameToRGB(char *name, uint8 *r, uint8 *g, uint8 *b)
{
	int32 low=0, mid=0, high, comp;

	if (name == NULL)
	{
		return 1;
	}

	if(!xp_rgb_tablesize)
	{
		int32 i;
		for(i=0; xp_rgb_table[i].name; i++)
			;
		xp_rgb_tablesize = i;
	}
	high = xp_rgb_tablesize;

	while((high-low)>1)
	{
		mid = low + (high-low)/2;
		if(!(comp = XP_STRCASECMP(name, xp_rgb_table[mid].name)))
		{
			*r = xp_rgb_table[mid].r;
			*g = xp_rgb_table[mid].g;
			*b = xp_rgb_table[mid].b;
			return 0;
		}
		if(comp>0)
			low = mid;
		else
			high = mid;
	}
	return 1;
}