Merge branch 'master' of github.com:mapnik/mapnik into expr-v2

Conflicts:
	src/agg/process_building_symbolizer.cpp
	src/cairo_context.cpp
	src/cairo_renderer.cpp
	src/grid/process_building_symbolizer.cpp
	src/grid/process_line_pattern_symbolizer.cpp
	src/grid/process_text_symbolizer.cpp
	tests/python_tests/images/support/marker-text-line-scale-factor-0.899.png
	tests/python_tests/images/support/marker-text-line-scale-factor-1.5.png
	tests/python_tests/images/support/marker-text-line-scale-factor-1.png
	tests/python_tests/images/support/marker-text-line-scale-factor-10.png
	tests/python_tests/images/support/marker-text-line-scale-factor-100.png
	tests/python_tests/images/support/marker-text-line-scale-factor-2.png
	tests/python_tests/images/support/marker-text-line-scale-factor-5.png
	tests/visual_tests/images/lines-5-200-200-1.0-agg-reference.png
	tests/visual_tests/images/lines-5-200-200-2.0-agg-reference.png
	tests/visual_tests/images/lines-5-400-400-1.0-agg-reference.png
	tests/visual_tests/images/lines-5-400-400-2.0-agg-reference.png
	tests/visual_tests/images/lines-5-600-600-1.0-agg-reference.png
	tests/visual_tests/images/lines-5-600-600-2.0-agg-reference.png
	tests/visual_tests/images/lines-5-800-800-1.0-agg-reference.png
	tests/visual_tests/images/lines-5-800-800-2.0-agg-reference.png
	tests/visual_tests/images/lines-6-200-200-2.0-agg-reference.png
	tests/visual_tests/images/lines-6-400-400-2.0-agg-reference.png
	tests/visual_tests/images/lines-6-600-600-2.0-agg-reference.png
	tests/visual_tests/images/lines-6-800-800-2.0-agg-reference.png
	tests/visual_tests/test.py
This commit is contained in:
Dane Springmeyer 2014-04-24 21:44:28 -07:00
commit 9e9747ffad
118 changed files with 929 additions and 129 deletions

View file

