diff --git a/src/mapnik_grid_view.cpp b/src/mapnik_grid_view.cpp index 4f34904c2c..568c15db1e 100644 --- a/src/mapnik_grid_view.cpp +++ b/src/mapnik_grid_view.cpp @@ -30,6 +30,8 @@ void GridView::Initialize(Handle target) { NODE_SET_PROTOTYPE_METHOD(constructor, "encode", encode); NODE_SET_PROTOTYPE_METHOD(constructor, "width", width); NODE_SET_PROTOTYPE_METHOD(constructor, "height", height); + NODE_SET_PROTOTYPE_METHOD(constructor, "isSolid", isSolid); + NODE_SET_PROTOTYPE_METHOD(constructor, "getPixel", getPixel); target->Set(String::NewSymbol("GridView"),constructor->GetFunction()); } @@ -71,9 +73,8 @@ Handle GridView::New(boost::shared_ptr grid_ptr, ) { HandleScope scope; - typedef boost::shared_ptr grid_view_ptr_type; - grid_view_ptr_type grid_view_ptr = boost::make_shared(grid_ptr->get_view(x,y,w,h)); - GridView* gv = new GridView(grid_view_ptr); + grid_view_ptr gb_ptr = boost::make_shared(grid_ptr->get_view(x,y,w,h)); + GridView* gv = new GridView(gb_ptr); Handle ext = External::New(gv); Handle obj = constructor->GetFunction()->NewInstance(1, &ext); return scope.Close(obj); @@ -95,6 +96,62 @@ Handle GridView::height(const Arguments& args) return scope.Close(Integer::New(g->get()->height())); } +Handle GridView::isSolid(const Arguments& args) +{ + HandleScope scope; + GridView* g = ObjectWrap::Unwrap(args.This()); + grid_view_ptr view = g->get(); + if (view->width() > 0 && view->height() > 0) + { + mapnik::grid_view::value_type const* first_row = view->getRow(0); + mapnik::grid_view::value_type const first_pixel = first_row[0]; + for (unsigned y = 0; y < view->height(); ++y) + { + mapnik::grid_view::value_type const * row = view->getRow(y); + for (unsigned x = 0; x < view->width(); ++x) + { + if (first_pixel != row[x]) + { + return scope.Close(Boolean::New(false)); + } + } + } + } + return scope.Close(Boolean::New(true)); +} + +Handle GridView::getPixel(const Arguments& args) +{ + HandleScope scope; + + + unsigned x(0); + unsigned y(0); + + if (args.Length() >= 2) { + if (!args[0]->IsNumber()) + return ThrowException(Exception::TypeError( + String::New("first arg, 'x' must be an integer"))); + if (!args[1]->IsNumber()) + return ThrowException(Exception::TypeError( + String::New("second arg, 'y' must be an integer"))); + x = args[0]->IntegerValue(); + y = args[1]->IntegerValue(); + } else { + return ThrowException(Exception::TypeError( + String::New("must supply x,y to query pixel color"))); + } + + GridView* g = ObjectWrap::Unwrap(args.This()); + grid_view_ptr view = g->get(); + if (x < view->width() && y < view->height()) + { + mapnik::grid_view::value_type const * row = view->getRow(y); + mapnik::grid_view::value_type const pixel = row[x]; + return Integer::New(pixel); + } + return Undefined(); +} Handle GridView::encodeSync(const Arguments& args) { diff --git a/src/mapnik_grid_view.hpp b/src/mapnik_grid_view.hpp index fce8db53ce..d53cf1f2d8 100644 --- a/src/mapnik_grid_view.hpp +++ b/src/mapnik_grid_view.hpp @@ -24,6 +24,8 @@ class GridView: public node::ObjectWrap { static Handle encode(const Arguments &args); static Handle width(const Arguments &args); static Handle height(const Arguments &args); + static Handle isSolid(const Arguments &args); + static Handle getPixel(const Arguments &args); GridView(grid_view_ptr gp); inline grid_view_ptr get() { return this_; } diff --git a/test/grid_view.test.js b/test/grid_view.test.js new file mode 100644 index 0000000000..b0cbc8397f --- /dev/null +++ b/test/grid_view.test.js @@ -0,0 +1,30 @@ +var mapnik = require('mapnik'); +var assert = require('assert'); +var fs = require('fs'); +var path = require('path'); + + +exports['test grid view getPixel'] = function(beforeExit) { + var grid = new mapnik.Grid(256, 256); + var view = grid.view(0,0,256,256); + assert.equal(view.isSolid(),true); + + var pixel = view.getPixel(0,0); + assert.equal(pixel,0); + + var map = new mapnik.Map(256, 256); + map.loadSync('./examples/stylesheet.xml'); + map.zoomAll(); + var options = {'layer': 0, + 'fields': ['NAME'] + }; + var grid = new mapnik.Grid(map.width, map.height, {key: '__id__'}); + map.render(grid, options, function(err, grid) { + + var view = grid.view(0,0,256,256); + assert.equal(view.isSolid(),false); + // hit alaska (USA is id 207) + assert.equal(view.getPixel(25,100),207); + }) + +};