From 19158d9f01909bf566616524f23e0acb635562f7 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 16 Jun 2016 13:25:06 -0700 Subject: [core, node] Implement setPaintProperty for color properties (#5380) --- include/mbgl/map/view.hpp | 1 + include/mbgl/util/color.hpp | 6 +++++- package.json | 2 +- platform/node/src/node_style.hpp | 14 ++++++++++++-- src/mbgl/style/property_parsing.cpp | 16 ++++++---------- src/mbgl/util/color.cpp | 20 ++++++++++++++++++++ 6 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 src/mbgl/util/color.cpp diff --git a/include/mbgl/map/view.hpp b/include/mbgl/map/view.hpp index 9f12ee5fb6..fa6f91d910 100644 --- a/include/mbgl/map/view.hpp +++ b/include/mbgl/map/view.hpp @@ -4,6 +4,7 @@ #include #include +#include #include #include diff --git a/include/mbgl/util/color.hpp b/include/mbgl/util/color.hpp index 87d3175178..6491f75801 100644 --- a/include/mbgl/util/color.hpp +++ b/include/mbgl/util/color.hpp @@ -1,6 +1,8 @@ #pragma once -#include +#include + +#include namespace mbgl { @@ -14,6 +16,8 @@ public: static constexpr Color black() { return { 0.0f, 0.0f, 0.0f, 1.0f }; }; static constexpr Color white() { return { 1.0f, 1.0f, 1.0f, 1.0f }; }; + + static optional parse(const std::string&); }; inline bool operator==(const Color& colorA, const Color& colorB) { diff --git a/package.json b/package.json index 5785994247..08e666dec6 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "express": "^4.11.1", "mapbox-gl-shaders": "mapbox/mapbox-gl-shaders#59e998295d548f208ee3ec10cdd21ff2630e2079", "mapbox-gl-style-spec": "mapbox/mapbox-gl-style-spec#194fc55b6a7dd54c1e2cf2dd9048fbb5e836716d", - "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#05d8865cf38920d5d15de0e410475514d6edace0", + "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#3a6baea2f364410e6d0873b71babfe0484870a72", "node-gyp": "^3.3.1", "request": "^2.72.0", "tape": "^4.5.1" diff --git a/platform/node/src/node_style.hpp b/platform/node/src/node_style.hpp index a987c0d262..0b6b05e13b 100644 --- a/platform/node/src/node_style.hpp +++ b/platform/node/src/node_style.hpp @@ -65,8 +65,18 @@ struct ValueConverter::value>> { template <> struct ValueConverter { mbgl::optional> operator()(const v8::Local& value) const { - (void)value; - return {}; + if (!value->IsString()) { + Nan::ThrowTypeError("string required"); + return {}; + } + + mbgl::optional result = mbgl::Color::parse(*Nan::Utf8String(value)); + if (!result) { + Nan::ThrowTypeError("invalid color"); + return {}; + } + + return { *result }; } }; diff --git a/src/mbgl/style/property_parsing.cpp b/src/mbgl/style/property_parsing.cpp index 2b08ba8788..2eb55dcb25 100644 --- a/src/mbgl/style/property_parsing.cpp +++ b/src/mbgl/style/property_parsing.cpp @@ -2,8 +2,6 @@ #include -#include - namespace mbgl { namespace style { @@ -44,15 +42,13 @@ optional parseConstant(const char* name, const JSValue& value) { return {}; } - CSSColorParser::Color css_color = CSSColorParser::parse({ value.GetString(), value.GetStringLength() }); - - // Premultiply the color. - const float factor = css_color.a / 255; + optional result = Color::parse({ value.GetString(), value.GetStringLength() }); + if (!result) { + Log::Warning(Event::ParseStyle, "value of '%s' must be a valid color", name); + return {}; + } - return Color{ (float)css_color.r * factor, - (float)css_color.g * factor, - (float)css_color.b * factor, - css_color.a }; + return result; } template <> diff --git a/src/mbgl/util/color.cpp b/src/mbgl/util/color.cpp new file mode 100644 index 0000000000..eea897d3ab --- /dev/null +++ b/src/mbgl/util/color.cpp @@ -0,0 +1,20 @@ +#include + +#include + +namespace mbgl { + +optional Color::parse(const std::string& s) { + CSSColorParser::Color css_color = CSSColorParser::parse(s); + + // Premultiply the color. + const float factor = css_color.a / 255; + return {{ + css_color.r * factor, + css_color.g * factor, + css_color.b * factor, + css_color.a + }}; +} + +} // namespace mbgl -- cgit v1.2.1