/* This file is part of Mapnik (c++ mapping toolkit) * Copyright (C) 2005 Artem Pavlenko * * Mapnik is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ //$Id$ #ifndef CSS_COLOR_PARSER_HPP #define CSS_COLOR_PARSER_HPP #include #include using namespace boost::spirit; namespace mapnik { template struct named_colors : public symbols { named_colors() { symbols::add ("aliceblue", ColorT(240, 248, 255)) ("antiquewhite", ColorT(250, 235, 215)) ("aqua", ColorT(0, 255, 255)) ("aquamarine", ColorT(127, 255, 212)) ("azure", ColorT(240, 255, 255)) ("beige", ColorT(245, 245, 220)) ("bisque", ColorT(255, 228, 196)) ("black", ColorT(0, 0, 0)) ("blanchedalmond", ColorT(255,235,205)) ("blue", ColorT(0, 0, 255)) ("blueviolet", ColorT(138, 43, 226)) ("brown", ColorT(165, 42, 42)) ("burlywood", ColorT(222, 184, 135)) ("cadetblue", ColorT(95, 158, 160)) ("chartreuse", ColorT(127, 255, 0)) ("chocolate", ColorT(210, 105, 30)) ("coral", ColorT(255, 127, 80)) ("cornflowerblue", ColorT(100, 149, 237)) ("cornsilk", ColorT(255, 248, 220)) ("crimson", ColorT(220, 20, 60)) ("cyan", ColorT(0, 255, 255)) ("darkblue", ColorT(0, 0, 139)) ("darkcyan", ColorT(0, 139, 139)) ("darkgoldenrod", ColorT(184, 134, 11)) ("darkgray", ColorT(169, 169, 169)) ("darkgreen", ColorT(0, 100, 0)) ("darkgrey", ColorT(169, 169, 169)) ("darkkhaki", ColorT(189, 183, 107)) ("darkmagenta", ColorT(139, 0, 139)) ("darkolivegreen", ColorT(85, 107, 47)) ("darkorange", ColorT(255, 140, 0)) ("darkorchid", ColorT(153, 50, 204)) ("darkred", ColorT(139, 0, 0)) ("darksalmon", ColorT(233, 150, 122)) ("darkseagreen", ColorT(143, 188, 143)) ("darkslateblue", ColorT(72, 61, 139)) ("darkslategrey", ColorT(47, 79, 79)) ("darkturquoise", ColorT(0, 206, 209)) ("darkviolet", ColorT(148, 0, 211)) ("deeppink", ColorT(255, 20, 147)) ("deepskyblue", ColorT(0, 191, 255)) ("dimgray", ColorT(105, 105, 105)) ("dimgrey", ColorT(105, 105, 105)) ("dodgerblue", ColorT(30, 144, 255)) ("firebrick", ColorT(178, 34, 34)) ("floralwhite", ColorT(255, 250, 240)) ("forestgreen", ColorT(34, 139, 34)) ("fuchsia", ColorT(255, 0, 255)) ("gainsboro", ColorT(220, 220, 220)) ("ghostwhite", ColorT(248, 248, 255)) ("gold", ColorT(255, 215, 0)) ("goldenrod", ColorT(218, 165, 32)) ("gray", ColorT(128, 128, 128)) ("grey", ColorT(128, 128, 128)) ("green", ColorT(0, 128, 0)) ("greenyellow", ColorT(173, 255, 47)) ("honeydew", ColorT(240, 255, 240)) ("hotpink", ColorT(255, 105, 180)) ("indianred", ColorT(205, 92, 92)) ("indigo", ColorT(75, 0, 130)) ("ivory", ColorT(255, 255, 240)) ("khaki", ColorT(240, 230, 140)) ("lavender", ColorT(230, 230, 250)) ("lavenderblush", ColorT(255, 240, 245)) ("lawngreen", ColorT(124, 252, 0)) ("lemonchiffon", ColorT(255, 250, 205)) ("lightblue", ColorT(173, 216, 230)) ("lightcoral", ColorT(240, 128, 128)) ("lightcyan", ColorT(224, 255, 255)) ("lightgoldenrodyellow", ColorT(250, 250, 210)) ("lightgray", ColorT(211, 211, 211)) ("lightgreen", ColorT(144, 238, 144)) ("lightgrey", ColorT(211, 211, 211)) ("lightpink", ColorT(255, 182, 193)) ("lightsalmon", ColorT(255, 160, 122)) ("lightseagreen", ColorT(32, 178, 170)) ("lightskyblue", ColorT(135, 206, 250)) ("lightslategray", ColorT(119, 136, 153)) ("lightslategrey", ColorT(119, 136, 153)) ("lightsteelblue", ColorT(176, 196, 222)) ("lightyellow", ColorT(255, 255, 224)) ("lime", ColorT(0, 255, 0)) ("limegreen", ColorT(50, 205, 50)) ("linen", ColorT(250, 240, 230)) ("magenta", ColorT(255, 0, 255)) ("maroon", ColorT(128, 0, 0)) ("mediumaquamarine", ColorT(102, 205, 170)) ("mediumblue", ColorT(0, 0, 205)) ("mediumorchid", ColorT(186, 85, 211)) ("mediumpurple", ColorT(147, 112, 219)) ("mediumseagreen", ColorT(60, 179, 113)) ("mediumslateblue", ColorT(123, 104, 238)) ("mediumspringgreen", ColorT(0, 250, 154)) ("mediumturquoise", ColorT(72, 209, 204)) ("mediumvioletred", ColorT(199, 21, 133)) ("midnightblue", ColorT(25, 25, 112)) ("mintcream", ColorT(245, 255, 250)) ("mistyrose", ColorT(255, 228, 225)) ("moccasin", ColorT(255, 228, 181)) ("navajowhite", ColorT(255, 222, 173)) ("navy", ColorT(0, 0, 128)) ("oldlace", ColorT(253, 245, 230)) ("olive", ColorT(128, 128, 0)) ("olivedrab", ColorT(107, 142, 35)) ("orange", ColorT(255, 165, 0)) ("orangered", ColorT(255, 69, 0)) ("orchid", ColorT(218, 112, 214)) ("palegoldenrod", ColorT(238, 232, 170)) ("palegreen", ColorT(152, 251, 152)) ("paleturquoise", ColorT(175, 238, 238)) ("palevioletred", ColorT(219, 112, 147)) ("papayawhip", ColorT(255, 239, 213)) ("peachpuff", ColorT(255, 218, 185)) ("peru", ColorT(205, 133, 63)) ("pink", ColorT(255, 192, 203)) ("plum", ColorT(221, 160, 221)) ("powderblue", ColorT(176, 224, 230)) ("purple", ColorT(128, 0, 128)) ("red", ColorT(255, 0, 0)) ("rosybrown", ColorT(188, 143, 143)) ("royalblue", ColorT(65, 105, 225)) ("saddlebrown", ColorT(139, 69, 19)) ("salmon", ColorT(250, 128, 114)) ("sandybrown", ColorT(244, 164, 96)) ("seagreen", ColorT(46, 139, 87)) ("seashell", ColorT(255, 245, 238)) ("sienna", ColorT(160, 82, 45)) ("silver", ColorT(192, 192, 192)) ("skyblue", ColorT(135, 206, 235)) ("slateblue", ColorT(106, 90, 205)) ("slategray", ColorT(112, 128, 144)) ("slategrey", ColorT(112, 128, 144)) ("snow", ColorT(255, 250, 250)) ("springgreen", ColorT(0, 255, 127)) ("steelblue", ColorT(70, 130, 180)) ("tan", ColorT(210, 180, 140)) ("teal", ColorT(0, 128, 128)) ("thistle", ColorT(216, 191, 216)) ("tomato", ColorT(255, 99, 71)) ("turquoise", ColorT(64, 224, 208)) ("violet", ColorT(238, 130, 238)) ("wheat", ColorT(245, 222, 179)) ("white", ColorT(255, 255, 255)) ("whitesmoke", ColorT(245, 245, 245)) ("yellow", ColorT(255, 255, 0)) ("yellowgreen", ColorT(154, 205, 50)) ; } }; template struct css_color_grammar : public grammar > { css_color_grammar(ActionsT& actions_) : actions(actions_) {} template struct definition { definition(css_color_grammar const& self) { hex6 = ch_p('#') >> uint6x_p[self.actions.hex6_]; hex3 = ch_p('#') >> uint3x_p[self.actions.hex3_]; rgb = str_p("rgb") >> '(' >> uint3_p[self.actions.red_] >> ',' >> uint3_p[self.actions.green_] >> ',' >> uint3_p[self.actions.blue_] >> ')'; rgb_percent = str_p("rgb") >> '(' >> ureal_p[self.actions.red_p_] >> '%' >> ',' >> ureal_p[self.actions.green_p_] >> '%' >> ',' >> ureal_p[self.actions.blue_p_] >> '%' >> ')'; css_color = named_colors_p[self.actions.named_] | hex6 | hex3 | rgb_percent | rgb; } boost::spirit::rule rgb; boost::spirit::rule rgb_percent; boost::spirit::rule hex6; boost::spirit::rule hex3; boost::spirit::rule css_color; boost::spirit::rule const& start() const { return css_color; } uint_parser uint3_p; uint_parser uint6x_p; uint_parser uint3x_p; named_colors named_colors_p; }; ActionsT& actions; }; template struct named_color_action { named_color_action(ColorT& c) : c_(c) {} void operator() (ColorT const&c) const { c_=c; } ColorT& c_; }; template struct hex6_action { hex6_action(ColorT& c) : c_(c) {} void operator () (unsigned int hex) const { unsigned r = (hex >> 16) & 0xff; unsigned g = (hex >> 8) & 0xff; unsigned b = hex & 0xff; c_.set_red(r); c_.set_green(g); c_.set_blue(b); } ColorT& c_; }; template struct hex3_action { hex3_action(ColorT& c) : c_(c) {} void operator () (unsigned int hex) const { unsigned int r = (hex >> 8) & 0xf; unsigned int g = (hex >> 4) & 0xf; unsigned int b = hex & 0xf; c_.set_red( r | r << 4); c_.set_green(g | g << 4); c_.set_blue(b | b << 4); } ColorT& c_; }; template struct red_action { red_action(ColorT& c) : c_(c) {} void operator () (unsigned int r) const { c_.set_red(r); } ColorT& c_; }; template struct green_action { green_action(ColorT& c) : c_(c) {} void operator () (unsigned int g) const { c_.set_green(g); } ColorT& c_; }; template struct blue_action { blue_action(ColorT& c) : c_(c) {} void operator () (unsigned int b) const { c_.set_blue(b); } ColorT& c_; }; template struct red_action_p { red_action_p(ColorT& c) : c_(c) {} void operator () (double r) const { c_.set_red(unsigned((255.0 * r)/100.0 + 0.5)); } ColorT& c_; }; template struct green_action_p { green_action_p(ColorT& c) : c_(c) {} void operator () (double g) const { c_.set_green(unsigned((255.0 * g)/100.0 + 0.5)); } ColorT& c_; }; template struct blue_action_p { blue_action_p(ColorT& c) : c_(c) {} void operator () (double b) const { c_.set_blue(unsigned((255.0 * b)/100.0 + 0.5)); } ColorT& c_; }; template struct actions { typedef ColorT color_type; actions(ColorT& c) : named_(c), hex6_(c), hex3_(c), red_(c), green_(c), blue_(c), red_p_(c), green_p_(c), blue_p_(c) {} named_color_action named_; hex6_action hex6_; hex3_action hex3_; red_action red_; green_action green_; blue_action blue_; red_action_p red_p_; green_action_p green_p_; blue_action_p blue_p_; }; } #endif //CSS_COLOR_PARSER_HPP