#include "bench_framework.hpp"
#include <mapnik/map.hpp>
#include <mapnik/load_map.hpp>
#include <mapnik/graphics.hpp>
#include <mapnik/agg_renderer.hpp>
#include <mapnik/datasource_cache.hpp>

class test : public benchmark::test_case
{
    std::string xml_;
    mapnik::box2d<double> extent_;
public:
    test(mapnik::parameters const& params,
         std::string const& xml,
         mapnik::box2d<double> const& extent)
     : test_case(params),
       xml_(xml),
       extent_(extent)
      {}
    bool validate() const
    {
        mapnik::Map m(256,256);
        mapnik::load_map(m,xml_);
        m.zoom_to_box(extent_);
        mapnik::image_32 im(m.width(),m.height());
        mapnik::agg_renderer<mapnik::image_32> ren(m,im);
        ren.apply();
        //mapnik::save_to_file(im.data(),"test.png");
        return true;
    }
    bool operator()() const
    {
        mapnik::Map m(256,256);
        mapnik::load_map(m,xml_);
        m.zoom_to_box(extent_);
        for (unsigned i=0;i<iterations_;++i)
        {
            mapnik::image_32 im(m.width(),m.height());
            mapnik::agg_renderer<mapnik::image_32> ren(m,im);
            ren.apply();
        }
        return true;
    }
};


int main(int argc, char** argv)
{
    mapnik::parameters params;
    benchmark::handle_args(argc,argv,params);
    mapnik::datasource_cache::instance().register_datasources("./plugins/input/");
    mapnik::box2d<double> z1(-20037508.3428,-8317435.0606,20037508.3428,18399242.7298);
    // bbox for 16/10491/22911.png
    mapnik::box2d<double> z16(-13622912.929097254,6026906.8062295765,-13621689.93664469,6028129.79868214);
    {
        test test_runner(params,
                          "benchmark/data/polygon_rendering_clip.xml",
                          z1);
        run(test_runner,"polygon clip render z1");        
    }
    {
        test test_runner(params,
                          "benchmark/data/polygon_rendering_no_clip.xml",
                          z1);
        run(test_runner,"polygon noclip render z1");        
    }
    {
        test test_runner(params,
                          "benchmark/data/polygon_rendering_clip.xml",
                          z16);
        run(test_runner,"polygon clip render z16");        
    }
    {
        test test_runner(params,
                          "benchmark/data/polygon_rendering_no_clip.xml",
                          z16);
        run(test_runner,"polygon noclip render z16");        
    }
    return 0;
}