add image/grid clear methods to make it easier to quickly re-use previously allocated objects for rendering - closes #1571

This commit is contained in:
Dane Springmeyer 2012-11-11 21:35:50 -08:00
parent 18395e8fd9
commit eebc8cc73e
6 changed files with 84 additions and 0 deletions

View file

@ -66,6 +66,7 @@ void export_grid()
.def("height",&mapnik::grid::height) .def("height",&mapnik::grid::height)
.def("view",&mapnik::grid::get_view) .def("view",&mapnik::grid::get_view)
.def("get_pixel",&get_pixel) .def("get_pixel",&get_pixel)
.def("clear",&mapnik::grid::clear)
.def("encode",encode, .def("encode",encode,
( boost::python::arg("encoding")="utf", boost::python::arg("features")=true,boost::python::arg("resolution")=4 ), ( boost::python::arg("encoding")="utf", boost::python::arg("features")=true,boost::python::arg("resolution")=4 ),
"Encode the grid as as optimized json\n" "Encode the grid as as optimized json\n"

View file

@ -235,6 +235,7 @@ void export_image()
.def("demultiply",&image_32::demultiply) .def("demultiply",&image_32::demultiply)
.def("set_pixel",&set_pixel) .def("set_pixel",&set_pixel)
.def("get_pixel",&get_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 //TODO(haoyu) The method name 'tostring' might be confusing since they actually return bytes in Python 3
.def("tostring",&tostring1) .def("tostring",&tostring1)

View file

@ -72,6 +72,11 @@ public:
return painted_; 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; boost::optional<color> const& get_background() const;
void set_background(const color& c); void set_background(const color& c);

View file

@ -82,6 +82,8 @@ public:
~hit_grid() {} ~hit_grid() {}
void clear();
inline void painted(bool painted) inline void painted(bool painted)
{ {
painted_ = painted; painted_ = painted;

View file

@ -65,6 +65,18 @@ hit_grid<T>::hit_grid(hit_grid<T> const& rhs)
data_.set(base_mask); data_.set(base_mask);
} }
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> template <typename T>
void hit_grid<T>::add_feature(mapnik::feature_impl & feature) void hit_grid<T>::add_feature(mapnik::feature_impl & feature)
{ {

View file

@ -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]