Added the ability for filter_image to throw properly with bad input and added the ability for a new image to be returned

This commit is contained in:
Blake Thompson 2015-08-11 19:22:09 -05:00
parent 75522c0cc5
commit 0b6b11b9cf
3 changed files with 53 additions and 8 deletions

View file

@ -18,6 +18,7 @@ Released: YYYY XX, 2015
- Added 3 new image-filters to simulate types of colorblindness (`color-blind-protanope`,`color-blind-deuteranope`,`color-blind-tritanope`)
- Fix so that null text boxes have no bounding boxes when attempting placement ( 162f82cba5b0fb984c425586c6a4b354917abc47 )
- Patch to add legacy method for setting JPEG quality in images ( #3024 )
- Added `filter_image` method which can modify an image in place or return a new image that is filtered.
## 3.0.2

View file

@ -951,7 +951,10 @@ template<typename Src>
void filter_image(Src & src, std::string const& filter)
{
std::vector<filter_type> filter_vector;
parse_image_filters(filter, filter_vector);
if(!parse_image_filters(filter, filter_vector))
{
throw std::runtime_error("Failed to parse filter argument in filter_image: '" + filter + "'");
}
filter_visitor<Src> visitor(src);
for (filter_type const& filter_tag : filter_vector)
{
@ -959,6 +962,23 @@ void filter_image(Src & src, std::string const& filter)
}
}
template<typename Src>
Src filter_image(Src const& src, std::string const& filter)
{
std::vector<filter_type> filter_vector;
if(!parse_image_filters(filter, filter_vector))
{
throw std::runtime_error("Failed to parse filter argument in filter_image: '" + filter + "'");
}
Src new_src(src);
filter_visitor<Src> visitor(new_src);
for (filter_type const& filter_tag : filter_vector)
{
util::apply_visitor(visitor, filter_tag);
}
return new_src;
}
} // End Namespace Filter
} // End Namespace Mapnik

View file

@ -15,14 +15,17 @@ SECTION("test bad filter input") {
mapnik::fill(im,mapnik::color("blue"));
mapnik::set_pixel(im, 1, 1, mapnik::color("red"));
// This will not throw as it is just ignored during parsing
// as if no filter is applied
mapnik::filter::filter_image(im, "foo,asdfasdf()");
mapnik::filter::filter_image(im, "colorize-alpha(");
mapnik::filter::filter_image(im, "color-to-alpha(blue");
mapnik::filter::filter_image(im, "color-to-alpha(,blue)");
mapnik::filter::filter_image(im, "colorize-alpha()");
REQUIRE_THROWS( mapnik::filter::filter_image(im, "foo,asdfasdf()"); );
REQUIRE_THROWS( mapnik::filter::filter_image(im, "colorize-alpha("); );
REQUIRE_THROWS( mapnik::filter::filter_image(im, "color-to-alpha(blue"); );
REQUIRE_THROWS( mapnik::filter::filter_image(im, "color-to-alpha(,blue)"); );
REQUIRE_THROWS( mapnik::filter::filter_image(im, "colorize-alpha()"); );
REQUIRE_THROWS(
mapnik::image_rgba8 const& im2 = im;
mapnik::image_rgba8 new_im = mapnik::filter::filter_image(im2, "foo");
);
CHECK(im(0,0) == 0xffff0000);
CHECK(im(0,1) == 0xffff0000);
CHECK(im(0,2) == 0xffff0000);
@ -55,6 +58,27 @@ SECTION("test blur") {
} // END SECTION
SECTION("test blur constant") {
mapnik::image_rgba8 im_orig(3,3);
mapnik::fill(im_orig,mapnik::color("blue"));
mapnik::set_pixel(im_orig, 1, 1, mapnik::color("red"));
mapnik::image_rgba8 const& im_new = im_orig;
mapnik::image_rgba8 im = mapnik::filter::filter_image(im_new, "blur");
CHECK(im(0,0) == 0xffc60038);
CHECK(im(0,1) == 0xffe2001c);
CHECK(im(0,2) == 0xffc60038);
CHECK(im(1,0) == 0xffc60038);
CHECK(im(1,1) == 0xffe2001c);
CHECK(im(1,2) == 0xffc60038);
CHECK(im(2,0) == 0xffc60038);
CHECK(im(2,1) == 0xffe2001c);
CHECK(im(2,2) == 0xffc60038);
} // END SECTION
SECTION("test gray") {
mapnik::image_rgba8 im(3,3);