add HSL(A) colors
This commit is contained in:
parent
428641452c
commit
b05e09700b
1 changed files with 56 additions and 0 deletions
|
@ -28,7 +28,9 @@
|
||||||
// boost
|
// boost
|
||||||
#include <boost/spirit/home/x3.hpp>
|
#include <boost/spirit/home/x3.hpp>
|
||||||
#include <boost/fusion/adapted/struct.hpp>
|
#include <boost/fusion/adapted/struct.hpp>
|
||||||
|
#include <boost/fusion/adapted/std_tuple.hpp>
|
||||||
#include <mapnik/color.hpp>
|
#include <mapnik/color.hpp>
|
||||||
|
#include <mapnik/util/hsl.hpp>
|
||||||
#include <mapnik/safe_cast.hpp>
|
#include <mapnik/safe_cast.hpp>
|
||||||
|
|
||||||
BOOST_FUSION_ADAPT_STRUCT (
|
BOOST_FUSION_ADAPT_STRUCT (
|
||||||
|
@ -296,6 +298,37 @@ auto hex1_opacity = [](auto& ctx)
|
||||||
_val(ctx).alpha_ = _attr(ctx) | _attr(ctx) << 4;
|
_val(ctx).alpha_ = _attr(ctx) | _attr(ctx) << 4;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
auto hsl_to_rgba = [] (auto& ctx)
|
||||||
|
{
|
||||||
|
double h = std::get<0>(_attr(ctx));
|
||||||
|
double s = std::get<1>(_attr(ctx));
|
||||||
|
double l = std::get<2>(_attr(ctx));
|
||||||
|
double m1;
|
||||||
|
double m2;
|
||||||
|
// normalise values
|
||||||
|
h /= 360.0;
|
||||||
|
s /= 100.0;
|
||||||
|
l /= 100.0;
|
||||||
|
if (l <= 0.5)
|
||||||
|
{
|
||||||
|
m2 = l * (s + 1.0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m2 = l + s - l*s;
|
||||||
|
}
|
||||||
|
m1 = l * 2 - m2;
|
||||||
|
|
||||||
|
double r = hue_to_rgb(m1, m2, h + 1.0/3.0);
|
||||||
|
double g = hue_to_rgb(m1, m2, h);
|
||||||
|
double b = hue_to_rgb(m1, m2, h - 1.0/3.0);
|
||||||
|
uint8_t alpha = uint8_t((255.0 * clip_opacity::call(std::get<3>(_attr(ctx)))) + 0.5);
|
||||||
|
_val(ctx) = color(safe_cast<uint8_t>(std::lround(255.0 * r)),
|
||||||
|
safe_cast<uint8_t>(std::lround(255.0 * g)),
|
||||||
|
safe_cast<uint8_t>(std::lround(255.0 * b)),
|
||||||
|
alpha);
|
||||||
|
};
|
||||||
|
|
||||||
auto const hex2_color_def = no_skip[lit('#') >> hex2 >> hex2 >> hex2 >> (hex2 | attr(255))] ;
|
auto const hex2_color_def = no_skip[lit('#') >> hex2 >> hex2 >> hex2 >> (hex2 | attr(255))] ;
|
||||||
|
|
||||||
auto const hex1_color_def = no_skip[lit('#')
|
auto const hex1_color_def = no_skip[lit('#')
|
||||||
|
@ -328,6 +361,25 @@ auto const rgba_color_percent_def = lit("rgba")
|
||||||
>> lit(',') >> dec3[percent_blue] >> lit('%')
|
>> lit(',') >> dec3[percent_blue] >> lit('%')
|
||||||
>> lit(',') >> double_[opacity] >> lit(')');
|
>> lit(',') >> double_[opacity] >> lit(')');
|
||||||
|
|
||||||
|
auto const hsl_values = x3::rule<class hsl_values, std::tuple<std::uint8_t,std::uint8_t,std::uint8_t, double >> {} =
|
||||||
|
lit("hsl")
|
||||||
|
>> lit('(') >> dec3
|
||||||
|
>> lit(',') >> dec3 >> lit('%')
|
||||||
|
>> lit(',') >> dec3 >> lit('%')
|
||||||
|
>> attr(1.0) >> lit(')')
|
||||||
|
;
|
||||||
|
|
||||||
|
auto const hsla_values = x3::rule<class hsla_values, std::tuple<std::uint8_t,std::uint8_t,std::uint8_t, double >> {} =
|
||||||
|
lit("hsla")
|
||||||
|
>> lit('(') >> dec3
|
||||||
|
>> lit(',') >> dec3 >> lit('%')
|
||||||
|
>> lit(',') >> dec3 >> lit('%')
|
||||||
|
>> lit(',') >> double_ >> lit(')')
|
||||||
|
;
|
||||||
|
|
||||||
|
auto const hsl_color = x3::rule<class hsl_color, color> {} = hsl_values[hsl_to_rgba];
|
||||||
|
auto const hsla_color = x3::rule<class hsla_color, color> {} = hsla_values[hsl_to_rgba];
|
||||||
|
|
||||||
auto const svg2_color_def =
|
auto const svg2_color_def =
|
||||||
no_case[named_colors]
|
no_case[named_colors]
|
||||||
|
|
|
|
||||||
|
@ -342,6 +394,10 @@ auto const svg2_color_def =
|
||||||
rgb_color_percent
|
rgb_color_percent
|
||||||
|
|
|
|
||||||
rgba_color_percent
|
rgba_color_percent
|
||||||
|
|
|
||||||
|
hsl_color
|
||||||
|
|
|
||||||
|
hsla_color
|
||||||
;
|
;
|
||||||
|
|
||||||
BOOST_SPIRIT_DEFINE(
|
BOOST_SPIRIT_DEFINE(
|
||||||
|
|
Loading…
Reference in a new issue