diff options
-rw-r--r-- | include/csscolorparser/csscolorparser.hpp (renamed from include/llmr/util/color.hpp) | 21 | ||||
-rw-r--r-- | src/csscolorparser/csscolorparser.cpp (renamed from src/util/color.cpp) | 63 | ||||
-rw-r--r-- | src/style/style.cpp | 4 |
3 files changed, 46 insertions, 42 deletions
diff --git a/include/llmr/util/color.hpp b/include/csscolorparser/csscolorparser.hpp index 4f5814dccd..1d074627f6 100644 --- a/include/llmr/util/color.hpp +++ b/include/csscolorparser/csscolorparser.hpp @@ -1,7 +1,8 @@ // (c) Dean McNamee <dean@gmail.com>, 2012. -// C++ port by Konstantin Käfer <mail@kkaefer.com, 2014. +// C++ port by Konstantin Käfer <mail@kkaefer.com>, 2014. // // https://github.com/deanm/css-color-parser-js +// https://github.com/kkaefer/css-color-parser-cpp // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to @@ -20,26 +21,24 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. -#ifndef LLMR_UTIL_COLOR -#define LLMR_UTIL_COLOR + +#ifndef CSS_COLOR_PARSER_CPP +#define CSS_COLOR_PARSER_CPP #include <string> -namespace llmr { -namespace util { +namespace CSSColorParser { -struct CSSColor { - inline CSSColor() {} - inline CSSColor(unsigned char r, unsigned char g, unsigned char b, float a) +struct Color { + inline Color() {} + inline Color(unsigned char r, unsigned char g, unsigned char b, float a) : r(r), g(g), b(b), a(a) {} unsigned char r = 0, g = 0, b = 0; float a = 1.0f; }; -CSSColor parseCSSColor(std::string str); +Color parse(const std::string& css_str); } -} #endif - diff --git a/src/util/color.cpp b/src/csscolorparser/csscolorparser.cpp index ee3b990111..d16299c75d 100644 --- a/src/util/color.cpp +++ b/src/csscolorparser/csscolorparser.cpp @@ -1,7 +1,8 @@ // (c) Dean McNamee <dean@gmail.com>, 2012. -// C++ port by Konstantin Käfer <mail@kkaefer.com, 2014. +// C++ port by Konstantin Käfer <mail@kkaefer.com>, 2014. // // https://github.com/deanm/css-color-parser-js +// https://github.com/kkaefer/css-color-parser-cpp // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to @@ -21,7 +22,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. -#include <llmr/util/color.hpp> +#include <csscolorparser/csscolorparser.hpp> #include <cstdint> #include <vector> @@ -29,11 +30,10 @@ #include <cmath> #include <map> -using namespace llmr::util; - +using namespace CSSColorParser; // http://www.w3.org/TR/css3-color/ -const std::map<std::string, CSSColor> kCSSColorTable = { +const std::map<std::string, Color> kCSSColorTable = { { "transparent", { 0, 0, 0, 0 } }, { "aliceblue", { 240, 248, 255, 1 } }, { "antiquewhite", { 250, 235, 215, 1 } }, { "aqua", { 0, 255, 255, 1 } }, { "aquamarine", { 127, 255, 212, 1 } }, { "azure", { 240, 255, 255, 1 } }, @@ -132,7 +132,7 @@ int64_t parseInt(const std::string& str, uint8_t base = 10) { uint8_t parse_css_int(const std::string& str) { // int or percentage. if (str.length() && str.back() == '%') { - return clamp_css_byte(parseFloat(str) / 100 * 255); + return clamp_css_byte(parseFloat(str) / 100.0f * 255.0f); } else { return clamp_css_byte(parseInt(str)); } @@ -140,27 +140,27 @@ uint8_t parse_css_int(const std::string& str) { // int or percentage. float parse_css_float(const std::string& str) { // float or percentage. if (str.length() && str.back() == '%') { - return clamp_css_float(parseFloat(str) / 100); + return clamp_css_float(parseFloat(str) / 100.0f); } else { return clamp_css_float(parseFloat(str)); } } -uint8_t css_hue_to_rgb(uint8_t m1, uint8_t m2, uint8_t h) { - if (h < 0) { - h += 1; - } else if (h > 1) { - h -= 1; +float css_hue_to_rgb(float m1, float m2, float h) { + if (h < 0.0f) { + h += 1.0f; + } else if (h > 1.0f) { + h -= 1.0f; } - if (h * 6 < 1) { - return m1 + (m2 - m1) * h * 6; + if (h * 6.0f < 1.0f) { + return m1 + (m2 - m1) * h * 6.0f; } - if (h * 2 < 1) { + if (h * 2.0f < 1.0f) { return m2; } - if (h * 3 < 2) { - return m1 + (m2 - m1) * (2 / 3 - h) * 6; + if (h * 3.0f < 2.0f) { + return m1 + (m2 - m1) * (2.0 / 3.0 - h) * 6.0f; } return m1; } @@ -177,12 +177,14 @@ std::vector<std::string> split(const std::string& s, char delim) { return elems; } -CSSColor llmr::util::parseCSSColor(std::string str) { +Color CSSColorParser::parse(const std::string& css_str) { + std::string str = css_str; + // Remove all whitespace, not compliant, but should just be more accepting. str.erase(std::remove(str.begin(), str.end(), ' '), str.end()); // Convert to lowercase. - // std::transform(str.begin(), str.end(), str.begin(), ::tolower); + std::transform(str.begin(), str.end(), str.begin(), ::tolower); // Color keywords (and transparent) lookup. auto it = kCSSColorTable.find(str); @@ -222,10 +224,11 @@ CSSColor llmr::util::parseCSSColor(std::string str) { } size_t op = str.find_first_of('('), ep = str.find_first_of(')'); - if (op != -1 && ep + 1 == str.length()) { + if (op != std::string::npos && ep + 1 == str.length()) { const std::string fname = str.substr(0, op); const std::vector<std::string> params = split(str.substr(op + 1, ep - (op + 1)), ','); - float alpha = 1.0f; // To allow case fallthrough. + + float alpha = 1.0f; if (fname == "rgba" || fname == "rgb") { if (fname == "rgba") { @@ -258,20 +261,22 @@ CSSColor llmr::util::parseCSSColor(std::string str) { } } - float h = parseFloat(params[0]) / 360; - while (h < 0) h++; - while (h > 1) h--; + float h = parseFloat(params[0]) / 360.0f; + while (h < 0.0f) h++; + while (h > 1.0f) h--; // NOTE(deanm): According to the CSS spec s/l should only be // percentages, but we don't bother and let float or percentage. float s = parse_css_float(params[1]); float l = parse_css_float(params[2]); - float m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; - float m1 = l * 2 - m2; + + float m2 = l <= 0.5f ? l * (s + 1.0f) : l + s - l * s; + float m1 = l * 2.0f - m2; + return { - clamp_css_byte(css_hue_to_rgb(m1, m2, h + 1 / 3) * 255), - clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), - clamp_css_byte(css_hue_to_rgb(m1, m2, h - 1 / 3) * 255), + clamp_css_byte(css_hue_to_rgb(m1, m2, h + 1.0f / 3.0f) * 255.0f), + clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255.0f), + clamp_css_byte(css_hue_to_rgb(m1, m2, h - 1.0f / 3.0f) * 255.0f), alpha }; } diff --git a/src/style/style.cpp b/src/style/style.cpp index 8062fc973e..4278dd764e 100644 --- a/src/style/style.cpp +++ b/src/style/style.cpp @@ -1,5 +1,5 @@ #include <llmr/style/style.hpp> -#include <llmr/util/color.hpp> +#include <csscolorparser/csscolorparser.hpp> #include <rapidjson/document.h> @@ -363,7 +363,7 @@ Color parseColor(const rapidjson::Value& value) { throw Style::exception("color value must be a string"); } - llmr::util::CSSColor css_color = llmr::util::parseCSSColor({ + CSSColorParser::Color css_color = CSSColorParser::parse({ value.GetString(), value.GetStringLength() }); |