Permalink
Browse files

add image/grid clear methods to make it easier to quickly re-use prev…

…iously allocated objects for rendering - closes #1571
  • Loading branch information...
1 parent 18395e8 commit eebc8cc73eb18903b07e3b3e0757c11925962124 Dane Springmeyer committed Nov 12, 2012
@@ -66,6 +66,7 @@ void export_grid()
.def("height",&mapnik::grid::height)
.def("view",&mapnik::grid::get_view)
.def("get_pixel",&get_pixel)
+ .def("clear",&mapnik::grid::clear)
.def("encode",encode,
( boost::python::arg("encoding")="utf", boost::python::arg("features")=true,boost::python::arg("resolution")=4 ),
"Encode the grid as as optimized json\n"
@@ -235,6 +235,7 @@ void export_image()
.def("demultiply",&image_32::demultiply)
.def("set_pixel",&set_pixel)
.def("get_pixel",&get_pixel)
+ .def("clear",&image_32::clear)
//TODO(haoyu) The method name 'tostring' might be confusing since they actually return bytes in Python 3
.def("tostring",&tostring1)
@@ -72,6 +72,11 @@ class MAPNIK_DECL image_32
return painted_;
}
+ inline void clear()
+ {
+ std::memset(data_.getData(),0,sizeof(mapnik::image_data_32::pixel_type)*data_.width()*data_.height());
+ }
+
boost::optional<color> const& get_background() const;
void set_background(const color& c);
@@ -82,6 +82,8 @@ class MAPNIK_DECL hit_grid
~hit_grid() {}
+ void clear();
+
inline void painted(bool painted)
{
painted_ = painted;
View
@@ -66,6 +66,18 @@ hit_grid<T>::hit_grid(hit_grid<T> const& rhs)
}
template <typename T>
+void hit_grid<T>::clear()
+{
+ painted_ = false;
+ f_keys_.clear();
+ features_.clear();
+ names_.clear();
+ f_keys_[base_mask] = "";
+ data_.set(base_mask);
+ ctx_ = boost::make_shared<mapnik::context_type>();
+}
+
+template <typename T>
void hit_grid<T>::add_feature(mapnik::feature_impl & feature)
{
int feature_id = feature.id();
@@ -0,0 +1,63 @@
+import sys
+import os, mapnik
+from timeit import Timer, time
+from nose.tools import *
+from utilities import execution_path
+
+def setup():
+ # All of the paths used are relative, if we run the tests
+ # from another directory we need to chdir()
+ os.chdir(execution_path('.'))
+
+def test_clearing_image_data():
+ im = mapnik.Image(256,256)
+ # make sure it equals itself
+ bytes = im.tostring()
+ eq_(im.tostring(),bytes)
+ # set background, then clear
+ im.background = mapnik.Color('green')
+ eq_(im.tostring()!=bytes,True)
+ # clear image, should now equal original
+ im.clear()
+ eq_(im.tostring(),bytes)
+
+def make_map():
+ ds = mapnik.MemoryDatasource()
+ context = mapnik.Context()
+ context.push('Name')
+ pixel_key = 1
+ f = mapnik.Feature(context,pixel_key)
+ f['Name'] = str(pixel_key)
+ f.add_geometries_from_wkt('POLYGON ((0 0, 0 256, 256 256, 256 0, 0 0))')
+ ds.add_feature(f)
+ s = mapnik.Style()
+ r = mapnik.Rule()
+ symb = mapnik.PolygonSymbolizer()
+ r.symbols.append(symb)
+ s.rules.append(r)
+ lyr = mapnik.Layer('Places')
+ lyr.datasource = ds
+ lyr.styles.append('places_labels')
+ width,height = 256,256
+ m = mapnik.Map(width,height)
+ m.append_style('places_labels',s)
+ m.layers.append(lyr)
+ m.zoom_all()
+ return m
+
+def test_clearing_grid_data():
+ g = mapnik.Grid(256,256)
+ utf = g.encode()
+ # make sure it equals itself
+ eq_(g.encode(),utf)
+ m = make_map()
+ mapnik.render_layer(m,g,layer=0,fields=['__id__','Name'])
+ eq_(g.encode()!=utf,True)
+ # clear grid, should now match original
+ g.clear()
+ eq_(g.encode(),utf)
+
+
+if __name__ == "__main__":
+ setup()
+ [eval(run)() for run in dir() if 'test_' in run]

0 comments on commit eebc8cc

Please sign in to comment.