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("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"
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
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