summaryrefslogtreecommitdiff
path: root/libs/litehtml/src/web_color.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/litehtml/src/web_color.cpp')
-rw-r--r--libs/litehtml/src/web_color.cpp274
1 files changed, 274 insertions, 0 deletions
diff --git a/libs/litehtml/src/web_color.cpp b/libs/litehtml/src/web_color.cpp
new file mode 100644
index 0000000000..78b201fac0
--- /dev/null
+++ b/libs/litehtml/src/web_color.cpp
@@ -0,0 +1,274 @@
+#include "html.h"
+#include "web_color.h"
+#include <cstring>
+
+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::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<string> 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;
+}