From b6cea7c65858140878a59d8b97d0c7c53db6aa4d Mon Sep 17 00:00:00 2001 From: artemp Date: Thu, 10 Dec 2015 15:22:29 +0000 Subject: [PATCH] use std::size_t to be complaint with STL containers + explicit types --- include/mapnik/svg2_color_grammar_def.hpp | 306 ++++++++++++++++++++++ include/mapnik/well_known_srs.hpp | 22 +- 2 files changed, 317 insertions(+), 11 deletions(-) create mode 100644 include/mapnik/svg2_color_grammar_def.hpp diff --git a/include/mapnik/svg2_color_grammar_def.hpp b/include/mapnik/svg2_color_grammar_def.hpp new file mode 100644 index 000000000..a3fdfebb1 --- /dev/null +++ b/include/mapnik/svg2_color_grammar_def.hpp @@ -0,0 +1,306 @@ +/***************************************************************************** + * + * This file is part of Mapnik (c++ mapping toolkit) + * + * Copyright (C) 2015 Artem Pavlenko + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + *****************************************************************************/ + +// http://www.w3.org/TR/SVG2/color.html + +#ifndef MAPNIK_SVG2_COLOR_GRAMMAR_HPP +#define MAPNIK_SVG2_COLOR_GRAMMAR_HPP + +// boost +#include +//#include +#include + +BOOST_FUSION_ADAPT_STRUCT ( + mapnik::color, + (std::uint8_t, red_) + (std::uint8_t, green_) + (std::uint8_t, blue_) + (std::uint8_t, alpha_) + ) + +//BOOST_FUSION_ADAPT_ADT( +// mapnik::color, +// (std::uint8_t, std::uint8_t, obj.red(), obj.set_red(val)) +// (std::uint8_t, std::uint8_t, obj.green(), obj.set_green(val)) +// (std::uint8_t, std::uint8_t, obj.blue(), obj.set_blue(val)) +// (std::uint8_t, std::uint8_t, obj.alpha(), obj.set_alpha(val)) +// ) + +namespace mapnik { + +namespace x3 = boost::spirit::x3; + +namespace svg2_color_grammar { + +using x3::lit; +using x3::uint_parser; +using x3::hex; +using x3::symbols; +using x3::omit; +using x3::attr; +using x3::double_; +using x3::no_case; + + +struct named_colors_ : x3::symbols +{ + named_colors_() + { + add + ("aliceblue", color(240, 248, 255)) + ("antiquewhite", color(250, 235, 215)) + ("aqua", color(0, 255, 255)) + ("aquamarine", color(127, 255, 212)) + ("azure", color(240, 255, 255)) + ("beige", color(245, 245, 220)) + ("bisque", color(255, 228, 196)) + ("black", color(0, 0, 0)) + ("blanchedalmond", color(255,235,205)) + ("blue", color(0, 0, 255)) + ("blueviolet", color(138, 43, 226)) + ("brown", color(165, 42, 42)) + ("burlywood", color(222, 184, 135)) + ("cadetblue", color(95, 158, 160)) + ("chartreuse", color(127, 255, 0)) + ("chocolate", color(210, 105, 30)) + ("coral", color(255, 127, 80)) + ("cornflowerblue", color(100, 149, 237)) + ("cornsilk", color(255, 248, 220)) + ("crimson", color(220, 20, 60)) + ("cyan", color(0, 255, 255)) + ("darkblue", color(0, 0, 139)) + ("darkcyan", color(0, 139, 139)) + ("darkgoldenrod", color(184, 134, 11)) + ("darkgray", color(169, 169, 169)) + ("darkgreen", color(0, 100, 0)) + ("darkgrey", color(169, 169, 169)) + ("darkkhaki", color(189, 183, 107)) + ("darkmagenta", color(139, 0, 139)) + ("darkolivegreen", color(85, 107, 47)) + ("darkorange", color(255, 140, 0)) + ("darkorchid", color(153, 50, 204)) + ("darkred", color(139, 0, 0)) + ("darksalmon", color(233, 150, 122)) + ("darkseagreen", color(143, 188, 143)) + ("darkslateblue", color(72, 61, 139)) + ("darkslategrey", color(47, 79, 79)) + ("darkturquoise", color(0, 206, 209)) + ("darkviolet", color(148, 0, 211)) + ("deeppink", color(255, 20, 147)) + ("deepskyblue", color(0, 191, 255)) + ("dimgray", color(105, 105, 105)) + ("dimgrey", color(105, 105, 105)) + ("dodgerblue", color(30, 144, 255)) + ("firebrick", color(178, 34, 34)) + ("floralwhite", color(255, 250, 240)) + ("forestgreen", color(34, 139, 34)) + ("fuchsia", color(255, 0, 255)) + ("gainsboro", color(220, 220, 220)) + ("ghostwhite", color(248, 248, 255)) + ("gold", color(255, 215, 0)) + ("goldenrod", color(218, 165, 32)) + ("gray", color(128, 128, 128)) + ("grey", color(128, 128, 128)) + ("green", color(0, 128, 0)) + ("greenyellow", color(173, 255, 47)) + ("honeydew", color(240, 255, 240)) + ("hotpink", color(255, 105, 180)) + ("indianred", color(205, 92, 92)) + ("indigo", color(75, 0, 130)) + ("ivory", color(255, 255, 240)) + ("khaki", color(240, 230, 140)) + ("lavender", color(230, 230, 250)) + ("lavenderblush", color(255, 240, 245)) + ("lawngreen", color(124, 252, 0)) + ("lemonchiffon", color(255, 250, 205)) + ("lightblue", color(173, 216, 230)) + ("lightcoral", color(240, 128, 128)) + ("lightcyan", color(224, 255, 255)) + ("lightgoldenrodyellow", color(250, 250, 210)) + ("lightgray", color(211, 211, 211)) + ("lightgreen", color(144, 238, 144)) + ("lightgrey", color(211, 211, 211)) + ("lightpink", color(255, 182, 193)) + ("lightsalmon", color(255, 160, 122)) + ("lightseagreen", color(32, 178, 170)) + ("lightskyblue", color(135, 206, 250)) + ("lightslategray", color(119, 136, 153)) + ("lightslategrey", color(119, 136, 153)) + ("lightsteelblue", color(176, 196, 222)) + ("lightyellow", color(255, 255, 224)) + ("lime", color(0, 255, 0)) + ("limegreen", color(50, 205, 50)) + ("linen", color(250, 240, 230)) + ("magenta", color(255, 0, 255)) + ("maroon", color(128, 0, 0)) + ("mediumaquamarine", color(102, 205, 170)) + ("mediumblue", color(0, 0, 205)) + ("mediumorchid", color(186, 85, 211)) + ("mediumpurple", color(147, 112, 219)) + ("mediumseagreen", color(60, 179, 113)) + ("mediumslateblue", color(123, 104, 238)) + ("mediumspringgreen", color(0, 250, 154)) + ("mediumturquoise", color(72, 209, 204)) + ("mediumvioletred", color(199, 21, 133)) + ("midnightblue", color(25, 25, 112)) + ("mintcream", color(245, 255, 250)) + ("mistyrose", color(255, 228, 225)) + ("moccasin", color(255, 228, 181)) + ("navajowhite", color(255, 222, 173)) + ("navy", color(0, 0, 128)) + ("oldlace", color(253, 245, 230)) + ("olive", color(128, 128, 0)) + ("olivedrab", color(107, 142, 35)) + ("orange", color(255, 165, 0)) + ("orangered", color(255, 69, 0)) + ("orchid", color(218, 112, 214)) + ("palegoldenrod", color(238, 232, 170)) + ("palegreen", color(152, 251, 152)) + ("paleturquoise", color(175, 238, 238)) + ("palevioletred", color(219, 112, 147)) + ("papayawhip", color(255, 239, 213)) + ("peachpuff", color(255, 218, 185)) + ("peru", color(205, 133, 63)) + ("pink", color(255, 192, 203)) + ("plum", color(221, 160, 221)) + ("powderblue", color(176, 224, 230)) + ("purple", color(128, 0, 128)) + ("red", color(255, 0, 0)) + ("rosybrown", color(188, 143, 143)) + ("royalblue", color(65, 105, 225)) + ("saddlebrown", color(139, 69, 19)) + ("salmon", color(250, 128, 114)) + ("sandybrown", color(244, 164, 96)) + ("seagreen", color(46, 139, 87)) + ("seashell", color(255, 245, 238)) + ("sienna", color(160, 82, 45)) + ("silver", color(192, 192, 192)) + ("skyblue", color(135, 206, 235)) + ("slateblue", color(106, 90, 205)) + ("slategray", color(112, 128, 144)) + ("slategrey", color(112, 128, 144)) + ("snow", color(255, 250, 250)) + ("springgreen", color(0, 255, 127)) + ("steelblue", color(70, 130, 180)) + ("tan", color(210, 180, 140)) + ("teal", color(0, 128, 128)) + ("thistle", color(216, 191, 216)) + ("tomato", color(255, 99, 71)) + ("turquoise", color(64, 224, 208)) + ("violet", color(238, 130, 238)) + ("wheat", color(245, 222, 179)) + ("white", color(255, 255, 255)) + ("whitesmoke", color(245, 245, 245)) + ("yellow", color(255, 255, 0)) + ("yellowgreen", color(154, 205, 50)) + ("transparent", color(0, 0, 0, 0)) + ; + } +} named_colors; + +x3::uint_parser hex2; +x3::uint_parser hex1; +x3::uint_parser dec3; + +x3::rule const svg2_color("svg2_color"); +x3::rule const hex2_color("hex2_color"); +x3::rule const hex1_color("hex1_color"); +x3::rule const rgb_color("rgb_color"); +x3::rule const rgba_color("rgba_color"); + +struct clip_opacity +{ + static double call(double val) + { + if (val > 1.0) return 1.0; + if (val < 0.0) return 0.0; + return val; + } +}; + +auto dec_red = [](auto& ctx) +{ + _val(ctx).red_ = _attr(ctx); +}; + +auto dec_green = [](auto& ctx) +{ + _val(ctx).green_ = _attr(ctx); +}; + +auto dec_blue = [](auto& ctx) +{ + _val(ctx).blue_ = _attr(ctx); +}; + +auto opacity = [](auto& ctx) +{ + _val(ctx).alpha_ = uint8_t((255.0 * clip_opacity::call(_attr(ctx))) + 0.5); +}; + +auto hex1_red = [](auto& ctx) +{ + _val(ctx).red_ = _attr(ctx) | _attr(ctx) << 4; +}; + +auto hex1_green = [](auto& ctx) +{ + _val(ctx).green_ = _attr(ctx) | _attr(ctx) << 4; +}; + +auto hex1_blue = [](auto& ctx) +{ + _val(ctx).blue_ = _attr(ctx) | _attr(ctx) << 4; +}; + +auto hex1_opacity = [](auto& ctx) +{ + _val(ctx).alpha_ = _attr(ctx) | _attr(ctx) << 4; +}; + +auto const hex2_color_def = lit('#') >> hex2 >> hex2 >> hex2 >> (hex2 | attr(255)) ; +auto const hex1_color_def = lit('#') >> hex1[hex1_red] >> hex1[hex1_green] >> hex1[hex1_blue] >> (hex1[hex1_opacity] | attr(15)[hex1_opacity]); +auto const rgb_color_def = lit("rgb") >> lit('(') >> dec3 >> lit(',') >> dec3 >> lit(',') >> dec3 >> attr(255) >> lit(')'); + +auto const rgba_color_def = lit("rgba") + >> lit('(') >> dec3[dec_red] + >> lit(',') >> dec3[dec_green] + >> lit(',') >> dec3[dec_blue] + >> lit(',') >> double_[opacity] >> lit(')'); + +auto const svg2_color_def = no_case[named_colors] | hex2_color | hex1_color | rgb_color | rgba_color; + +BOOST_SPIRIT_DEFINE( + svg2_color, + hex2_color, + hex1_color, + rgb_color, + rgba_color + ); + +auto const expression = svg2_color; + +}} + + +#endif //MAPNIK_SVG_COLOR_GRAMMAR_DEF_HPP diff --git a/include/mapnik/well_known_srs.hpp b/include/mapnik/well_known_srs.hpp index eeb478ee3..246647813 100644 --- a/include/mapnik/well_known_srs.hpp +++ b/include/mapnik/well_known_srs.hpp @@ -49,11 +49,11 @@ static const double EARTH_DIAMETER = EARTH_RADIUS * 2.0; static const double EARTH_CIRCUMFERENCE = EARTH_DIAMETER * M_PI; static const double MAXEXTENT = EARTH_CIRCUMFERENCE / 2.0; static const double M_PI_by2 = M_PI / 2; -static const double D2R = M_PI / 180; -static const double R2D = 180 / M_PI; -static const double M_PIby360 = M_PI / 360; -static const double MAXEXTENTby180 = MAXEXTENT / 180; -static const double MAX_LATITUDE = R2D * (2 * std::atan(std::exp(180 * D2R)) - M_PI_by2); +static const double D2R = M_PI / 180.0; +static const double R2D = 180.0 / M_PI; +static const double M_PIby360 = M_PI / 360.0; +static const double MAXEXTENTby180 = MAXEXTENT / 180.0; +static const double MAX_LATITUDE = R2D * (2 * std::atan(std::exp(180.0 * D2R)) - M_PI_by2); static const std::string MAPNIK_LONGLAT_PROJ = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"; static const std::string MAPNIK_GMERC_PROJ = "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over"; @@ -61,23 +61,23 @@ boost::optional is_well_known_srs(std::string const& srs); boost::optional is_known_geographic(std::string const& srs); -static inline bool lonlat2merc(double * x, double * y , int point_count) +static inline bool lonlat2merc(double * x, double * y, std::size_t point_count) { - for(int i=0; i 180) x[i] = 180; else if (x[i] < -180) x[i] = -180; if (y[i] > MAX_LATITUDE) y[i] = MAX_LATITUDE; else if (y[i] < -MAX_LATITUDE) y[i] = -MAX_LATITUDE; x[i] = x[i] * MAXEXTENTby180; - y[i] = std::log(std::tan((90 + y[i]) * M_PIby360)) * R2D; - y[i] = y[i] * MAXEXTENTby180; + y[i] = std::log(std::tan((90.0 + y[i]) * M_PIby360)) * R2D * MAXEXTENTby180; } return true; } -static inline bool merc2lonlat(double * x, double * y , int point_count) +static inline bool merc2lonlat(double * x, double * y, std::size_t point_count) { - for(int i=0; i MAXEXTENT) x[i] = MAXEXTENT; else if (x[i] < -MAXEXTENT) x[i] = -MAXEXTENT;