@ -2,27 +2,34 @@ language: cpp
compiler:
- gcc
- clang
# http://about.travis-ci.org/blog/2013-11-29-postgresql-92-93-now-available/
addons:
postgresql: "9.3"
before_install:
# we need at least g++-4.7 for c++11 features
- if [ "${CXX}" = 'g++' ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi;
- sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
# grab more recent gdal/proj
- sudo add-apt-repository -y ppa:ubuntugis/ubuntugis-unstable
# more recent boost
- sudo add-apt-repository -y ppa:mapnik/boost
- sudo apt-get update -y
# upgrade compilers
- if [ "${CXX}" = 'g++' ]; then sudo apt-get install -y gcc-4.7 g++-4.7; fi;
- sudo apt-get install -y make libboost-dev libboost-filesystem-dev libboost-program-options-dev libboost-python-dev libboost-regex-dev libboost-system-dev libboost-thread-dev python-nose libicu-dev libpng-dev libjpeg-dev libtiff-dev libwebp-dev libz-dev libfreetype6-dev libxml2-dev libproj-dev libcairo-dev python-cairo-dev libsqlite3-dev postgresql-server-dev*
- sudo apt-get install -y gcc-4.8 g++-4.8
- sudo apt-get install -y make libboost-dev libboost-filesystem-dev libboost-program-options-dev libboost-python-dev libboost-regex-dev libboost-system-dev libboost-thread-dev python-nose libicu-dev libpng-dev libjpeg-dev libtiff-dev libwebp-dev libz-dev libfreetype6-dev libxml2-dev libproj-dev libcairo-dev python-cairo-dev libsqlite3-dev
- wget http://mapnik.s3.amazonaws.com/deps/harfbuzz-0.9.24.tar.bz2
- tar xf harfbuzz-0.9.24.tar.bz2
- cd harfbuzz-0.9.24
- ./configure && make && sudo make install
- sudo ldconfig
- cd ../
- createdb template_postgis
- psql -c "CREATE EXTENSION postgis" template_postgis
install:
- if [ "${CXX}" = 'g++' ]; then export CXX="g++-4.7" && export CC="gcc-4.7"; fi;
- if [ "${CXX}" = 'g++' ]; then export CXX="g++-4.8" && export CC="gcc-4.8"; fi;
- ./configure CXX=${CXX} CC=${CC} DEMO=False BINDINGS=${BINDINGS} BENCHMARK=${BENCHMARK} CPP_TESTS=${CPP_TESTS} CAIRO=True FAST=True || cat config.log
- JOBS=1 make
@ -45,4 +52,3 @@ notifications:
email:
on_success: [never]
on_failure: [change]

View file

@ -14,6 +14,12 @@ Released ...
Summary: TODO
- PostGIS: Added support for rendering 3D and 4D geometries (previously silently skipped) (#44)
- AGG renderer: fixed geometry offsetting to work after smoothing to produce more consistent results (#2202)
- AGG renderer: increased `vertex_dist_epsilon` to ensure nearly coincident points are discarded more readily (#2196)
- GDAL plugin: Added back support for user driven `nodata` on rgb(a) images (#2023)
- GDAL plugin: Allowed nodata to override alpha band if set on rgba images (#2023)

View file

@ -616,10 +616,12 @@ def parse_config(context, config, checks='--libs --cflags'):
if not parsed:
if config in ('GDAL_CONFIG'):
# optional deps...
env['SKIPPED_DEPS'].append(tool)
if tool not in env['SKIPPED_DEPS']:
env['SKIPPED_DEPS'].append(tool)
conf.rollback_option(config)
else: # freetype and libxml2, not optional
env['MISSING_DEPS'].append(tool)
if tool not in env['MISSING_DEPS']:
env['MISSING_DEPS'].append(tool)
context.Result( ret )
return ret
@ -675,7 +677,8 @@ def ogr_enabled(context):
context.Message( 'Checking if gdal is ogr enabled... ')
ret = context.TryAction('%s --ogr-enabled' % env['GDAL_CONFIG'])[0]
if not ret:
env['SKIPPED_DEPS'].append('ogr')
if 'ogr' not in env['SKIPPED_DEPS']:
env['SKIPPED_DEPS'].append('ogr')
context.Result( ret )
return ret
@ -1427,18 +1430,17 @@ if not preconfigured:
conf.parse_pg_config('PG_CONFIG')
elif plugin == 'ogr':
if conf.ogr_enabled():
if not 'gdal' in env['REQUESTED_PLUGINS']:
conf.parse_config('GDAL_CONFIG',checks='--libs')
if conf.parse_config('GDAL_CONFIG',checks='--libs'):
conf.parse_config('GDAL_CONFIG',checks='--cflags')
libname = conf.get_pkg_lib('GDAL_CONFIG','ogr')
if libname:
if not conf.CheckLibWithHeader(libname, details['inc'], details['lang']):
if 'gdal' not in env['SKIPPED_DEPS']:
env['SKIPPED_DEPS'].append('gdal')
if libname in env['LIBS']:
env['LIBS'].remove(libname)
else:
details['lib'] = libname
libname = conf.get_pkg_lib('GDAL_CONFIG','ogr')
if libname:
if not conf.CheckLibWithHeader(libname, details['inc'], details['lang']):
if 'gdal' not in env['SKIPPED_DEPS']:
env['SKIPPED_DEPS'].append('gdal')
if libname in env['LIBS']:
env['LIBS'].remove(libname)
else:
details['lib'] = libname
elif details['path'] and details['lib'] and details['inc']:
backup = env.Clone().Dictionary()
# Note, the 'delete_existing' keyword makes sure that these paths are prepended

View file

@ -25,8 +25,9 @@
// boost
#include <boost/version.hpp>
#include <boost/config.hpp>
#if BOOST_VERSION < 105300
#if BOOST_VERSION < 105300 || defined BOOST_NO_CXX11_SMART_PTR
// https://github.com/mapnik/mapnik/issues/2022
#include <memory>

View file

@ -27,7 +27,7 @@ namespace agg
//------------------------------------------------------vertex_dist_epsilon
// Coinciding points maximal distance (Epsilon)
const double vertex_dist_epsilon = 1e-14;
const double vertex_dist_epsilon = 1e-5;
//-----------------------------------------------------intersection_epsilon
// See calc_intersection

View file

@ -46,7 +46,6 @@ template <typename Geometry>
struct MAPNIK_DECL offset_converter
{
typedef std::size_t size_type;
//typedef typename Geometry::value_type value_type;
offset_converter(Geometry & geom)
: geom_(geom)
@ -62,10 +61,7 @@ struct MAPNIK_DECL offset_converter
enum status
{
initial,
process,
last_vertex,
angle_joint,
end
process
};
double get_offset() const
@ -98,19 +94,27 @@ struct MAPNIK_DECL offset_converter
unsigned vertex(double * x, double * y)
{
if (offset_ == 0.0)
{
return geom_.vertex(x, y);
}
if (status_ == initial)
{
init_vertices();
}
if (pos_ >= vertices_.size())
{
return SEG_END;
}
pre_ = (pos_ ? cur_ : pre_first_);
cur_ = vertices_[pos_++];
cur_ = vertices_.at(pos_++);
if (pos_ == vertices_.size())
{
return output_vertex(x, y);
}
double const check_dist = offset_ * threshold_;
double const check_dist2 = check_dist * check_dist;
@ -127,13 +131,19 @@ struct MAPNIK_DECL offset_converter
double const dy = u0.y - cur_.y;
if (dx*dx + dy*dy > check_dist2)
{
break;
}
if (!intersection(pre_, cur_, &vt, u0, u1, &ut))
{
continue;
}
if (vt < 0.0 || vt > t || ut < 0.0 || ut > 1.0)
{
continue;
}
t = vt;
pos_ = i+1;
@ -162,11 +172,17 @@ private:
static double explement_reflex_angle(double angle)
{
if (angle > pi)
{
return angle - 2 * pi;
}
else if (angle < -pi)
{
return angle + 2 * pi;
}
else
{
return angle;
}
}
static bool intersection(vertex2d const& u1, vertex2d const& u2, double* ut,
@ -186,7 +202,9 @@ private:
double const dn = vx * uy - ux * vy;
if (dn > -1e-6 && dn < 1e-6)
{
return false; // they are parallel
}
*vt = up / dn;
*ut = (*vt * vx + dx) / ux;
@ -200,7 +218,9 @@ private:
double const dn = vy * ux - uy * vx;
if (dn > -1e-6 && dn < 1e-6)
{
return false; // they are parallel
}
*vt = up / dn;
*ut = (*vt * vy + dy) / uy;
@ -251,7 +271,9 @@ private:
status init_vertices()
{
if (status_ != initial) // already initialized
{
return status_;
}
vertex2d v1(vertex2d::no_init);
vertex2d v2(vertex2d::no_init);
@ -261,7 +283,9 @@ private:
v2.cmd = geom_.vertex(&v2.x, &v2.y);
if (v2.cmd == SEG_END) // not enough vertices in source
{
return status_ = process;
}
double angle_a = 0;
double angle_b = std::atan2((v2.y - v1.y), (v2.x - v1.x));
@ -290,16 +314,24 @@ private:
if (offset_ < 0.0)
{
if (joint_angle > 0.0)
{
joint_angle = joint_angle - 2 * pi;
}
else
bulge_steps = 1 + int(std::floor(half_turns / pi));
{
bulge_steps = 1 + static_cast<int>(std::floor(half_turns / pi));
}
}
else
{
if (joint_angle < 0.0)
{
joint_angle = joint_angle + 2 * pi;
}
else
bulge_steps = 1 + int(floor(half_turns / pi));
{
bulge_steps = 1 + static_cast<int>(std::floor(half_turns / pi));
}
}
#ifdef MAPNIK_LOG
@ -322,7 +354,7 @@ private:
displace(w, v1, angle_a);
push_vertex(w);
for (int s = 0; ++s < bulge_steps; )
for (int s = 0; ++s < bulge_steps;)
{
displace(w, v1, angle_a + (joint_angle * s) / bulge_steps);
push_vertex(w);

View file

@ -36,9 +36,6 @@
// boost
// stl
#include <cassert>
extern "C"
{
#include <png.h>
@ -542,11 +539,9 @@ void save_as_png8_oct(T1 & file,
std::vector<rgb> pal;
trees[j].setOffset( static_cast<unsigned>(palette.size()));
trees[j].create_palette(pal);
assert(pal.size() <= opts.colors);
leftovers = cols[j] - static_cast<unsigned>(pal.size());
cols[j] = static_cast<unsigned>(pal.size());
palette.insert(palette.begin(), pal.begin(), pal.end());
assert(palette.size() <= 256);
}
}
@ -684,7 +679,6 @@ void save_as_png8_hex(T1 & file,
//transparency values per palette index
std::vector<mapnik::rgba> pal;
tree.create_palette(pal);
assert(int(pal.size()) <= opts.colors);
std::vector<mapnik::rgb> palette;
std::vector<unsigned> alphaTable;
for(unsigned i=0; i<pal.size(); i++)

View file

@ -171,8 +171,10 @@ private:
}
polygon_2d subject_poly;
double x,y;
double prev_x, prev_y;
double x = 0;
double y = 0;
double prev_x = 0;
double prev_y = 0;
geom_.rewind(0);
unsigned ring_count = 0;
while (true)

38
include/mapnik/std.hpp Normal file
View file

@ -0,0 +1,38 @@
/*****************************************************************************
*
* This file is part of Mapnik (c++ mapping toolkit)
*
* Copyright (C) 2014 Artem Pavlenko
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*****************************************************************************/
#ifndef MAPNIK_STD_HPP
#define MAPNIK_STD_HPP
#include <memory>
namespace std {
// C++14 backfill from http://herbsutter.com/gotw/_102/
template<typename T, typename ...Args>
inline ::std::unique_ptr<T> make_unique(Args&& ...args) {
return ::std::unique_ptr<T>(new T(::std::forward<Args>(args)...));
}
}
#endif

View file

@ -43,4 +43,4 @@ MAPNIK_DECL std::string dirname(std::string const& value);
#endif
#endif

View file

@ -71,4 +71,4 @@ inline void hsl2rgb(double h, double s, double l,
}
#endif // end MAPNIK_HSL_HPP
#endif // end MAPNIK_HSL_HPP

View file

@ -21,6 +21,7 @@
*****************************************************************************/
// mapnik
#include <mapnik/std.hpp>
#include <mapnik/global.hpp>
#include <mapnik/debug.hpp>
#include <mapnik/image_data.hpp>
@ -449,9 +450,9 @@ feature_ptr gdal_featureset::get_feature_at_point(mapnik::coord2d const& pt)
{
// construct feature
feature_ptr feature = feature_factory::create(ctx_,1);
geometry_type * point = new geometry_type(mapnik::geometry_type::types::Point);
std::unique_ptr<geometry_type> point = std::make_unique<geometry_type>(mapnik::geometry_type::types::Point);
point->move_to(pt.x, pt.y);
feature->add_geometry(point);
feature->add_geometry(point.release());
feature->put_new("value",value);
if (raster_has_nodata)
{

View file

@ -259,9 +259,9 @@ void occi_featureset::convert_geometry(SDOGeometry* geom, feature_ptr feature)
SDOPointType* sdopoint = geom->getSdo_point();
if (sdopoint && ! sdopoint->isNull())
{
geometry_type* point = new geometry_type(mapnik::geometry_type::types::Point);
std::unique_ptr<geometry_type> point = std::make_unique<geometry_type>(mapnik::geometry_type::types::Point);
point->move_to(sdopoint->getX(), sdopoint->getY());
feature->add_geometry(point);
feature->add_geometry(point.release());
}
}
break;

View file

@ -165,8 +165,8 @@ void ogr_datasource::init(mapnik::parameters const& params)
int num_layers = dataset_->GetLayerCount();
if (*layer_by_index >= num_layers)
{
std::ostringstream s("OGR Plugin: only ");
s << num_layers << " layer(s) exist, cannot find layer by index '" << *layer_by_index << "'";
std::ostringstream s;
s << "OGR Plugin: only " << num_layers << " layer(s) exist, cannot find layer by index '" << *layer_by_index << "'";
throw datasource_exception(s.str());
}
@ -214,7 +214,8 @@ void ogr_datasource::init(mapnik::parameters const& params)
if (! layer_.is_valid())
{
std::ostringstream s("OGR Plugin: ");
std::ostringstream s;
s << "OGR Plugin: ";
if (layer_by_name)
{
@ -452,8 +453,8 @@ void validate_attribute_names(query const& q, std::vector<attribute_descriptor>
if (! found_name)
{
std::ostringstream s("OGR Plugin: no attribute '");
s << *pos << "'. Valid attributes are: ";
std::ostringstream s;
s << "OGR Plugin: no attribute named '" << *pos << "'. Valid attributes are: ";
std::vector<attribute_descriptor>::const_iterator e_itr = names.begin();
std::vector<attribute_descriptor>::const_iterator e_end = names.end();
for ( ;e_itr!=e_end;++e_itr)

View file

@ -21,6 +21,7 @@
Import ('plugin_base')
Import ('env')
from copy import copy
PLUGIN_NAME = 'osm'
@ -37,9 +38,24 @@ plugin_sources = Split(
""" % locals()
)
plugin_env['LIBS'] = []
if env['RUNTIME_LINK'] == 'static':
# pkg-config is more reliable than pg_config across platforms
cmd = 'pkg-config libcurl --libs --static'
try:
plugin_env.ParseConfig(cmd)
except OSError, e:
# if this fails likely only system curl is available
# on OS X at least the system curl lacks a pkg-config file
# so static linking is not viable anyway
plugin_env.Append(LIBS='curl')
else:
plugin_env.Append(LIBS='curl')
plugin_env.Append(LIBS='xml2')
# Link Library to Dependencies
libraries = [ 'xml2' ]
libraries.append('curl')
libraries = copy(plugin_env['LIBS'])
libraries.append(env['ICU_LIB_NAME'])
libraries.append('boost_system%s' % env['BOOST_APPEND'])

View file

@ -22,6 +22,7 @@
*****************************************************************************/
// mapnik
#include <mapnik/std.hpp>
#include <mapnik/geometry.hpp>
#include <mapnik/feature.hpp>
#include <mapnik/feature_factory.hpp>
@ -64,9 +65,9 @@ feature_ptr osm_featureset<filterT>::next()
feature = feature_factory::create(ctx_, cur_item->id);
double lat = static_cast<osm_node*>(cur_item)->lat;
double lon = static_cast<osm_node*>(cur_item)->lon;
geometry_type* point = new geometry_type(mapnik::geometry_type::types::Point);
std::unique_ptr<geometry_type> point = std::make_unique<geometry_type>(mapnik::geometry_type::types::Point);
point->move_to(lon, lat);
feature->add_geometry(point);
feature->add_geometry(point.release());
}
else if (dataset_->current_item_is_way())
{
@ -82,15 +83,12 @@ feature_ptr osm_featureset<filterT>::next()
if (!cur_item) return feature_ptr();
feature = feature_factory::create(ctx_, cur_item->id);
geometry_type* geom;
mapnik::geometry_type::types geom_type = mapnik::geometry_type::types::LineString;
if (static_cast<osm_way*>(cur_item)->is_polygon())
{
geom = new geometry_type(mapnik::geometry_type::types::Polygon);
}
else
{
geom = new geometry_type(mapnik::geometry_type::types::LineString);
geom_type = mapnik::geometry_type::types::Polygon;
}
std::unique_ptr<geometry_type> geom = std::make_unique<geometry_type>(geom_type);
geom->move_to(static_cast<osm_way*>(cur_item)->nodes[0]->lon,
static_cast<osm_way*>(cur_item)->nodes[0]->lat);
@ -102,7 +100,7 @@ feature_ptr osm_featureset<filterT>::next()
geom->line_to(static_cast<osm_way*>(cur_item)->nodes[count]->lon,
static_cast<osm_way*>(cur_item)->nodes[count]->lat);
}
feature->add_geometry(geom);
feature->add_geometry(geom.release());
}
else
{

View file

@ -34,23 +34,21 @@ plugin_sources = Split(
""" % locals()
)
# Link Library to Dependencies
cxxflags = []
plugin_env['LIBS'] = []
libraries = ['pq']
#if env['THREADING'] == 'multi':
# libraries.append('boost_thread%s' % env['BOOST_APPEND'])
if env['RUNTIME_LINK'] == 'static':
# pg_config does not seem to report correct deps of libpq
# on os x so resort to hardcoding for now
if env['PLATFORM'] == 'Darwin':
libraries.extend(['ldap', 'pam', 'ssl', 'crypto', 'krb5'])
else:
# TODO - parse back into libraries variable
plugin_env.ParseConfig('pg_config --libs')
if plugin_env['LIBS']:
libraries.extend(copy(plugin_env['LIBS']))
# pkg-config is more reliable than pg_config across platforms
cmd = 'pkg-config libpq --libs --static'
try:
plugin_env.ParseConfig(cmd)
except OSError, e:
plugin_env.Append(LIBS='pq')
else:
plugin_env.Append(LIBS='pq')
# Link Library to Dependencies
libraries = copy(plugin_env['LIBS'])
if env['PLUGIN_LINKING'] == 'shared':
libraries.insert(0,'mapnik')

View file

@ -77,32 +77,38 @@ public:
}
}
bool execute(std::string const& sql) const
bool execute(std::string const& sql)
{
#ifdef MAPNIK_STATS
mapnik::progress_timer __stats__(std::clog, std::string("postgis_connection::execute ") + sql);
#endif
PGresult *result = PQexec(conn_, sql.c_str());
if ( ! executeAsyncQuery(sql) ) return false;
PGresult *result = 0;
// fetch multiple times until NULL is returned,
// to handle multi-statement queries
while ( PGresult *tmp = getResult() ) {
if ( result ) PQclear(result);
result = tmp;
}
bool ok = (result && (PQresultStatus(result) == PGRES_COMMAND_OK));
if ( result ) PQclear(result);
return ok;
}
std::shared_ptr<ResultSet> executeQuery(std::string const& sql, int type = 0) const
std::shared_ptr<ResultSet> executeQuery(std::string const& sql, int type = 0)
{
#ifdef MAPNIK_STATS
mapnik::progress_timer __stats__(std::clog, std::string("postgis_connection::execute_query ") + sql);
#endif
PGresult* result = 0;
if (type == 1)
{
result = PQexecParams(conn_,sql.c_str(), 0, 0, 0, 0, 0, 1);
}
else
{
result = PQexec(conn_, sql.c_str());
if ( executeAsyncQuery(sql, type) ) {
// fetch multiple times until NULL is returned,
// to handle multi-statement queries
while ( PGresult *tmp = getResult() ) {
if ( result ) PQclear(result);
result = tmp;
}
}
if (! result || (PQresultStatus(result) != PGRES_TUPLES_OK))
@ -112,10 +118,7 @@ public:
err_msg += "\nin executeQuery Full sql was: '";
err_msg += sql;
err_msg += "'\n";
if (result)
{
PQclear(result);
}
if ( result ) PQclear(result);
throw mapnik::datasource_exception(err_msg);
}
@ -163,10 +166,15 @@ public:
return result;
}
PGresult* getResult()
{
PGresult *result = PQgetResult(conn_);
return result;
}
std::shared_ptr<ResultSet> getNextAsyncResult()
{
PGresult *result = PQgetResult(conn_);
PGresult *result = getResult();
if( result && (PQresultStatus(result) != PGRES_TUPLES_OK))
{
std::string err_msg = "Postgis Plugin: ";
@ -183,7 +191,7 @@ public:
std::shared_ptr<ResultSet> getAsyncResult()
{
PGresult *result = PQgetResult(conn_);
PGresult *result = getResult();
if ( !result || (PQresultStatus(result) != PGRES_TUPLES_OK))
{
std::string err_msg = "Postgis Plugin: ";

View file

@ -49,7 +49,7 @@
DATASOURCE_PLUGIN(postgis_datasource)
const double postgis_datasource::FMAX = std::numeric_limits<double>::max();
const double postgis_datasource::FMAX = std::numeric_limits<float>::max();
const std::string postgis_datasource::GEOMETRY_COLUMNS = "geometry_columns";
const std::string postgis_datasource::SPATIAL_REF_SYS = "spatial_ref_system";
@ -445,10 +445,19 @@ postgis_datasource::~postgis_datasource()
CnxPool_ptr pool = ConnectionManager::instance().getPool(creator_.id());
if (pool)
{
shared_ptr<Connection> conn = pool->borrowObject();
if (conn)
{
conn->close();
try {
shared_ptr<Connection> conn = pool->borrowObject();
if (conn)
{
conn->close();
}
} catch (mapnik::datasource_exception const& ex) {
// happens when borrowObject tries to
// create a new connection and fails.
// In turn, new connection would be needed
// when our broke and was thus no good to
// be borrowed
// See https://github.com/mapnik/mapnik/issues/2191
}
}
}
@ -1017,8 +1026,7 @@ boost::optional<mapnik::datasource::geometry_t> postgis_datasource::get_geometry
}
else // geometry
{
result.reset(mapnik::datasource::Collection);
return result;
g_type = "";
}
}
}

View file

@ -219,7 +219,7 @@ void agg_renderer<T0,T1>::start_style_processing(feature_type_style const& st)
{
int radius = 0;
mapnik::filter::filter_radius_visitor visitor(radius);
for(mapnik::filter::filter_type const& filter_tag : st.image_filters())
for (mapnik::filter::filter_type const& filter_tag : st.image_filters())
{
boost::apply_visitor(visitor, filter_tag);
}

View file

@ -21,6 +21,7 @@
*****************************************************************************/
// mapnik
#include <mapnik/std.hpp>
#include <mapnik/graphics.hpp>
#include <mapnik/feature.hpp>
#include <mapnik/agg_renderer.hpp>

View file

@ -84,8 +84,10 @@ void agg_renderer<T0,T1>::process(line_symbolizer const& sym,
typedef agg::pixfmt_custom_blend_rgba<blender_type, agg::rendering_buffer> pixfmt_comp_type;
typedef agg::renderer_base<pixfmt_comp_type> renderer_base;
typedef boost::mpl::vector<clip_line_tag, transform_tag,
offset_transform_tag, affine_transform_tag,
simplify_tag, smooth_tag, dash_tag, stroke_tag> conv_types;
affine_transform_tag,
simplify_tag, smooth_tag,
offset_transform_tag,
dash_tag, stroke_tag> conv_types;
pixfmt_comp_type pixf(buf);
pixf.comp_op(get<agg::comp_op_e>(sym, keys::comp_op, feature, agg::comp_op_src_over));

View file

@ -59,7 +59,8 @@ system = 'boost_system%s' % env['BOOST_APPEND']
# clear out and re-set libs for this env
# note: order matters on linux: see lorder | tsort
lib_env['LIBS'] = [filesystem,regex]
lib_env['LIBS'] = [filesystem,
regex]
if env['HAS_CAIRO']:
lib_env.Append(LIBS=env['CAIRO_ALL_LIBS'])

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(HAVE_CAIRO)
#include <mapnik/cairo_context.hpp>
#include <mapnik/text/text_properties.hpp>
#include <mapnik/font_set.hpp>
@ -524,3 +526,7 @@ cairo_face_ptr cairo_face_manager::get_face(face_ptr face)
}
}
} //ns mapnik
#endif

View file

@ -23,6 +23,7 @@
#if defined(HAVE_CAIRO)
// mapnik
#include <mapnik/std.hpp>
#include <mapnik/rule.hpp>
#include <mapnik/debug.hpp>
#include <mapnik/layer.hpp>
@ -334,8 +335,10 @@ void cairo_renderer_base::process(line_symbolizer const& sym,
proj_transform const& prj_trans)
{
typedef boost::mpl::vector<clip_line_tag, transform_tag,
offset_transform_tag, affine_transform_tag,
simplify_tag, smooth_tag, dash_tag, stroke_tag> conv_types;
affine_transform_tag,
simplify_tag, smooth_tag,
offset_transform_tag,
dash_tag, stroke_tag> conv_types;
cairo_save_restore guard(context_);
composite_mode_e comp_op = get<composite_mode_e>(sym, keys::comp_op, feature, src_over);
auto geom_transform = get_optional<transform_type>(sym, keys::geometry_transform);

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(GRID_RENDERER)
// mapnik
#include <mapnik/grid/grid.hpp>
#include <mapnik/debug.hpp>
@ -146,3 +148,5 @@ void hit_grid<T>::add_feature(mapnik::feature_impl & feature)
template class hit_grid<mapnik::value_integer>;
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(GRID_RENDERER)
// mapnik
#include <mapnik/grid/grid_rasterizer.hpp>
#include <mapnik/grid/grid_renderer.hpp>
@ -201,3 +203,5 @@ void grid_renderer<T>::render_marker(mapnik::feature_impl & feature, unsigned in
template class grid_renderer<grid>;
}
#endif

View file

@ -20,7 +20,10 @@
*
*****************************************************************************/
#if defined(GRID_RENDERER)
// mapnik
#include <mapnik/std.hpp>
#include <mapnik/feature.hpp>
#include <mapnik/grid/grid_rasterizer.hpp>
#include <mapnik/grid/grid_renderer.hpp>
@ -99,3 +102,5 @@ template void grid_renderer<grid>::process(building_symbolizer const&,
proj_transform const&);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(GRID_RENDERER)
// mapnik
#include <mapnik/feature.hpp>
#include <mapnik/grid/grid_rasterizer.hpp>
@ -67,7 +69,6 @@ void grid_renderer<T>::process(line_pattern_symbolizer const& sym,
double simplify_tolerance = get<value_double>(sym, keys::simplify_tolerance, feature, 0.0);
double smooth = get<value_double>(sym, keys::smooth, feature, false);
typedef coord_transform<CoordTransform,geometry_type> path_type;
typedef typename grid_renderer_base_type::pixfmt_type pixfmt_type;
typedef typename grid_renderer_base_type::pixfmt_type::color_type color_type;
typedef agg::renderer_scanline_bin_solid<grid_renderer_base_type> renderer_type;
@ -148,3 +149,6 @@ template void grid_renderer<grid>::process(line_pattern_symbolizer const&,
proj_transform const&);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(GRID_RENDERER)
// mapnik
#include <mapnik/feature.hpp>
#include <mapnik/grid/grid_rasterizer.hpp>
@ -122,3 +124,5 @@ template void grid_renderer<grid>::process(line_symbolizer const&,
proj_transform const&);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(GRID_RENDERER)
/*
porting notes -->
@ -151,3 +153,5 @@ template void grid_renderer<grid>::process(markers_symbolizer const&,
mapnik::feature_impl &,
proj_transform const&);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(GRID_RENDERER)
// mapnik
#include <mapnik/feature.hpp>
#include <mapnik/grid/grid_rasterizer.hpp>
@ -71,3 +73,5 @@ template void grid_renderer<grid>::process(point_symbolizer const&,
proj_transform const&);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(GRID_RENDERER)
// boost
@ -118,3 +120,6 @@ template void grid_renderer<grid>::process(polygon_pattern_symbolizer const&,
proj_transform const&);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(GRID_RENDERER)
// boost
@ -85,3 +87,5 @@ template void grid_renderer<grid>::process(polygon_symbolizer const&,
proj_transform const&);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(GRID_RENDERER)
// mapnik
#include <mapnik/feature.hpp>
#include <mapnik/debug.hpp>
@ -41,3 +43,5 @@ template void grid_renderer<grid>::process(raster_symbolizer const&,
proj_transform const&);
}
#endif

View file

@ -21,6 +21,8 @@
*
*****************************************************************************/
#if defined(GRID_RENDERER)
// mapnik
#include <mapnik/feature.hpp>
#include <mapnik/grid/grid_rasterizer.hpp>
@ -84,3 +86,5 @@ template void grid_renderer<grid>::process(shield_symbolizer const&,
proj_transform const&);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(GRID_RENDERER)
// mapnik
#include <mapnik/feature.hpp>
#include <mapnik/grid/grid_renderer.hpp>
@ -68,3 +70,4 @@ template void grid_renderer<grid>::process(text_symbolizer const&,
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(SVG_RENDERER)
// mapnik
#include <mapnik/svg/output/svg_renderer.hpp>
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(building_symbo
mapnik::feature_impl & feature,
proj_transform const& prj_trans);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(SVG_RENDERER)
// mapnik
#include <mapnik/svg/output/svg_renderer.hpp>
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(line_pattern_s
mapnik::feature_impl & feature,
proj_transform const& prj_trans);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(SVG_RENDERER)
// mapnik
#include <mapnik/svg/output/svg_renderer.hpp>
@ -48,3 +50,6 @@ template void svg_renderer<std::ostream_iterator<char> >::process(line_symbolize
mapnik::feature_impl & feature,
proj_transform const& prj_trans);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(SVG_RENDERER)
// mapnik
#include <mapnik/svg/output/svg_renderer.hpp>
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(markers_symbol
mapnik::feature_impl & feature,
proj_transform const& prj_trans);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(SVG_RENDERER)
// mapnik
#include <mapnik/svg/output/svg_renderer.hpp>
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(point_symboliz
mapnik::feature_impl & feature,
proj_transform const& prj_trans);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(SVG_RENDERER)
// mapnik
#include <mapnik/svg/output/svg_renderer.hpp>
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(polygon_patter
mapnik::feature_impl & feature,
proj_transform const& prj_trans);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(SVG_RENDERER)
// mapnik
#include <mapnik/svg/output/svg_renderer.hpp>
@ -41,3 +43,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(polygon_symbol
mapnik::feature_impl & feature,
proj_transform const& prj_trans);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(SVG_RENDERER)
// mapnik
#include <mapnik/svg/output/svg_renderer.hpp>
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(raster_symboli
mapnik::feature_impl & feature,
proj_transform const& prj_trans);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(SVG_RENDERER)
// mapnik
#include <mapnik/svg/output/svg_renderer.hpp>
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(shield_symboli
mapnik::feature_impl & feature,
proj_transform const& prj_trans);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(SVG_RENDERER)
// mapnik
#include <mapnik/svg/output/svg_renderer.hpp>
@ -91,3 +93,6 @@ template bool svg_renderer<std::ostream_iterator<char> >::process(rule::symboliz
proj_transform const& prj_trans);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(SVG_RENDERER)
// mapnik
#include <mapnik/svg/output/svg_renderer.hpp>
@ -37,3 +39,5 @@ template void svg_renderer<std::ostream_iterator<char> >::process(text_symbolize
mapnik::feature_impl & feature,
proj_transform const& prj_trans);
}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(SVG_RENDERER)
// mapnik
#include <mapnik/svg/output/svg_generator.hpp>
#include <mapnik/geometry.hpp>
@ -109,3 +111,6 @@ namespace mapnik { namespace svg {
template class svg_generator<std::ostream_iterator<char> >;
}}
#endif

View file

@ -21,6 +21,8 @@
*
*****************************************************************************/
#if defined(SVG_RENDERER)
// mapnik
#include <mapnik/svg/output/svg_output_attributes.hpp>
@ -288,3 +290,6 @@ namespace mapnik { namespace svg {
svg_namespace_url_ = SVG_NAMESPACE_URL;
}
}}
#endif

View file

@ -20,6 +20,8 @@
*
*****************************************************************************/
#if defined(SVG_RENDERER)
// mapnik
#include <mapnik/debug.hpp>
#include <mapnik/svg/output/svg_renderer.hpp>
@ -102,3 +104,5 @@ void svg_renderer<T>::end_layer_processing(layer const& lay)
template class svg_renderer<std::ostream_iterator<char> >;
}
#endif

View file

@ -21,6 +21,7 @@
*****************************************************************************/
// mapnik
#include <mapnik/std.hpp>
#include <mapnik/debug.hpp>
#include <mapnik/image_reader.hpp>
@ -165,7 +166,7 @@ webp_reader<T>::webp_reader(std::string const& filename)
std::size_t file_size = end - beg;
file.seekg (0, std::ios::beg);
std::unique_ptr<buffer_policy_type> buffer(new buffer_policy_type(file_size));
auto buffer = std::make_unique<buffer_policy_type>(file_size);
file.read(reinterpret_cast<char*>(buffer->data()), buffer->size());
if (!file)
{

View file

@ -21,6 +21,7 @@
*****************************************************************************/
// mapnik
#include <mapnik/std.hpp>
#include <mapnik/debug.hpp>
#include <mapnik/global.hpp>
#include <mapnik/wkb.hpp>
@ -62,14 +63,31 @@ public:
wkbMultiLineString=5,
wkbMultiPolygon=6,
wkbGeometryCollection=7,
// Z
wkbPointZ=1001,
wkbLineStringZ=1002,
wkbPolygonZ=1003,
wkbMultiPointZ=1004,
wkbMultiLineStringZ=1005,
wkbMultiPolygonZ=1006,
wkbGeometryCollectionZ=1007
};
wkbGeometryCollectionZ=1007,
// M
wkbPointM=2001,
wkbLineStringM=2002,
wkbPolygonM=2003,
wkbMultiPointM=2004,
wkbMultiLineStringM=2005,
wkbMultiPolygonM=2006,
wkbGeometryCollectionM=2007,
// ZM
wkbPointZM=3001,
wkbLineStringZM=3002,
wkbPolygonZM=3003,
wkbMultiPointZM=3004,
wkbMultiLineStringZM=3005,
wkbMultiPolygonZM=3006,
wkbGeometryCollectionZM=3007
};
wkb_reader(const char* wkb, std::size_t size, wkbFormat format)
: wkb_(wkb),
@ -142,24 +160,50 @@ public:
read_collection(paths);
break;
case wkbPointZ:
case wkbPointM:
read_point_xyz(paths);
break;
case wkbPointZM:
read_point_xyzm(paths);
break;
case wkbLineStringZ:
case wkbLineStringM:
read_linestring_xyz(paths);
break;
case wkbLineStringZM:
read_linestring_xyzm(paths);
break;
case wkbPolygonZ:
case wkbPolygonM:
read_polygon_xyz(paths);
break;
case wkbPolygonZM:
read_polygon_xyzm(paths);
break;
case wkbMultiPointZ:
case wkbMultiPointM:
read_multipoint_xyz(paths);
break;
case wkbMultiPointZM:
read_multipoint_xyzm(paths);
break;
case wkbMultiLineStringZ:
case wkbMultiLineStringM:
read_multilinestring_xyz(paths);
break;
case wkbMultiLineStringZM:
read_multilinestring_xyzm(paths);
break;
case wkbMultiPolygonZ:
case wkbMultiPolygonM:
read_multipolygon_xyz(paths);
break;
case wkbMultiPolygonZM:
read_multipolygon_xyzm(paths);
break;
case wkbGeometryCollectionZ:
case wkbGeometryCollectionM:
case wkbGeometryCollectionZM:
read_collection(paths);
break;
default:
@ -245,12 +289,33 @@ private:
}
}
void read_coords_xyzm(CoordinateArray& ar)
{
if (! needSwap_)
{
for (unsigned i = 0; i < ar.size(); ++i)
{
read_double_ndr(wkb_ + pos_, ar[i].x);
read_double_ndr(wkb_ + pos_ + 8, ar[i].y);
pos_ += 32; // skip XYZM
}
}
else
{
for (unsigned i = 0; i < ar.size(); ++i)
{
read_double_xdr(wkb_ + pos_, ar[i].x);
read_double_xdr(wkb_ + pos_ + 8, ar[i].y);
pos_ += 32; // skip XYZM
}
}
}
void read_point(boost::ptr_vector<geometry_type> & paths)
{
double x = read_double();
double y = read_double();
std::unique_ptr<geometry_type> pt(new geometry_type(geometry_type::types::Point));
auto pt = std::make_unique<geometry_type>(geometry_type::types::Point);
pt->move_to(x, y);
paths.push_back(pt.release());
}
@ -269,12 +334,22 @@ private:
{
double x = read_double();
double y = read_double();
std::unique_ptr<geometry_type> pt(new geometry_type(geometry_type::types::Point));
auto pt = std::make_unique<geometry_type>(geometry_type::types::Point);
pos_ += 8; // double z = read_double();
pt->move_to(x, y);
paths.push_back(pt.release());
}
void read_point_xyzm(boost::ptr_vector<geometry_type> & paths)
{
double x = read_double();
double y = read_double();
std::auto_ptr<geometry_type> pt(new geometry_type(geometry_type::types::Point));
pos_ += 16;
pt->move_to(x, y);
paths.push_back(pt);
}
void read_multipoint_xyz(boost::ptr_vector<geometry_type> & paths)
{
int num_points = read_integer();
@ -285,6 +360,16 @@ private:
}
}
void read_multipoint_xyzm(boost::ptr_vector<geometry_type> & paths)
{
int num_points = read_integer();
for (int i = 0; i < num_points; ++i)
{
pos_ += 5;
read_point_xyzm(paths);
}
}
void read_linestring(boost::ptr_vector<geometry_type> & paths)
{
int num_points = read_integer();
@ -292,7 +377,7 @@ private:
{
CoordinateArray ar(num_points);
read_coords(ar);
std::unique_ptr<geometry_type> line(new geometry_type(geometry_type::types::LineString));
auto line = std::make_unique<geometry_type>(geometry_type::types::LineString);
line->move_to(ar[0].x, ar[0].y);
for (int i = 1; i < num_points; ++i)
{
@ -319,7 +404,7 @@ private:
{
CoordinateArray ar(num_points);
read_coords_xyz(ar);
std::unique_ptr<geometry_type> line(new geometry_type(geometry_type::types::LineString));
auto line = std::make_unique<geometry_type>(geometry_type::types::LineString);
line->move_to(ar[0].x, ar[0].y);
for (int i = 1; i < num_points; ++i)
{
@ -329,6 +414,23 @@ private:
}
}
void read_linestring_xyzm(boost::ptr_vector<geometry_type> & paths)
{
int num_points = read_integer();
if (num_points > 0)
{
CoordinateArray ar(num_points);
read_coords_xyzm(ar);
std::auto_ptr<geometry_type> line(new geometry_type(geometry_type::types::LineString));
line->move_to(ar[0].x, ar[0].y);
for (int i = 1; i < num_points; ++i)
{
line->line_to(ar[i].x, ar[i].y);
}
paths.push_back(line);
}
}
void read_multilinestring_xyz(boost::ptr_vector<geometry_type> & paths)
{
int num_lines = read_integer();
@ -339,13 +441,22 @@ private:
}
}
void read_multilinestring_xyzm(boost::ptr_vector<geometry_type> & paths)
{
int num_lines = read_integer();
for (int i = 0; i < num_lines; ++i)
{
pos_ += 5;
read_linestring_xyzm(paths);
}
}
void read_polygon(boost::ptr_vector<geometry_type> & paths)
{
int num_rings = read_integer();
if (num_rings > 0)
{
std::unique_ptr<geometry_type> poly(new geometry_type(geometry_type::types::Polygon));
auto poly = std::make_unique<geometry_type>(geometry_type::types::Polygon);
for (int i = 0; i < num_rings; ++i)
{
int num_points = read_integer();
@ -381,7 +492,7 @@ private:
int num_rings = read_integer();
if (num_rings > 0)
{
std::unique_ptr<geometry_type> poly(new geometry_type(geometry_type::types::Polygon));
auto poly = std::make_unique<geometry_type>(geometry_type::types::Polygon);
for (int i = 0; i < num_rings; ++i)
{
int num_points = read_integer();
@ -402,6 +513,32 @@ private:
}
}
void read_polygon_xyzm(boost::ptr_vector<geometry_type> & paths)
{
int num_rings = read_integer();
if (num_rings > 0)
{
std::auto_ptr<geometry_type> poly(new geometry_type(geometry_type::types::Polygon));
for (int i = 0; i < num_rings; ++i)
{
int num_points = read_integer();
if (num_points > 0)
{
CoordinateArray ar(num_points);
read_coords_xyzm(ar);
poly->move_to(ar[0].x, ar[0].y);
for (int j = 1; j < num_points; ++j)
{
poly->line_to(ar[j].x, ar[j].y);
}
poly->close_path();
}
}
if (poly->size() > 2) // ignore if polygon has less than 3 vertices
paths.push_back(poly);
}
}
void read_multipolygon_xyz(boost::ptr_vector<geometry_type> & paths)
{
int num_polys = read_integer();
@ -412,6 +549,16 @@ private:
}
}
void read_multipolygon_xyzm(boost::ptr_vector<geometry_type> & paths)
{
int num_polys = read_integer();
for (int i = 0; i < num_polys; ++i)
{
pos_ += 5;
read_polygon_xyzm(paths);
}
}
void read_collection(boost::ptr_vector<geometry_type> & paths)
{
int num_geometries = read_integer();

View file

@ -20,6 +20,7 @@
#include <mapnik/symbolizer.hpp>
#include <vector>
#include <algorithm>
#include <mapnik/std.hpp>
#include "utils.hpp"
@ -43,9 +44,9 @@ int main(int argc, char** argv)
mapnik::transcoder tr("utf-8");
mapnik::value_unicode_string ustr = tr.transcode("hello world!");
feature->put("name",ustr);
mapnik::geometry_type * pt = new mapnik::geometry_type(mapnik::geometry_type::types::Point);
auto pt = std::make_unique<mapnik::geometry_type>(mapnik::geometry_type::types::Point);
pt->move_to(128,128);
feature->add_geometry(pt);
feature->add_geometry(pt.release());
std::shared_ptr<mapnik::memory_datasource> ds = std::make_shared<mapnik::memory_datasource>();
ds->push(feature);
mapnik::Map m(256,256);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View file

@ -164,6 +164,34 @@ INSERT INTO test11(label,geom) values ('label_7',GeomFromEWKT('SRID=4326;MULTIPO
INSERT INTO test11(label,geom) values ('label_8',GeomFromEWKT('SRID=4326;GEOMETRYCOLLECTION(POLYGON((1 1, 2 1, 2 2, 1 2,1 1)),POINT(2 3),LINESTRING(2 3,3 4))'));
"""
insert_table_12 = """
CREATE TABLE test12(gid serial PRIMARY KEY, name varchar(40), geom geometry);
INSERT INTO test12(name,geom) values ('Point',GeomFromEWKT('SRID=4326;POINT(0 0)'));
INSERT INTO test12(name,geom) values ('PointZ',GeomFromEWKT('SRID=4326;POINTZ(0 0 0)'));
INSERT INTO test12(name,geom) values ('PointM',GeomFromEWKT('SRID=4326;POINTM(0 0 0)'));
INSERT INTO test12(name,geom) values ('PointZM',GeomFromEWKT('SRID=4326;POINTZM(0 0 0 0)'));
INSERT INTO test12(name,geom) values ('MultiPoint',GeomFromEWKT('SRID=4326;MULTIPOINT(0 0, 1 1)'));
INSERT INTO test12(name,geom) values ('MultiPointZ',GeomFromEWKT('SRID=4326;MULTIPOINTZ(0 0 0, 1 1 1)'));
INSERT INTO test12(name,geom) values ('MultiPointM',GeomFromEWKT('SRID=4326;MULTIPOINTM(0 0 0, 1 1 1)'));
INSERT INTO test12(name,geom) values ('MultiPointZM',GeomFromEWKT('SRID=4326;MULTIPOINTZM(0 0 0 0, 1 1 1 1)'));
INSERT INTO test12(name,geom) values ('LineString',GeomFromEWKT('SRID=4326;LINESTRING(0 0, 1 1)'));
INSERT INTO test12(name,geom) values ('LineStringZ',GeomFromEWKT('SRID=4326;LINESTRINGZ(0 0 0, 1 1 1)'));
INSERT INTO test12(name,geom) values ('LineStringM',GeomFromEWKT('SRID=4326;LINESTRINGM(0 0 0, 1 1 1)'));
INSERT INTO test12(name,geom) values ('LineStringZM',GeomFromEWKT('SRID=4326;LINESTRINGZM(0 0 0 0, 1 1 1 1)'));
INSERT INTO test12(name,geom) values ('Polygon',GeomFromEWKT('SRID=4326;POLYGON((0 0, 1 1, 2 2, 0 0))'));
INSERT INTO test12(name,geom) values ('PolygonZ',GeomFromEWKT('SRID=4326;POLYGONZ((0 0 0, 1 1 1, 2 2 2, 0 0 0))'));
INSERT INTO test12(name,geom) values ('PolygonM',GeomFromEWKT('SRID=4326;POLYGONZ((0 0 0, 1 1 1, 2 2 2, 0 0 0))'));
INSERT INTO test12(name,geom) values ('PolygonZM',GeomFromEWKT('SRID=4326;POLYGONZM((0 0 0 0, 1 1 1 1, 2 2 2 2, 0 0 0 0))'));
INSERT INTO test12(name,geom) values ('MultiLineString',GeomFromEWKT('SRID=4326;MULTILINESTRING((0 0, 1 1),(2 2, 3 3))'));
INSERT INTO test12(name,geom) values ('MultiLineStringZ',GeomFromEWKT('SRID=4326;MULTILINESTRINGZ((0 0 0, 1 1 1),(2 2 2, 3 3 3))'));
INSERT INTO test12(name,geom) values ('MultiLineStringM',GeomFromEWKT('SRID=4326;MULTILINESTRINGM((0 0 0, 1 1 1),(2 2 2, 3 3 3))'));
INSERT INTO test12(name,geom) values ('MultiLineStringZM',GeomFromEWKT('SRID=4326;MULTILINESTRINGZM((0 0 0 0, 1 1 1 1),(2 2 2 2, 3 3 3 3))'));
INSERT INTO test12(name,geom) values ('MultiPolygon',GeomFromEWKT('SRID=4326;MULTIPOLYGON(((0 0, 1 1, 2 2, 0 0)),((0 0, 1 1, 2 2, 0 0)))'));
INSERT INTO test12(name,geom) values ('MultiPolygonZ',GeomFromEWKT('SRID=4326;MULTIPOLYGONZ(((0 0 0, 1 1 1, 2 2 2, 0 0 0)),((0 0 0, 1 1 1, 2 2 2, 0 0 0)))'));
INSERT INTO test12(name,geom) values ('MultiPolygonM',GeomFromEWKT('SRID=4326;MULTIPOLYGONM(((0 0 0, 1 1 1, 2 2 2, 0 0 0)),((0 0 0, 1 1 1, 2 2 2, 0 0 0)))'));
INSERT INTO test12(name,geom) values ('MultiPolygonZM',GeomFromEWKT('SRID=4326;MULTIPOLYGONZM(((0 0 0 0, 1 1 1 1, 2 2 2 2, 0 0 0 0)),((0 0 0 0, 1 1 1 1, 2 2 2 2, 0 0 0 0)))'));
"""
def postgis_setup():
call('dropdb %s' % MAPNIK_TEST_DBNAME,silent=True)
@ -182,6 +210,7 @@ def postgis_setup():
call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_9),silent=False)
call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_10),silent=False)
call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_11),silent=False)
call('''psql -q %s -c "%s"''' % (MAPNIK_TEST_DBNAME,insert_table_12),silent=False)
def postgis_takedown():
pass
@ -757,6 +786,231 @@ if 'postgis' in mapnik.DatasourceCache.plugin_names() \
# This used to raise an exception before correction of issue 2042
mapnik.render_to_file(map2,'world2.png', 'png')
def test_handling_of_zm_dimensions():
ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,
table='(select gid,ST_CoordDim(geom) as dim,name,geom from test12) as tmp',
geometry_field='geom')
eq_(len(ds.fields()),3)
eq_(ds.fields(),['gid', 'dim', 'name'])
eq_(ds.field_types(),['int', 'int', 'str'])
fs = ds.featureset()
# Point (2d)
feat = fs.next()
eq_(feat.id(),1)
eq_(feat['gid'],1)
eq_(feat['dim'],2)
eq_(feat['name'],'Point')
geoms = feat.geometries()
eq_(len(geoms),1)
eq_(geoms[0].to_wkt(),'Point(0 0)')
# PointZ
feat = fs.next()
eq_(feat.id(),2)
eq_(feat['gid'],2)
eq_(feat['dim'],3)
eq_(feat['name'],'PointZ')
geoms = feat.geometries()
eq_(len(geoms),1)
eq_(geoms[0].to_wkt(),'Point(0 0)')
# PointM
feat = fs.next()
eq_(feat.id(),3)
eq_(feat['gid'],3)
eq_(feat['dim'],3)
eq_(feat['name'],'PointM')
geoms = feat.geometries()
eq_(len(geoms),1)
eq_(geoms[0].to_wkt(),'Point(0 0)')
# PointZM
feat = fs.next()
eq_(feat.id(),4)
eq_(feat['gid'],4)
eq_(feat['dim'],4)
eq_(feat['name'],'PointZM')
geoms = feat.geometries()
eq_(len(geoms),1)
eq_(geoms[0].to_wkt(),'Point(0 0)')
# MultiPoint
feat = fs.next()
eq_(feat.id(),5)
eq_(feat['gid'],5)
eq_(feat['dim'],2)
eq_(feat['name'],'MultiPoint')
geoms = feat.geometries()
eq_(len(geoms),2)
eq_(geoms[0].to_wkt(),'Point(0 0)')
eq_(geoms[1].to_wkt(),'Point(1 1)')
# MultiPointZ
feat = fs.next()
eq_(feat.id(),6)
eq_(feat['gid'],6)
eq_(feat['dim'],3)
eq_(feat['name'],'MultiPointZ')
geoms = feat.geometries()
eq_(len(geoms),2)
eq_(geoms[0].to_wkt(),'Point(0 0)')
eq_(geoms[1].to_wkt(),'Point(1 1)')
# MultiPointM
feat = fs.next()
eq_(feat.id(),7)
eq_(feat['gid'],7)
eq_(feat['dim'],3)
eq_(feat['name'],'MultiPointM')
geoms = feat.geometries()
eq_(len(geoms),2)
eq_(geoms[0].to_wkt(),'Point(0 0)')
eq_(geoms[1].to_wkt(),'Point(1 1)')
# MultiPointZM
feat = fs.next()
eq_(feat.id(),8)
eq_(feat['gid'],8)
eq_(feat['dim'],4)
eq_(feat['name'],'MultiPointZM')
geoms = feat.geometries()
eq_(len(geoms),2)
eq_(geoms[0].to_wkt(),'Point(0 0)')
eq_(geoms[1].to_wkt(),'Point(1 1)')
# LineString
feat = fs.next()
eq_(feat.id(),9)
eq_(feat['gid'],9)
eq_(feat['dim'],2)
eq_(feat['name'],'LineString')
geoms = feat.geometries()
eq_(len(geoms),1)
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
# LineStringZ
feat = fs.next()
eq_(feat.id(),10)
eq_(feat['gid'],10)
eq_(feat['dim'],3)
eq_(feat['name'],'LineStringZ')
geoms = feat.geometries()
eq_(len(geoms),1)
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
# LineStringM
feat = fs.next()
eq_(feat.id(),11)
eq_(feat['gid'],11)
eq_(feat['dim'],3)
eq_(feat['name'],'LineStringM')
geoms = feat.geometries()
eq_(len(geoms),1)
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
# LineStringZM
feat = fs.next()
eq_(feat.id(),12)
eq_(feat['gid'],12)
eq_(feat['dim'],4)
eq_(feat['name'],'LineStringZM')
geoms = feat.geometries()
eq_(len(geoms),1)
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
# Polygon
feat = fs.next()
eq_(feat.id(),13)
eq_(feat['gid'],13)
eq_(feat['name'],'Polygon')
geoms = feat.geometries()
eq_(len(geoms),1)
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
# PolygonZ
feat = fs.next()
eq_(feat.id(),14)
eq_(feat['gid'],14)
eq_(feat['name'],'PolygonZ')
geoms = feat.geometries()
eq_(len(geoms),1)
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
# PolygonM
feat = fs.next()
eq_(feat.id(),15)
eq_(feat['gid'],15)
eq_(feat['name'],'PolygonM')
geoms = feat.geometries()
eq_(len(geoms),1)
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
# PolygonZM
feat = fs.next()
eq_(feat.id(),16)
eq_(feat['gid'],16)
eq_(feat['name'],'PolygonZM')
geoms = feat.geometries()
eq_(len(geoms),1)
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
# MultiLineString
feat = fs.next()
eq_(feat.id(),17)
eq_(feat['gid'],17)
eq_(feat['name'],'MultiLineString')
geoms = feat.geometries()
eq_(len(geoms),2)
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
eq_(geoms[1].to_wkt(),'LineString(2 2,3 3)')
# MultiLineStringZ
feat = fs.next()
eq_(feat.id(),18)
eq_(feat['gid'],18)
eq_(feat['name'],'MultiLineStringZ')
geoms = feat.geometries()
eq_(len(geoms),2)
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
eq_(geoms[1].to_wkt(),'LineString(2 2,3 3)')
# MultiLineStringM
feat = fs.next()
eq_(feat.id(),19)
eq_(feat['gid'],19)
eq_(feat['name'],'MultiLineStringM')
geoms = feat.geometries()
eq_(len(geoms),2)
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
eq_(geoms[1].to_wkt(),'LineString(2 2,3 3)')
# MultiLineStringZM
feat = fs.next()
eq_(feat.id(),20)
eq_(feat['gid'],20)
eq_(feat['name'],'MultiLineStringZM')
geoms = feat.geometries()
eq_(len(geoms),2)
eq_(geoms[0].to_wkt(),'LineString(0 0,1 1)')
eq_(geoms[1].to_wkt(),'LineString(2 2,3 3)')
# MultiPolygon
feat = fs.next()
eq_(feat.id(),21)
eq_(feat['gid'],21)
eq_(feat['name'],'MultiPolygon')
geoms = feat.geometries()
eq_(len(geoms),2)
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
eq_(geoms[1].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
# MultiPolygonZ
feat = fs.next()
eq_(feat.id(),22)
eq_(feat['gid'],22)
eq_(feat['name'],'MultiPolygonZ')
geoms = feat.geometries()
eq_(len(geoms),2)
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
eq_(geoms[1].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
# MultiPolygonM
feat = fs.next()
eq_(feat.id(),23)
eq_(feat['gid'],23)
eq_(feat['name'],'MultiPolygonM')
geoms = feat.geometries()
eq_(len(geoms),2)
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
eq_(geoms[1].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
# MultiPolygonZM
feat = fs.next()
eq_(feat.id(),24)
eq_(feat['gid'],24)
eq_(feat['name'],'MultiPolygonZM')
geoms = feat.geometries()
eq_(len(geoms),2)
eq_(geoms[0].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
eq_(geoms[1].to_wkt(),'Polygon((0 0,1 1,2 2,0 0))')
atexit.register(postgis_takedown)

View file

@ -44,9 +44,9 @@ if 'shape' in mapnik.DatasourceCache.plugin_names():
mapnik.render(m,im)
actual = '/tmp/mapnik-wgs842merc-reprojection-render.png'
expected = 'images/support/mapnik-wgs842merc-reprojection-render.png'
im.save(actual)
im.save(actual,'png32')
expected_im = mapnik.Image.open(expected)
eq_(im.tostring(),expected_im.tostring(), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
def test_visual_zoom_all_rendering2():
m = mapnik.Map(512,512)
@ -56,9 +56,9 @@ if 'shape' in mapnik.DatasourceCache.plugin_names():
mapnik.render(m,im)
actual = '/tmp/mapnik-merc2wgs84-reprojection-render.png'
expected = 'images/support/mapnik-merc2wgs84-reprojection-render.png'
im.save(actual)
im.save(actual,'png32')
expected_im = mapnik.Image.open(expected)
eq_(im.tostring(),expected_im.tostring(), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
# maximum-extent read from map.xml
def test_visual_zoom_all_rendering3():
@ -69,9 +69,9 @@ if 'shape' in mapnik.DatasourceCache.plugin_names():
mapnik.render(m,im)
actual = '/tmp/mapnik-merc2merc-reprojection-render1.png'
expected = 'images/support/mapnik-merc2merc-reprojection-render1.png'
im.save(actual)
im.save(actual,'png32')
expected_im = mapnik.Image.open(expected)
eq_(im.tostring(),expected_im.tostring(), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
# no maximum-extent
def test_visual_zoom_all_rendering4():
@ -83,9 +83,9 @@ if 'shape' in mapnik.DatasourceCache.plugin_names():
mapnik.render(m,im)
actual = '/tmp/mapnik-merc2merc-reprojection-render2.png'
expected = 'images/support/mapnik-merc2merc-reprojection-render2.png'
im.save(actual)
im.save(actual,'png32')
expected_im = mapnik.Image.open(expected)
eq_(im.tostring(),expected_im.tostring(), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
eq_(im.tostring('png32'),expected_im.tostring('png32'), 'failed comparing actual (%s) and expected (%s)' % (actual,'tests/python_tests/'+ expected))
if __name__ == "__main__":
setup()

View file

@ -39,7 +39,7 @@ def compare_map(xml):
new_map = mapnik.Map(256, 256)
mapnik.load_map(new_map, test_map,False,absolute_base)
open(test_map2,'w').write(mapnik.save_map_to_string(new_map))
diff = ' diff %s %s' % (os.path.abspath(test_map),os.path.abspath(test_map2))
diff = ' diff -u %s %s' % (os.path.abspath(test_map),os.path.abspath(test_map2))
try:
eq_(open(test_map).read(),open(test_map2).read())
except AssertionError, e:

View file

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
import os
import sys
import mapnik
@ -10,6 +11,11 @@ except ImportError:
COMPUTE_THRESHOLD = 16
# testcase images are generated on OS X
# so they should exactly match
if os.uname()[0] == 'Darwin':
COMPUTE_THRESHOLD = 2
# returns true if pixels are not identical
def compare_pixels(pixel1, pixel2, alpha=True):
if pixel1 == pixel2:

BIN
tests/visual_tests/data/line.dbf Executable file

Binary file not shown.

BIN
tests/visual_tests/data/line.shp Executable file

Binary file not shown.

BIN
tests/visual_tests/data/line.shx Executable file

Binary file not shown.

View file

@ -0,0 +1,137 @@
{
"keys": [
"",
"1"
],
"data": {},
"grid": [
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" !!! !! ",
" !!!!!!!!! !!!!!!!! ",
" !!! !!!! !!!! !!! ",
" !!! !!!!! !!! !!! !!!!! !! ",
" !! !!!!!!!! !!! !!! !!!!!!!! !! ",
" !!!!! ! !! !! !!! !! !! !!! !! ",
" !! !! !!!!! !! !! !! !! !!!!! !!!!!! ",
" !! ! !!! !!!!! !! !! !! !!! !! !! !!! ",
" !! !! !!!!!!! !!!! !! !! !!!!!!!!! !! !! ",
" !! !!!!!!! !! !! !! !! !!!!!!!!!!!!!! !! !! ",
" !!!! !!!! !! ! !! !!!!!!!!! !!!!!! !! ",
" !! !! !!! !! !!!! !! !!!!! !!!!!!!!! ",
" !! ! !!! !!!!! ! !! !!!!!!!!!!!!!! !!!!! !!! ",
" !! !! !!! !!!!!!! !! !!!!!!!!!!! !!!!! !!!!! !! ",
" !! !!!!! !!!!!! !!!! !! !!!!!! !!!!!!!!! !! ",
" !!!! !! !! !!! !!!! !! !!!!! !!!! !!!!!!!! !! ",
" !! !! !! !! !!!!! !! !! !!!!! !!!!!!!!!! !!!! !!!!!! ",
" !! !!!! !!! !!! ! !! !!!!!!!!! !!! !!!! !!!! !! !!! ",
" !! !!!!! !! !!! !!!! !!! !!!!! !!! !!!! !!!!!! !! ",
" !! !!!! !! !! !!!!! !! !!! !!!!! !! !!! !!!!!!! !! ",
" !!!! !! !!! !!!! !!!!! !!! !!!! !!!!!!!! !!! !!!!!!! !! ",
" !! !!!!! !! !!! !!!!! !! !!!!!!! !!!!!!!!! !!! !!! !!!!!! ",
" !! !!!! !! !! !!!!! !! !! !!! !! !! !!! !!!!!! !!! ",
" !! !!!!! !! !! !! !!!!! !!! !!!!! !! !!!!!! !! ",
" !! !!!!!!! !!! !!!!! !! !!!! !!!!!! !! !!!!!!! !! ",
" !!!! !! !! !! !!!!! !!!!!!!! !!! !! !! !!!!!!! !! ",
" !! !!!!!!! !! !!!!!! !!!!! !!!!!! !!! !!!!!!!!!!",
" !! !!!! !! !!! ! !!! !!!! !! !! !!!!!!! !!",
" !! !! !!!! !! !!!!!! !!!! !! !! !!!!!!! !",
" !! !!!!!!! !! !!!! !!!!!!!!!!!!!!! !!!!!!!! !! ",
" !!!! !!!! !! !! !! !!!!!! !! !! !! !!!!!!!!",
" !! !! !!!! !! !!!! !! !! !!!!!!! !!",
" !! !!!! !! !! !! !! !!! !!! !! !! !! !",
" !! !! !!!! !! !! !!!! !!!!!!!! !! !!!!! ",
" !! !! !!!! !! !!!!!!!!!!! !! !! !! !!!",
" !! ! !! !! !! !! !! !!! !! !!!! !!!",
" !! !! !!!! !! !!!!!!!! !! !! !! !!",
" !! !! !!!! !! !!! !!! !! !!!! !!",
" ! !! !!!!! !! !!!! !!! !! !!!!",
" !! !! !!!! !! !!!!!! !!!! !",
" !! !! !!!! !! !! !!!",
" !! !! !!!!! !! !! !! ",
" !! !! !!!! !! !!!! ",
" ! !! !!!!! !! !! ",
" !! !! !!!!! !! ",
" !! !! !!!!!!! ",
" !! !! !!!!! !! ",
" !! !! !!!!! !! ",
" ! !! !!!!!!!! ",
" !! !! !!!!! !! ",
" !! !! !!!!! !! ",
" !! !! !!!!!!!! ",
" !!!!!!!! !! !! !!!!! !! ",
" !!!! !!!!! ! !! !!!!!! !! ",
" !!! !!!! !!!! !! !! !!!!!! ! ",
" !! !!!!!!!! !!!! !! !! ! !!! !! ",
" !! !!! !!!! !!!! !! !! !!!!!! !! ",
" !! !!! !!!!! !!!! !!!! !! !! !!!!!! ! ",
" !! !!! !!! !!!! !!!! !!!! !! !! !! !!!!!! ",
" !! !!! !! !!!!!!!! !!!! !!!! !! !! !!!!!! !! ",
" !! !!! !!!!!!!!!!!!!! !!!! !!! !!!! !! !!!! !! ",
"!! !!! !!!!! !!!!! !!!! !!! !! !! !! ! !!!! ",
"! !!! !!!! !!!!!!! !!!!!! !!! !! !! !! !!!!!! !! ",
" !!! !!! !!!!!!!!!! !!!!!! !! !!! !! !! !!!! !! ",
"!!! !!! !!!! !!! !! !!! !!!!! !! !!!! !!!! ",
"!! !!! !!! !!!!! !! !! !! !! !!!! !! !!!! !! ",
"! !!!! !! !!!!!!!! !! !! ! !! ! !! !! !!!! ! ",
" !!!! !! !!! !!! !! !!!!!! ! !!!! !! ! !! ",
"!!!! !! !!! !!! !! !!!!!! !! !! !!!! !! ",
"!!! !!! !! !!! !!!!!! !! !!!! !! !!!! ",
" !! !! !! !! !!!!!! !!!! !! !!!! !! ",
"!! !! !! !! !!!! !!!!! !!!! !! !! ",
"!!!! !!! !! !!!! !! !! !! !!!! ",
" !! !! !! !! !!!!! !!!!! !! !! ",
" ! !! !!!!!!! !!!!!! !!!!! ! ",
" !! !! !!!!! !!!!! !! ",
" ! !! !!!!! !!!!! !! ",
" !! !!!!!!!!!!! !!! ",
" !! !!!!!!!!! !!! ",
" !! !!! !!! !!! ",
" !! !!!!! !!! ",
" !! !!! ",
" !!!!!!! ",
" !!!! ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" "
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5 KiB

After

Width:  |  Height:  |  Size: 5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Some files were not shown because too many files have changed in this diff Show more