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:
parent
18395e8fd9
commit
eebc8cc73e
6 changed files with 84 additions and 0 deletions
|
@ -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 @@ public:
|
|||
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 @@ public:
|
|||
|
||||
~hit_grid() {}
|
||||
|
||||
void clear();
|
||||
|
||||
inline void painted(bool painted)
|
||||
{
|
||||
painted_ = painted;
|
||||
|
|
|
@ -65,6 +65,18 @@ hit_grid<T>::hit_grid(hit_grid<T> const& rhs)
|
|||
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>
|
||||
void hit_grid<T>::add_feature(mapnik::feature_impl & feature)
|
||||
{
|
||||
|
|
63
tests/python_tests/buffer_clear_test.py
Normal file
63
tests/python_tests/buffer_clear_test.py
Normal 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]
|
Loading…
Reference in a new issue