Update current version of litehtml. Fix a crash when document contains no fonts
[claws.git] / src / plugins / litehtml_viewer / litehtml / web_color.cpp
index 814765dc3c57651adbeac49cca6a9e0bedc7d382..39ce2d7f075450f91b416b1522902342b2b3a0a1 100644 (file)
@@ -1,28 +1,28 @@
-#include "html.h"\r
-#include "web_color.h"\r
-#include <string.h>\r
-\r
-litehtml::def_color litehtml::g_def_colors[] = \r
-{\r
-       {_t("transparent"),_t("rgba(0, 0, 0, 0)")},\r
-       {_t("AliceBlue"),_t("#F0F8FF")},\r
-       {_t("AntiqueWhite"),_t("#FAEBD7")},\r
-       {_t("Aqua"),_t("#00FFFF")},\r
-       {_t("Aquamarine"),_t("#7FFFD4")},\r
-       {_t("Azure"),_t("#F0FFFF")},\r
-       {_t("Beige"),_t("#F5F5DC")},\r
-       {_t("Bisque"),_t("#FFE4C4")},\r
-       {_t("Black"),_t("#000000")},\r
-       {_t("BlanchedAlmond"),_t("#FFEBCD")},\r
-       {_t("Blue"),_t("#0000FF")},\r
-       {_t("BlueViolet"),_t("#8A2BE2")},\r
-       {_t("Brown"),_t("#A52A2A")},\r
-       {_t("BurlyWood"),_t("#DEB887")},\r
-       {_t("CadetBlue"),_t("#5F9EA0")},\r
-       {_t("Chartreuse"),_t("#7FFF00")},\r
-       {_t("Chocolate"),_t("#D2691E")},\r
-       {_t("Coral"),_t("#FF7F50")},\r
-       {_t("CornflowerBlue"),_t("#6495ED")},\r
+#include "html.h"
+#include "web_color.h"
+#include <string.h>
+
+litehtml::def_color litehtml::g_def_colors[] = 
+{
+       {_t("transparent"),_t("rgba(0, 0, 0, 0)")},
+       {_t("AliceBlue"),_t("#F0F8FF")},
+       {_t("AntiqueWhite"),_t("#FAEBD7")},
+       {_t("Aqua"),_t("#00FFFF")},
+       {_t("Aquamarine"),_t("#7FFFD4")},
+       {_t("Azure"),_t("#F0FFFF")},
+       {_t("Beige"),_t("#F5F5DC")},
+       {_t("Bisque"),_t("#FFE4C4")},
+       {_t("Black"),_t("#000000")},
+       {_t("BlanchedAlmond"),_t("#FFEBCD")},
+       {_t("Blue"),_t("#0000FF")},
+       {_t("BlueViolet"),_t("#8A2BE2")},
+       {_t("Brown"),_t("#A52A2A")},
+       {_t("BurlyWood"),_t("#DEB887")},
+       {_t("CadetBlue"),_t("#5F9EA0")},
+       {_t("Chartreuse"),_t("#7FFF00")},
+       {_t("Chocolate"),_t("#D2691E")},
+       {_t("Coral"),_t("#FF7F50")},
+       {_t("CornflowerBlue"),_t("#6495ED")},
        {_t("Cornsilk"),_t("#FFF8DC")},
        {_t("Crimson"),_t("#DC143C")},
        {_t("Cyan"),_t("#00FFFF")},
@@ -149,103 +149,108 @@ litehtml::def_color litehtml::g_def_colors[] =
        {_t("White"),_t("#FFFFFF")},
        {_t("WhiteSmoke"),_t("#F5F5F5")},
        {_t("Yellow"),_t("#FFFF00")},
-       {_t("YellowGreen"),_t("#9ACD32")},\r
-       {0,0}\r
-};\r
-\r
-\r
-litehtml::web_color litehtml::web_color::from_string( const tchar_t* str )\r
-{\r
-       if(!str)\r
-       {\r
-               return web_color(0, 0, 0);\r
-       }\r
-       if(str[0] == _t('#'))\r
-       {\r
-               tstring red             = _t("");\r
-               tstring green           = _t("");\r
-               tstring blue            = _t("");\r
-               if(t_strlen(str + 1) == 3)\r
-               {\r
-                       red             += str[1];\r
-                       red             += str[1];\r
-                       green   += str[2];\r
-                       green   += str[2];\r
-                       blue    += str[3];\r
-                       blue    += str[3];\r
-               } else if(t_strlen(str + 1) == 6)\r
-               {\r
-                       red             += str[1];\r
-                       red             += str[2];\r
-                       green   += str[3];\r
-                       green   += str[4];\r
-                       blue    += str[5];\r
-                       blue    += str[6];\r
-               }\r
-               tchar_t* sss = 0;\r
-               web_color clr;\r
-               clr.red         = (byte) t_strtol(red.c_str(),  &sss, 16);\r
-               clr.green       = (byte) t_strtol(green.c_str(),        &sss, 16);\r
-               clr.blue        = (byte) t_strtol(blue.c_str(), &sss, 16);\r
-               return clr;\r
-       } else if(!t_strncmp(str, _t("rgb"), 3))\r
-       {\r
-               tstring s = str;\r
-\r
-               tstring::size_type pos = s.find_first_of(_t("("));\r
-               if(pos != tstring::npos)\r
-               {\r
-                       s.erase(s.begin(), s.begin() + pos + 1);\r
-               }\r
-               pos = s.find_last_of(_t(")"));\r
-               if(pos != tstring::npos)\r
-               {\r
-                       s.erase(s.begin() + pos, s.end());\r
-               }\r
-\r
-               std::vector<tstring> tokens;\r
-               split_string(s, tokens, _t(", \t"));\r
-\r
-               web_color clr;\r
-\r
-               if(tokens.size() >= 1)  clr.red         = (byte) t_atoi(tokens[0].c_str());\r
-               if(tokens.size() >= 2)  clr.green       = (byte) t_atoi(tokens[1].c_str());\r
-               if(tokens.size() >= 3)  clr.blue        = (byte) t_atoi(tokens[2].c_str());\r
-               if(tokens.size() >= 4)  clr.alpha       = (byte) (t_strtod(tokens[3].c_str(), 0) * 255.0);\r
-\r
-               return clr;\r
-       } else\r
-       {\r
-               const tchar_t* rgb = resolve_name(str);\r
-               if(rgb)\r
-               {\r
-                       return from_string(rgb);\r
-               }\r
-       }\r
-       return web_color(0, 0, 0);\r
-}\r
-\r
-const litehtml::tchar_t* litehtml::web_color::resolve_name( const tchar_t* name )\r
-{\r
-       for(int i=0; g_def_colors[i].name; i++)\r
-       {\r
-               if(!t_strcasecmp(name, g_def_colors[i].name))\r
-               {\r
-                       return g_def_colors[i].rgb;\r
-               }\r
-       }\r
-       return 0;\r
-}\r
-\r
-bool litehtml::web_color::is_color( const tchar_t* str )\r
-{\r
-       if(!t_strncasecmp(str, _t("rgb"), 3) || str[0] == _t('#'))\r
-       {\r
-               return true;\r
-       }\r
-       if(resolve_name(str))\r
-       {\r
-               return true;\r
-       }\r
-       return false;\r
-}\r
+       {_t("YellowGreen"),_t("#9ACD32")},
+       {0,0}
+};
+
+
+litehtml::web_color litehtml::web_color::from_string(const tchar_t* str, litehtml::document_container* callback)
+{
+       if(!str || !str[0])
+       {
+               return web_color(0, 0, 0);
+       }
+       if(str[0] == _t('#'))
+       {
+               tstring red             = _t("");
+               tstring green           = _t("");
+               tstring blue            = _t("");
+               if(t_strlen(str + 1) == 3)
+               {
+                       red             += str[1];
+                       red             += str[1];
+                       green   += str[2];
+                       green   += str[2];
+                       blue    += str[3];
+                       blue    += str[3];
+               } else if(t_strlen(str + 1) == 6)
+               {
+                       red             += str[1];
+                       red             += str[2];
+                       green   += str[3];
+                       green   += str[4];
+                       blue    += str[5];
+                       blue    += str[6];
+               }
+               tchar_t* sss = 0;
+               web_color clr;
+               clr.red         = (byte) t_strtol(red.c_str(),  &sss, 16);
+               clr.green       = (byte) t_strtol(green.c_str(),        &sss, 16);
+               clr.blue        = (byte) t_strtol(blue.c_str(), &sss, 16);
+               return clr;
+       } else if(!t_strncmp(str, _t("rgb"), 3))
+       {
+               tstring s = str;
+
+               tstring::size_type pos = s.find_first_of(_t("("));
+               if(pos != tstring::npos)
+               {
+                       s.erase(s.begin(), s.begin() + pos + 1);
+               }
+               pos = s.find_last_of(_t(")"));
+               if(pos != tstring::npos)
+               {
+                       s.erase(s.begin() + pos, s.end());
+               }
+
+               std::vector<tstring> tokens;
+               split_string(s, tokens, _t(", \t"));
+
+               web_color clr;
+
+               if(tokens.size() >= 1)  clr.red         = (byte) t_atoi(tokens[0].c_str());
+               if(tokens.size() >= 2)  clr.green       = (byte) t_atoi(tokens[1].c_str());
+               if(tokens.size() >= 3)  clr.blue        = (byte) t_atoi(tokens[2].c_str());
+               if(tokens.size() >= 4)  clr.alpha       = (byte) (t_strtod(tokens[3].c_str(), 0) * 255.0);
+
+               return clr;
+       } else
+       {
+               tstring rgb = resolve_name(str, callback);
+               if(!rgb.empty())
+               {
+                       return from_string(rgb.c_str(), callback);
+               }
+       }
+       return web_color(0, 0, 0);
+}
+
+litehtml::tstring litehtml::web_color::resolve_name(const tchar_t* name, litehtml::document_container* callback)
+{
+       for(int i=0; g_def_colors[i].name; i++)
+       {
+               if(!t_strcasecmp(name, g_def_colors[i].name))
+               {
+            return std::move(litehtml::tstring(g_def_colors[i].rgb));
+               }
+       }
+    if (callback)
+    {
+        litehtml::tstring clr = callback->resolve_color(name);
+        return std::move(clr);
+    }
+    return std::move(litehtml::tstring());
+}
+
+bool litehtml::web_color::is_color(const tchar_t* str)
+{
+       if(!t_strncasecmp(str, _t("rgb"), 3) || str[0] == _t('#'))
+       {
+               return true;
+       }
+    if (!t_isdigit(str[0]) && str[0] != _t('.'))
+       {
+               return true;
+       }
+       return false;
+}