Cogs.Core
web_color.cpp
1#include "html.h"
2#include "web_color.h"
3#include <string.h>
4
5litehtml::def_color litehtml::g_def_colors[] =
6{
7 {_t("transparent"),_t("rgba(0, 0, 0, 0)")},
8 {_t("AliceBlue"),_t("#F0F8FF")},
9 {_t("AntiqueWhite"),_t("#FAEBD7")},
10 {_t("Aqua"),_t("#00FFFF")},
11 {_t("Aquamarine"),_t("#7FFFD4")},
12 {_t("Azure"),_t("#F0FFFF")},
13 {_t("Beige"),_t("#F5F5DC")},
14 {_t("Bisque"),_t("#FFE4C4")},
15 {_t("Black"),_t("#000000")},
16 {_t("BlanchedAlmond"),_t("#FFEBCD")},
17 {_t("Blue"),_t("#0000FF")},
18 {_t("BlueViolet"),_t("#8A2BE2")},
19 {_t("Brown"),_t("#A52A2A")},
20 {_t("BurlyWood"),_t("#DEB887")},
21 {_t("CadetBlue"),_t("#5F9EA0")},
22 {_t("Chartreuse"),_t("#7FFF00")},
23 {_t("Chocolate"),_t("#D2691E")},
24 {_t("Coral"),_t("#FF7F50")},
25 {_t("CornflowerBlue"),_t("#6495ED")},
26 {_t("Cornsilk"),_t("#FFF8DC")},
27 {_t("Crimson"),_t("#DC143C")},
28 {_t("Cyan"),_t("#00FFFF")},
29 {_t("DarkBlue"),_t("#00008B")},
30 {_t("DarkCyan"),_t("#008B8B")},
31 {_t("DarkGoldenRod"),_t("#B8860B")},
32 {_t("DarkGray"),_t("#A9A9A9")},
33 {_t("DarkGrey"),_t("#A9A9A9")},
34 {_t("DarkGreen"),_t("#006400")},
35 {_t("DarkKhaki"),_t("#BDB76B")},
36 {_t("DarkMagenta"),_t("#8B008B")},
37 {_t("DarkOliveGreen"),_t("#556B2F")},
38 {_t("Darkorange"),_t("#FF8C00")},
39 {_t("DarkOrchid"),_t("#9932CC")},
40 {_t("DarkRed"),_t("#8B0000")},
41 {_t("DarkSalmon"),_t("#E9967A")},
42 {_t("DarkSeaGreen"),_t("#8FBC8F")},
43 {_t("DarkSlateBlue"),_t("#483D8B")},
44 {_t("DarkSlateGray"),_t("#2F4F4F")},
45 {_t("DarkSlateGrey"),_t("#2F4F4F")},
46 {_t("DarkTurquoise"),_t("#00CED1")},
47 {_t("DarkViolet"),_t("#9400D3")},
48 {_t("DeepPink"),_t("#FF1493")},
49 {_t("DeepSkyBlue"),_t("#00BFFF")},
50 {_t("DimGray"),_t("#696969")},
51 {_t("DimGrey"),_t("#696969")},
52 {_t("DodgerBlue"),_t("#1E90FF")},
53 {_t("FireBrick"),_t("#B22222")},
54 {_t("FloralWhite"),_t("#FFFAF0")},
55 {_t("ForestGreen"),_t("#228B22")},
56 {_t("Fuchsia"),_t("#FF00FF")},
57 {_t("Gainsboro"),_t("#DCDCDC")},
58 {_t("GhostWhite"),_t("#F8F8FF")},
59 {_t("Gold"),_t("#FFD700")},
60 {_t("GoldenRod"),_t("#DAA520")},
61 {_t("Gray"),_t("#808080")},
62 {_t("Grey"),_t("#808080")},
63 {_t("Green"),_t("#008000")},
64 {_t("GreenYellow"),_t("#ADFF2F")},
65 {_t("HoneyDew"),_t("#F0FFF0")},
66 {_t("HotPink"),_t("#FF69B4")},
67 {_t("Ivory"),_t("#FFFFF0")},
68 {_t("Khaki"),_t("#F0E68C")},
69 {_t("Lavender"),_t("#E6E6FA")},
70 {_t("LavenderBlush"),_t("#FFF0F5")},
71 {_t("LawnGreen"),_t("#7CFC00")},
72 {_t("LemonChiffon"),_t("#FFFACD")},
73 {_t("LightBlue"),_t("#ADD8E6")},
74 {_t("LightCoral"),_t("#F08080")},
75 {_t("LightCyan"),_t("#E0FFFF")},
76 {_t("LightGoldenRodYellow"),_t("#FAFAD2")},
77 {_t("LightGray"),_t("#D3D3D3")},
78 {_t("LightGrey"),_t("#D3D3D3")},
79 {_t("LightGreen"),_t("#90EE90")},
80 {_t("LightPink"),_t("#FFB6C1")},
81 {_t("LightSalmon"),_t("#FFA07A")},
82 {_t("LightSeaGreen"),_t("#20B2AA")},
83 {_t("LightSkyBlue"),_t("#87CEFA")},
84 {_t("LightSlateGray"),_t("#778899")},
85 {_t("LightSlateGrey"),_t("#778899")},
86 {_t("LightSteelBlue"),_t("#B0C4DE")},
87 {_t("LightYellow"),_t("#FFFFE0")},
88 {_t("Lime"),_t("#00FF00")},
89 {_t("LimeGreen"),_t("#32CD32")},
90 {_t("Linen"),_t("#FAF0E6")},
91 {_t("Magenta"),_t("#FF00FF")},
92 {_t("Maroon"),_t("#800000")},
93 {_t("MediumAquaMarine"),_t("#66CDAA")},
94 {_t("MediumBlue"),_t("#0000CD")},
95 {_t("MediumOrchid"),_t("#BA55D3")},
96 {_t("MediumPurple"),_t("#9370D8")},
97 {_t("MediumSeaGreen"),_t("#3CB371")},
98 {_t("MediumSlateBlue"),_t("#7B68EE")},
99 {_t("MediumSpringGreen"),_t("#00FA9A")},
100 {_t("MediumTurquoise"),_t("#48D1CC")},
101 {_t("MediumVioletRed"),_t("#C71585")},
102 {_t("MidnightBlue"),_t("#191970")},
103 {_t("MintCream"),_t("#F5FFFA")},
104 {_t("MistyRose"),_t("#FFE4E1")},
105 {_t("Moccasin"),_t("#FFE4B5")},
106 {_t("NavajoWhite"),_t("#FFDEAD")},
107 {_t("Navy"),_t("#000080")},
108 {_t("OldLace"),_t("#FDF5E6")},
109 {_t("Olive"),_t("#808000")},
110 {_t("OliveDrab"),_t("#6B8E23")},
111 {_t("Orange"),_t("#FFA500")},
112 {_t("OrangeRed"),_t("#FF4500")},
113 {_t("Orchid"),_t("#DA70D6")},
114 {_t("PaleGoldenRod"),_t("#EEE8AA")},
115 {_t("PaleGreen"),_t("#98FB98")},
116 {_t("PaleTurquoise"),_t("#AFEEEE")},
117 {_t("PaleVioletRed"),_t("#D87093")},
118 {_t("PapayaWhip"),_t("#FFEFD5")},
119 {_t("PeachPuff"),_t("#FFDAB9")},
120 {_t("Peru"),_t("#CD853F")},
121 {_t("Pink"),_t("#FFC0CB")},
122 {_t("Plum"),_t("#DDA0DD")},
123 {_t("PowderBlue"),_t("#B0E0E6")},
124 {_t("Purple"),_t("#800080")},
125 {_t("Red"),_t("#FF0000")},
126 {_t("RosyBrown"),_t("#BC8F8F")},
127 {_t("RoyalBlue"),_t("#4169E1")},
128 {_t("SaddleBrown"),_t("#8B4513")},
129 {_t("Salmon"),_t("#FA8072")},
130 {_t("SandyBrown"),_t("#F4A460")},
131 {_t("SeaGreen"),_t("#2E8B57")},
132 {_t("SeaShell"),_t("#FFF5EE")},
133 {_t("Sienna"),_t("#A0522D")},
134 {_t("Silver"),_t("#C0C0C0")},
135 {_t("SkyBlue"),_t("#87CEEB")},
136 {_t("SlateBlue"),_t("#6A5ACD")},
137 {_t("SlateGray"),_t("#708090")},
138 {_t("SlateGrey"),_t("#708090")},
139 {_t("Snow"),_t("#FFFAFA")},
140 {_t("SpringGreen"),_t("#00FF7F")},
141 {_t("SteelBlue"),_t("#4682B4")},
142 {_t("Tan"),_t("#D2B48C")},
143 {_t("Teal"),_t("#008080")},
144 {_t("Thistle"),_t("#D8BFD8")},
145 {_t("Tomato"),_t("#FF6347")},
146 {_t("Turquoise"),_t("#40E0D0")},
147 {_t("Violet"),_t("#EE82EE")},
148 {_t("Wheat"),_t("#F5DEB3")},
149 {_t("White"),_t("#FFFFFF")},
150 {_t("WhiteSmoke"),_t("#F5F5F5")},
151 {_t("Yellow"),_t("#FFFF00")},
152 {_t("YellowGreen"),_t("#9ACD32")},
153 {0,0}
154};
155
156
157litehtml::web_color litehtml::web_color::from_string(const tchar_t* str, litehtml::document_container* callback)
158{
159 if(!str || !str[0])
160 {
161 return web_color(0, 0, 0);
162 }
163 if(str[0] == _t('#'))
164 {
165 tstring red = _t("");
166 tstring green = _t("");
167 tstring blue = _t("");
168 tstring alpha = _t("FF");
169
170 if(t_strlen(str + 1) == 3)
171 {
172 red += str[1];
173 red += str[1];
174 green += str[2];
175 green += str[2];
176 blue += str[3];
177 blue += str[3];
178 }
179 else if(t_strlen(str + 1) == 4)
180 {
181 red += str[1];
182 red += str[1];
183 green += str[2];
184 green += str[2];
185 blue += str[3];
186 blue += str[3];
187 alpha = str[4];
188 alpha += str[4];
189 }
190 else if(t_strlen(str + 1) == 6)
191 {
192 red += str[1];
193 red += str[2];
194 green += str[3];
195 green += str[4];
196 blue += str[5];
197 blue += str[6];
198 }
199 else if(t_strlen(str + 1) == 8)
200 {
201 red += str[1];
202 red += str[2];
203 green += str[3];
204 green += str[4];
205 blue += str[5];
206 blue += str[6];
207 alpha = str[7];
208 alpha += str[8];
209 }
210 tchar_t* sss = 0;
211 web_color clr;
212 clr.red = (byte) t_strtol(red.c_str(), &sss, 16);
213 clr.green = (byte) t_strtol(green.c_str(), &sss, 16);
214 clr.blue = (byte) t_strtol(blue.c_str(), &sss, 16);
215 clr.alpha = (byte) t_strtol(alpha.c_str(), &sss, 16);
216 return clr;
217 } else if(!t_strncmp(str, _t("rgb"), 3))
218 {
219 tstring s = str;
220
221 tstring::size_type pos = s.find_first_of(_t("("));
222 if(pos != tstring::npos)
223 {
224 s.erase(s.begin(), s.begin() + pos + 1);
225 }
226 pos = s.find_last_of(_t(")"));
227 if(pos != tstring::npos)
228 {
229 s.erase(s.begin() + pos, s.end());
230 }
231
232 std::vector<tstring> tokens;
233 split_string(s, tokens, _t(", \t"));
234
235 web_color clr;
236
237 if(tokens.size() >= 1) clr.red = (byte) t_atoi(tokens[0].c_str());
238 if(tokens.size() >= 2) clr.green = (byte) t_atoi(tokens[1].c_str());
239 if(tokens.size() >= 3) clr.blue = (byte) t_atoi(tokens[2].c_str());
240 if(tokens.size() >= 4) clr.alpha = (byte) (t_strtod(tokens[3].c_str(), 0) * 255.0);
241
242 return clr;
243 } else
244 {
245 tstring rgb = resolve_name(str, callback);
246 if(!rgb.empty())
247 {
248 return from_string(rgb.c_str(), callback);
249 }
250 }
251 return web_color(0, 0, 0);
252}
253
254litehtml::tstring litehtml::web_color::resolve_name(const tchar_t* name, litehtml::document_container* callback)
255{
256 for(int i=0; g_def_colors[i].name; i++)
257 {
258 if(!t_strcasecmp(name, g_def_colors[i].name))
259 {
260 return litehtml::tstring(g_def_colors[i].rgb);
261 }
262 }
263 if (callback)
264 {
265 litehtml::tstring clr = callback->resolve_color(name);
266 return clr;
267 }
268 return litehtml::tstring();
269}
270
271bool litehtml::web_color::is_color(const tchar_t* str)
272{
273 if(!t_strncasecmp(str, _t("rgb"), 3) || str[0] == _t('#'))
274 {
275 return true;
276 }
277 if (!t_isdigit(str[0]) && str[0] != _t('.'))
278 {
279 return true;
280 }
281 return false;
282}