#include "html.h"
#include "web_color.h"
#include
const litehtml::web_color litehtml::web_color::transparent = web_color(0, 0, 0, 0);
const litehtml::web_color litehtml::web_color::black = web_color(0, 0, 0, 255);
const litehtml::web_color litehtml::web_color::white = web_color(255, 255, 255, 255);
litehtml::background_gradient litehtml::background_gradient::transparent;
litehtml::def_color litehtml::g_def_colors[] =
{
{"transparent","rgba(0, 0, 0, 0)"},
{"AliceBlue","#F0F8FF"},
{"AntiqueWhite","#FAEBD7"},
{"Aqua","#00FFFF"},
{"Aquamarine","#7FFFD4"},
{"Azure","#F0FFFF"},
{"Beige","#F5F5DC"},
{"Bisque","#FFE4C4"},
{"Black","#000000"},
{"BlanchedAlmond","#FFEBCD"},
{"Blue","#0000FF"},
{"BlueViolet","#8A2BE2"},
{"Brown","#A52A2A"},
{"BurlyWood","#DEB887"},
{"CadetBlue","#5F9EA0"},
{"Chartreuse","#7FFF00"},
{"Chocolate","#D2691E"},
{"Coral","#FF7F50"},
{"CornflowerBlue","#6495ED"},
{"Cornsilk","#FFF8DC"},
{"Crimson","#DC143C"},
{"Cyan","#00FFFF"},
{"DarkBlue","#00008B"},
{"DarkCyan","#008B8B"},
{"DarkGoldenRod","#B8860B"},
{"DarkGray","#A9A9A9"},
{"DarkGrey","#A9A9A9"},
{"DarkGreen","#006400"},
{"DarkKhaki","#BDB76B"},
{"DarkMagenta","#8B008B"},
{"DarkOliveGreen","#556B2F"},
{"Darkorange","#FF8C00"},
{"DarkOrchid","#9932CC"},
{"DarkRed","#8B0000"},
{"DarkSalmon","#E9967A"},
{"DarkSeaGreen","#8FBC8F"},
{"DarkSlateBlue","#483D8B"},
{"DarkSlateGray","#2F4F4F"},
{"DarkSlateGrey","#2F4F4F"},
{"DarkTurquoise","#00CED1"},
{"DarkViolet","#9400D3"},
{"DeepPink","#FF1493"},
{"DeepSkyBlue","#00BFFF"},
{"DimGray","#696969"},
{"DimGrey","#696969"},
{"DodgerBlue","#1E90FF"},
{"FireBrick","#B22222"},
{"FloralWhite","#FFFAF0"},
{"ForestGreen","#228B22"},
{"Fuchsia","#FF00FF"},
{"Gainsboro","#DCDCDC"},
{"GhostWhite","#F8F8FF"},
{"Gold","#FFD700"},
{"GoldenRod","#DAA520"},
{"Gray","#808080"},
{"Grey","#808080"},
{"Green","#008000"},
{"GreenYellow","#ADFF2F"},
{"HoneyDew","#F0FFF0"},
{"HotPink","#FF69B4"},
{"Ivory","#FFFFF0"},
{"Khaki","#F0E68C"},
{"Lavender","#E6E6FA"},
{"LavenderBlush","#FFF0F5"},
{"LawnGreen","#7CFC00"},
{"LemonChiffon","#FFFACD"},
{"LightBlue","#ADD8E6"},
{"LightCoral","#F08080"},
{"LightCyan","#E0FFFF"},
{"LightGoldenRodYellow","#FAFAD2"},
{"LightGray","#D3D3D3"},
{"LightGrey","#D3D3D3"},
{"LightGreen","#90EE90"},
{"LightPink","#FFB6C1"},
{"LightSalmon","#FFA07A"},
{"LightSeaGreen","#20B2AA"},
{"LightSkyBlue","#87CEFA"},
{"LightSlateGray","#778899"},
{"LightSlateGrey","#778899"},
{"LightSteelBlue","#B0C4DE"},
{"LightYellow","#FFFFE0"},
{"Lime","#00FF00"},
{"LimeGreen","#32CD32"},
{"Linen","#FAF0E6"},
{"Magenta","#FF00FF"},
{"Maroon","#800000"},
{"MediumAquaMarine","#66CDAA"},
{"MediumBlue","#0000CD"},
{"MediumOrchid","#BA55D3"},
{"MediumPurple","#9370D8"},
{"MediumSeaGreen","#3CB371"},
{"MediumSlateBlue","#7B68EE"},
{"MediumSpringGreen","#00FA9A"},
{"MediumTurquoise","#48D1CC"},
{"MediumVioletRed","#C71585"},
{"MidnightBlue","#191970"},
{"MintCream","#F5FFFA"},
{"MistyRose","#FFE4E1"},
{"Moccasin","#FFE4B5"},
{"NavajoWhite","#FFDEAD"},
{"Navy","#000080"},
{"OldLace","#FDF5E6"},
{"Olive","#808000"},
{"OliveDrab","#6B8E23"},
{"Orange","#FFA500"},
{"OrangeRed","#FF4500"},
{"Orchid","#DA70D6"},
{"PaleGoldenRod","#EEE8AA"},
{"PaleGreen","#98FB98"},
{"PaleTurquoise","#AFEEEE"},
{"PaleVioletRed","#D87093"},
{"PapayaWhip","#FFEFD5"},
{"PeachPuff","#FFDAB9"},
{"Peru","#CD853F"},
{"Pink","#FFC0CB"},
{"Plum","#DDA0DD"},
{"PowderBlue","#B0E0E6"},
{"Purple","#800080"},
{"Red","#FF0000"},
{"RosyBrown","#BC8F8F"},
{"RoyalBlue","#4169E1"},
{"SaddleBrown","#8B4513"},
{"Salmon","#FA8072"},
{"SandyBrown","#F4A460"},
{"SeaGreen","#2E8B57"},
{"SeaShell","#FFF5EE"},
{"Sienna","#A0522D"},
{"Silver","#C0C0C0"},
{"SkyBlue","#87CEEB"},
{"SlateBlue","#6A5ACD"},
{"SlateGray","#708090"},
{"SlateGrey","#708090"},
{"Snow","#FFFAFA"},
{"SpringGreen","#00FF7F"},
{"SteelBlue","#4682B4"},
{"Tan","#D2B48C"},
{"Teal","#008080"},
{"Thistle","#D8BFD8"},
{"Tomato","#FF6347"},
{"Turquoise","#40E0D0"},
{"Violet","#EE82EE"},
{"Wheat","#F5DEB3"},
{"White","#FFFFFF"},
{"WhiteSmoke","#F5F5F5"},
{"Yellow","#FFFF00"},
{"YellowGreen","#9ACD32"},
{nullptr,nullptr}
};
litehtml::web_color litehtml::web_color::from_string(const string& _str, document_container* callback)
{
auto str = _str.c_str();
if(!str[0])
{
return web_color(0, 0, 0);
}
if(str[0] == '#')
{
string red;
string green;
string blue;
if(strlen(str + 1) == 3)
{
red += str[1];
red += str[1];
green += str[2];
green += str[2];
blue += str[3];
blue += str[3];
} else if(strlen(str + 1) == 6)
{
red += str[1];
red += str[2];
green += str[3];
green += str[4];
blue += str[5];
blue += str[6];
}
char* sss = nullptr;
web_color clr;
clr.red = (byte) strtol(red.c_str(), &sss, 16);
clr.green = (byte) strtol(green.c_str(), &sss, 16);
clr.blue = (byte) strtol(blue.c_str(), &sss, 16);
return clr;
} else if(!strncmp(str, "rgb", 3))
{
string s = str;
string::size_type pos = s.find_first_of('(');
if(pos != string::npos)
{
s.erase(s.begin(), s.begin() + pos + 1);
}
pos = s.find_last_of(')');
if(pos != string::npos)
{
s.erase(s.begin() + pos, s.end());
}
std::vector tokens;
split_string(s, tokens, ", \t");
web_color clr;
if(tokens.size() >= 1) clr.red = (byte) atoi(tokens[0].c_str());
if(tokens.size() >= 2) clr.green = (byte) atoi(tokens[1].c_str());
if(tokens.size() >= 3) clr.blue = (byte) atoi(tokens[2].c_str());
if(tokens.size() >= 4) clr.alpha = (byte) (t_strtod(tokens[3].c_str(), nullptr) * 255.0);
return clr;
} else
{
string rgb = resolve_name(str, callback);
if(!rgb.empty())
{
return from_string(rgb.c_str(), callback);
}
}
return web_color(0, 0, 0);
}
litehtml::string litehtml::web_color::resolve_name(const string& name, document_container* callback)
{
for(int i=0; g_def_colors[i].name; i++)
{
if(!t_strcasecmp(name.c_str(), g_def_colors[i].name))
{
return g_def_colors[i].rgb;
}
}
if (callback)
{
string clr = callback->resolve_color(name);
return clr;
}
return "";
}
bool litehtml::web_color::is_color(const string& str, document_container* callback)
{
if (!t_strncasecmp(str.c_str(), "rgb", 3) || str[0] == '#')
{
return true;
}
if (t_isalpha(str[0]) && resolve_name(str, callback) != "")
{
return true;
}
return false;
}
litehtml::string litehtml::web_color::to_string() const
{
char str[9];
if(alpha)
{
t_snprintf(str, 9, "%02X%02X%02X%02X", red, green, blue, alpha);
} else
{
t_snprintf(str, 9, "%02X%02X%02X", red, green, blue);
}
return str;
}