[Pkg-javascript-commits] [node-mapnik] 05/08: Drop patches included upstream. Refresh remaining patches.
Bas Couwenberg
sebastic at debian.org
Sun Mar 4 12:56:24 UTC 2018
This is an automated email from the git hooks/post-receive script.
sebastic pushed a commit to branch master
in repository node-mapnik.
commit 1ec172f307fb5719a4d2ae68134f8cf7ee9c229a
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date: Sun Mar 4 13:22:51 2018 +0100
Drop patches included upstream. Refresh remaining patches.
---
debian/changelog | 1 +
debian/patches/852.patch | 144 --
debian/patches/no-mason.patch | 2 +-
debian/patches/series | 2 -
debian/patches/test_disable_raster_layer.patch | 4 +-
debian/patches/upstream-git.patch | 2495 ------------------------
debian/patches/use-packaged-dependencies.patch | 2 +-
7 files changed, 5 insertions(+), 2645 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index b4f9eb5..04db32a 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,6 +2,7 @@ node-mapnik (3.7.1+dfsg-1) UNRELEASED; urgency=medium
* Team upload.
* New upstream release.
+ * Drop patches included upstream. Refresh remaining patches.
-- Bas Couwenberg <sebastic at debian.org> Sun, 04 Mar 2018 13:19:24 +0100
diff --git a/debian/patches/852.patch b/debian/patches/852.patch
deleted file mode 100644
index 1342434..0000000
--- a/debian/patches/852.patch
+++ /dev/null
@@ -1,144 +0,0 @@
-From a904fe08b0121470eba66a72656b6d6208372c4c Mon Sep 17 00:00:00 2001
-From: Blake Thompson <flippmoke at gmail.com>
-Date: Mon, 5 Feb 2018 17:41:01 -0500
-Subject: [PATCH 1/4] Updates around removal of spherical merc class in mapnik
- vector tile
-
----
- src/mapnik_vector_tile.cpp | 13 +++++--------
- .../vector_tile/compositing/expected/2-1-1b.png | Bin 154739 -> 154748 bytes
- .../expected/world-reencode-max-extent.png | Bin 7993 -> 7992 bytes
- .../compositing/expected/world-reencode.png | Bin 7981 -> 7980 bytes
- test/vector-tile.test.js | 8 ++++----
- 5 files changed, 9 insertions(+), 12 deletions(-)
-
---- a/src/mapnik_vector_tile.cpp
-+++ b/src/mapnik_vector_tile.cpp
-@@ -5144,20 +5144,17 @@ void VectorTile::EIO_RenderTile(uv_work_
- try
- {
- mapnik::Map const& map_in = *closure->m->get();
-- mapnik::vector_tile_impl::spherical_mercator merc(closure->d->tile_size());
-- double minx,miny,maxx,maxy;
-+ mapnik::box2d<double> map_extent;
- if (closure->zxy_override)
- {
-- merc.xyz(closure->x,closure->y,closure->z,minx,miny,maxx,maxy);
-+ map_extent = mapnik::vector_tile_impl::tile_mercator_bbox(closure->x,closure->y,closure->z);
- }
- else
- {
-- merc.xyz(closure->d->get_tile()->x(),
-- closure->d->get_tile()->y(),
-- closure->d->get_tile()->z(),
-- minx,miny,maxx,maxy);
-+ map_extent = mapnik::vector_tile_impl::tile_mercator_bbox(closure->d->get_tile()->x(),
-+ closure->d->get_tile()->y(),
-+ closure->d->get_tile()->z());
- }
-- mapnik::box2d<double> map_extent(minx,miny,maxx,maxy);
- mapnik::request m_req(closure->width, closure->height, map_extent);
- m_req.set_buffer_size(closure->buffer_size);
- mapnik::projection map_proj(map_in.srs(),true);
---- a/test/vector-tile.test.js
-+++ b/test/vector-tile.test.js
-@@ -906,7 +906,7 @@ describe('mapnik.VectorTile ', function(
- it('should be able to change tile coordinates and it change the extent', function(done) {
- var vtile = new mapnik.VectorTile(9,112,195);
- var extent = vtile.extent();
-- var expected = [-11271098.44281895, 4696291.017841229, -11192826.925854929, 4774562.534805248];
-+ var expected = [-11271098.442818949, 4696291.017841229, -11192826.925854929, 4774562.534805249];
- // typically not different, but rounding can cause different values
- // so we assert each value's difference is nominal
- assert(Math.abs(extent[0] - expected[0]) < 1e-8);
-@@ -919,7 +919,7 @@ describe('mapnik.VectorTile ', function(
- vtile.x = 0;
- assert.equal(vtile.x, 0);
- extent = vtile.extent();
-- var expected_x = [-20037508.342789244, 4696291.017841229, -19959236.825825226, 4774562.534805248];
-+ var expected_x = [-20037508.342789244, 4696291.017841229, -19959236.82582522, 4774562.534805249];
- assert(Math.abs(extent[0] - expected_x[0]) < 1e-8);
- assert(Math.abs(extent[1] - expected_x[1]) < 1e-8);
- assert(Math.abs(extent[2] - expected_x[2]) < 1e-8);
-@@ -927,7 +927,7 @@ describe('mapnik.VectorTile ', function(
- vtile.y = 0;
- assert.equal(vtile.y, 0);
- extent = vtile.extent();
-- var expected_y = [-20037508.342789244, 19959236.825825218, -19959236.825825226, 20037508.342789277];
-+ var expected_y = [-20037508.342789244, 19959236.82582522, -19959236.82582522, 20037508.342789244];
- assert(Math.abs(extent[0] - expected_y[0]) < 1e-8);
- assert(Math.abs(extent[1] - expected_y[1]) < 1e-8);
- assert(Math.abs(extent[2] - expected_y[2]) < 1e-8);
-@@ -935,7 +935,7 @@ describe('mapnik.VectorTile ', function(
- vtile.z = 0;
- assert.equal(vtile.z, 0);
- extent = vtile.extent();
-- var expected_z = [-20037508.342789244, -20037508.34278924, 20037508.342789244, 20037508.342789277];
-+ var expected_z = [-20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244];
- assert(Math.abs(extent[0] - expected_z[0]) < 1e-8);
- assert(Math.abs(extent[1] - expected_z[1]) < 1e-8);
- assert(Math.abs(extent[2] - expected_z[2]) < 1e-8);
---- a/CHANGELOG.md
-+++ b/CHANGELOG.md
-@@ -1,5 +1,12 @@
- # Changelog
-
-+## 3.7.0
-+
-+Updated to 3.0.18 of mapnik. See [here](https://github.com/mapnik/mapnik/blob/master/CHANGELOG.md).
-+
-+- Updated to mapnik-vector-tile at 1.6.1
-+- Removed windows support (https://github.com/mapnik/node-mapnik/issues/848)
-+
- ## 3.6.2
-
- Updated to 3.0.15 of mapnik. The full changelog for this release is located [here](https://github.com/mapnik/mapnik/blob/master/CHANGELOG.md#3015).
---- a/README.md
-+++ b/README.md
-@@ -175,6 +175,13 @@ Then run (within the cloned `node-mapnik
-
- make release_base
-
-+#### Note on SSE:
-+
-+By default node mapnik is built with SSE support. If you are building on a platform that is not `x86_64` you will need to disable feature by setting the environment variable `SSE_MATH=false`.
-+
-+```
-+SSE_MATH=false make
-+```
-
- ### Windows specific
-
---- a/binding.gyp
-+++ b/binding.gyp
-@@ -2,6 +2,7 @@
- 'includes': [ 'common.gypi' ],
- 'variables': {
- 'ENABLE_GLIBC_WORKAROUND%':'false', # can be overriden by a command line variable because of the % sign
-+ 'enable_sse%':'true'
- },
- 'targets': [
- {
-@@ -107,7 +108,10 @@
- 'GCC_VERSION': 'com.apple.compilers.llvm.clang.1_0'
- }
- },
-- ]
-+ ],
-+ ['enable_sse == "true"', {
-+ 'defines' : [ 'SSE_MATH' ]
-+ }]
- ]
- },
- {
---- a/Makefile
-+++ b/Makefile
-@@ -42,7 +42,7 @@ coverage:
- clean:
- rm -rf lib/binding
- rm -rf build
-- rm -rf mason
-+ rm -rf .mason
- find test/ -name *actual* -exec rm {} \;
- echo "run make distclean to also remove mason_packages and node_modules"
-
diff --git a/debian/patches/no-mason.patch b/debian/patches/no-mason.patch
index 1989749..abfae4b 100644
--- a/debian/patches/no-mason.patch
+++ b/debian/patches/no-mason.patch
@@ -4,7 +4,7 @@ Forwarded: not-needed
--- a/binding.gyp
+++ b/binding.gyp
-@@ -33,9 +33,9 @@
+@@ -34,9 +34,9 @@
4267
],
'include_dirs': [
diff --git a/debian/patches/series b/debian/patches/series
index 4c66dec..a4570c5 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,6 +1,4 @@
-upstream-git.patch
test_disable_raster_layer.patch
use-packaged-dependencies.patch
no-mason.patch
-852.patch
disable-sse.patch
diff --git a/debian/patches/test_disable_raster_layer.patch b/debian/patches/test_disable_raster_layer.patch
index 6d80b2a..267bb40 100644
--- a/debian/patches/test_disable_raster_layer.patch
+++ b/debian/patches/test_disable_raster_layer.patch
@@ -5,7 +5,7 @@ Forwarded: not-needed
--- a/test/vector-tile.test.js
+++ b/test/vector-tile.test.js
-@@ -2773,6 +2773,7 @@ describe('mapnik.VectorTile ', function(
+@@ -2789,6 +2789,7 @@ describe('mapnik.VectorTile ', function(
});
});
@@ -13,7 +13,7 @@ Forwarded: not-needed
it('should be able to resample and encode (render) a geotiff into vector tile', function(done) {
var vtile = new mapnik.VectorTile(0, 0, 0, {tile_size:256, buffer_size:0});
// first we render a geotiff into an image tile
-@@ -2804,6 +2805,7 @@ describe('mapnik.VectorTile ', function(
+@@ -2820,6 +2821,7 @@ describe('mapnik.VectorTile ', function(
});
});
});
diff --git a/debian/patches/upstream-git.patch b/debian/patches/upstream-git.patch
deleted file mode 100644
index c100eac..0000000
--- a/debian/patches/upstream-git.patch
+++ /dev/null
@@ -1,2495 +0,0 @@
-Description: Various changes from upstream git repository.
-Author: Various
-Origin: https://github.com/mapnik/node-mapnik/tree/v3.0.x
-
---- a/.npmignore
-+++ b/.npmignore
-@@ -11,7 +11,6 @@ test
- benchmark
- configure
- Makefile
--scripts
- .travis.yml
- appveyor.yml
- examples
---- a/.travis.yml
-+++ b/.travis.yml
-@@ -33,6 +33,7 @@ install:
- # we use before_script rather than script to ensure fast failure (the script section continues even after an error)
- # https://docs.travis-ci.com/user/customizing-the-build#Breaking-the-Build
- before_script:
-+ - ./scripts/check_glibcxx.sh
- - npm test
- # after successful tests, publish binaries if specified in commit message
- - ./scripts/publish.sh --toolset=${TOOLSET:-} --debug=$([ "${BUILDTYPE}" == 'debug' ] && echo "true" || echo "false")
-@@ -41,7 +42,7 @@ before_script:
- script:
- - true
-
--# the matrix allows you to specify different operating systems and environments to
-+# the matrix allows you to specify different operating systems and environments to
- # run your tests and build binaries
- matrix:
- include:
-@@ -73,6 +74,10 @@ matrix:
- - os: linux
- env: BUILDTYPE=release
- node_js: 8
-+ # linux publishable node v9
-+ - os: linux
-+ env: BUILDTYPE=release
-+ node_js: 9
- # osx publishable node v0.10
- - os: osx
- osx_image: xcode8.3
-@@ -83,22 +88,37 @@ matrix:
- osx_image: xcode8.3
- env: BUILDTYPE=release
- node_js: 4
-+ # osx publishable node v4/debug
-+ - os: osx
-+ osx_image: xcode8.3
-+ env: BUILDTYPE=debug
-+ node_js: 4
- # osx publishable node v6
- - os: osx
- osx_image: xcode8.3
- env: BUILDTYPE=release
- node_js: 6
-+ # osx publishable node v6/debug
-+ - os: osx
-+ osx_image: xcode8.3
-+ env: BUILDTYPE=debug
-+ node_js: 6
- # osx publishable node v7
- - os: osx
-- osx_image: xcode8.2
-+ osx_image: xcode8.3
- env: BUILDTYPE=release
- node_js: 7
- # osx publishable node v8
- - os: osx
-- osx_image: xcode8.2
-+ osx_image: xcode8.3
- env: BUILDTYPE=release
- node_js: 8
-- # Sanitizer build node v4/Debug
-+ # osx publishable node v9
-+ - os: osx
-+ osx_image: xcode8.3
-+ env: BUILDTYPE=release
-+ node_js: 9
-+ # Sanitizer build linux node v4/Debug
- - os: linux
- env: BUILDTYPE=debug TOOLSET=-asan
- node_js: 4
-@@ -121,6 +141,30 @@ matrix:
- - unset LD_PRELOAD
- # after successful tests, publish binaries if specified in commit message
- - ./scripts/publish.sh --toolset=${TOOLSET:-} --debug=$([ "${BUILDTYPE}" == 'debug' ] && echo "true" || echo "false")
-+ # Sanitizer build osx node v4/Debug
-+ - os: osx
-+ osx_image: xcode8.3
-+ env: BUILDTYPE=debug TOOLSET=-asan
-+ node_js: 4
-+ # Overrides `install` to set up custom asan flags
-+ install:
-+ - ./scripts/setup.sh --config local.env
-+ # put mason and clang++ on PATH
-+ - source local.env
-+ # Note: to build without stopping on errors remove the -fno-sanitize-recover=all flag
-+ # You might want to do this if there are multiple errors and you want to see them all before fixing
-+ - export CXXFLAGS="${MASON_SANITIZE_CXXFLAGS} -fno-sanitize-recover=all"
-+ - export LDFLAGS="${MASON_SANITIZE_LDFLAGS}"
-+ - make ${BUILDTYPE}
-+ # Overrides `script` to disable asan LD_PRELOAD before publishing
-+ before_script:
-+ - export DYLD_INSERT_LIBRARIES=${MASON_LLVM_RT_PRELOAD}
-+ # TODO: re-enable detect_leaks=0 once we can build and test against an asan sanitized libc++
-+ - export ASAN_OPTIONS=fast_unwind_on_malloc=0:detect_leaks=0:${ASAN_OPTIONS}
-+ - node ./node_modules/.bin/_mocha test/ --timeout 100000
-+ - unset DYLD_INSERT_LIBRARIES
-+ # after successful tests, publish binaries if specified in commit message
-+ - ./scripts/publish.sh --toolset=${TOOLSET:-} --debug=$([ "${BUILDTYPE}" == 'debug' ] && echo "true" || echo "false")
- # g++ build (default builds all use clang++)
- - os: linux
- env: BUILDTYPE=debug CXX="g++-6" CC="gcc-6"
---- a/CHANGELOG.md
-+++ b/CHANGELOG.md
-@@ -20,6 +20,7 @@ Due to changes in the mapnik core versio
- - Fixed tests around zlib compression and decompression when comparing to node's implementation
- - Fixes rare situation of seg faults during mapnik-vector-tile image processing.
- - Corrects the resolution of images in mapnik-vector-tile when using parameters from postgis plugin.
-+- Updated to use `font_engine` `instance()` method explicitely, reflecting on changes brought by [3688](https://github.com/mapnik/mapnik/pull/3688)
-
- ## 3.6.0
-
-@@ -31,6 +32,7 @@ The second largest change is the update
-
- The third most important set of changes were to node-mapnik directly: for performance many functions now can premultiply as part of another async operation (to avoid needing an additional threadpool access for async premultiply - this matters under load when the threadpool may be full since access can block). And many functions that allocate images now protect from extreme allocation that could hang a machine and result in OOM. Additionally the address sanitizer caught several cases of [...]
-
-+- No longer installing node-pre-gyp in `preinstall` target, now bundling again as a bundledDep (https://github.com/mapbox/node-pre-gyp/issues/260).
- - Added support for node v7
- - Updated to 1.3.0 of Mapnik Vector Tile (https://github.com/mapbox/mapnik-vector-tile/blob/master/CHANGELOG.md#130)
- - Removed Angus Clipper and replaced with Wagyu v0.4.2 (https://github.com/mapbox/wagyu)
---- a/Makefile
-+++ b/Makefile
-@@ -2,25 +2,40 @@ MODULE_NAME := $(shell node -e "console.
-
- default: release
-
-+ifneq (,$(findstring clang,$(CXX)))
-+ PROFILING_FLAG += -gline-tables-only
-+else
-+ PROFILING_FLAG += -g
-+endif
-+
- deps/geometry/include/mapbox/geometry.hpp:
- git submodule update --init
-
--mason_packages/.link/bin/mapnik-config: deps/geometry/include/mapbox/geometry.hpp
-- ./install_mason.sh
--
--node_modules: mason_packages/.link/bin/mapnik-config
-- # install deps but for now ignore our own install script
-- # so that we can run it directly in either debug or release
-+node_modules:
- npm install --ignore-scripts --clang
-
--release: node_modules
-- PATH="./mason_packages/.link/bin/:${PATH}" && V=1 ./node_modules/.bin/node-pre-gyp configure build --loglevel=error --clang
-+mason_packages/.link/bin/mapnik-config:
-+ ./scripts/install_deps.sh
-+
-+pre_build_check:
-+ @node -e "console.log('\033[94mNOTICE: to build from source you need mapnik >=',require('./package.json').mapnik_version,'\033[0m');"
-+ @echo "Looking for mapnik-config on your PATH..."
-+ mapnik-config -v
-+
-+release_base: pre_build_check deps/geometry/include/mapbox/geometry.hpp node_modules
-+ V=1 CXXFLAGS="-fno-omit-frame-pointer $(PROFILING_FLAG)" ./node_modules/.bin/node-pre-gyp configure build --ENABLE_GLIBC_WORKAROUND=true --loglevel=error --clang
- @echo "run 'make clean' for full rebuild"
-
--debug: node_modules
-- PATH="./mason_packages/.link/bin/:${PATH}" && V=1 ./node_modules/.bin/node-pre-gyp configure build --loglevel=error --debug --clang
-+debug_base: pre_build_check deps/geometry/include/mapbox/geometry.hpp node_modules
-+ V=1 ./node_modules/.bin/node-pre-gyp configure build --ENABLE_GLIBC_WORKAROUND=true --loglevel=error --debug --clang
- @echo "run 'make clean' for full rebuild"
-
-+release: mason_packages/.link/bin/mapnik-config
-+ CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0" PATH="./mason_packages/.link/bin/:${PATH}" $(MAKE) release_base
-+
-+debug: mason_packages/.link/bin/mapnik-config
-+ CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0" PATH="./mason_packages/.link/bin/:${PATH}" $(MAKE) debug_base
-+
- coverage:
- ./scripts/coverage.sh
-
-@@ -50,6 +65,8 @@ docs:
- test:
- npm test
-
-+check: test
-+
- testpack:
- rm -f ./*tgz
- npm pack
---- a/README.md
-+++ b/README.md
-@@ -71,22 +71,22 @@ For more sample code see [the tests](./t
-
- OS|Node.js|C++ minimum requirements|OS versions
- ---|---|---|---
--Mac|v0.10.x, v4, v5, v6|C++11|Mac OS X > 10.10
--Linux|v0.10.x, v4, v5, v6|C++11|Ubuntu Linux > 16.04 or other Linux distributions with g++ >= 5 toolchain (>= GLIBCXX_3.4.21 from libstdc++)
--Windows|v0.10.x, v4, v5|C++11|See the [Windows requirements](https://github.com/mapnik/node-mapnik#windows-specific) section
-+Mac|v0.10.x, v4, v6, v8|C++11|Mac OS X > 10.10
-+Linux|v0.10.x, v4, v6, v8|C++11|Ubuntu Linux > 14.04 (trusty) or Centos >= 7 or other Linux distributions with a libstdc++ recent enough to contain >= GLIBCXX_3.4.19 symbols (libstdc++ that comes with at least g++ 4.8).
-+Windows|v0.10.x, v4, v6, v8|C++11|See the [Windows requirements](https://github.com/mapnik/node-mapnik#windows-specific) section
-
- An installation error like below indicates your system does not have a modern enough libstdc++/gcc-base toolchain:
-
- ```
--Error: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version GLIBCXX_3.4.21 not found (required by /node_modules/osrm/lib/binding/osrm.node)
-+Error: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version GLIBCXX_3.4.19 not found
- ```
-
--If you are running Ubuntu older than 16.04 you can easily upgrade your libstdc++ version like:
-+If you are running Ubuntu older than 14.04 you can easily upgrade your libstdc++ version like:
-
- ```
- sudo add-apt-repository ppa:ubuntu-toolchain-r/test
- sudo apt-get update -y
--sudo apt-get install -y libstdc++-5-dev
-+sudo apt-get install -y libstdc++6
- ```
-
- To upgrade libstdc++ on travis (without sudo) you can do:
-@@ -115,9 +115,9 @@ Note: This will install the latest node-
-
- By default, binaries are provided for:
-
-- - 64 bit OS X 10.9, 64 bit Linux (>= Ubuntu Trusty), and 64/32 bit Windows
-+ - 64 bit OS X >= 10.10, 64 bit Linux (>= Ubuntu Trusty), and 64/32 bit Windows
- - several node versions:
-- - [versions forLinux/Mac](<https://github.com/mapnik/node-mapnik/blob/master/.travis.yml#L19-L47>)
-+ - [versions for Linux/Mac](<https://github.com/mapnik/node-mapnik/blob/master/.travis.yml#L19-L47>)
- - [versions for Windows](<https://github.com/mapnik/node-mapnik/blob/master/appveyor.yml#L9-L32>)
-
- On those platforms no external dependencies are needed.
-@@ -142,17 +142,39 @@ The **1.x** series require the Visual C+
-
- ## Source Build
-
--To build from source you need:
-+There are two ways to build from source. These work on both OS X and Linux:
-
-- - Mapnik >= v3.0.10
-+ - A) Against a binary package from Mapnik from [mason](https://github.com/mapbox/mason)
-+ - B) Against an existing version of Mapnik on your system
-
--Install Mapnik using the instructions at: https://github.com/mapnik/mapnik/wiki/Mapnik-Installation
-+Using `A)` is recommended. You do not need to have Mapnik installed already, so this is the easiest and most predictable approach. When you use the route a binary package of Mapnik is download dynamically from [mason](https://github.com/mapbox/mason).
-
--Confirm that the `mapnik-config` program is available and on your `${PATH}`.
-+You can invoke this method simply by running:
-+
-+ make release
-+
-+Or, for debug builds:
-+
-+ make debug
-+
-+If you want to do a full rebuild do:
-+
-+ make distclean
-+
-+And then re-run the build:
-+
-+ make release
-+
-+Using `B)` is also possible, if you would like to build node-mapnik against an external, already installed Mapnik version.
-+
-+In this case you need to have a Mapnik version installed that is at least as recent as the `mapnik_version` property in the [`package.json`](./package.json) for the branch of node-mapnik you want to build.
-+
-+And you need to have the `mapnik-config` program is available and on your `${PATH}`.
-
- Then run (within the cloned `node-mapnik` directory:
-
-- npm install --build-from-source
-+ make release_base
-+
-
- ### Windows specific
-
-@@ -173,4 +195,4 @@ To run the tests do:
-
- ## License
-
-- BSD, see LICENSE.txt
-+BSD, see LICENSE.txt
---- a/binding.gyp
-+++ b/binding.gyp
-@@ -1,32 +1,11 @@
- {
- 'includes': [ 'common.gypi' ],
-+ 'variables': {
-+ 'ENABLE_GLIBC_WORKAROUND%':'false', # can be overriden by a command line variable because of the % sign
-+ },
- 'targets': [
- {
-- 'target_name': 'make_vector_tile',
-- 'hard_dependency': 1,
-- 'type': 'none',
-- 'actions': [
-- {
-- 'action_name': 'generate_setting',
-- 'inputs': [
-- 'gen_settings.py'
-- ],
-- 'outputs': [
-- '<(SHARED_INTERMEDIATE_DIR)/mapnik_settings.js'
-- ],
-- 'action': ['python', 'gen_settings.py', '<(SHARED_INTERMEDIATE_DIR)/mapnik_settings.js']
-- }
-- ],
-- 'copies': [
-- {
-- 'files': [ '<(SHARED_INTERMEDIATE_DIR)/mapnik_settings.js' ],
-- 'destination': '<(module_path)'
-- }
-- ]
-- },
-- {
- 'target_name': '<(module_name)',
-- 'dependencies': [ 'make_vector_tile' ],
- 'product_dir': '<(module_path)',
- 'sources': [
- "src/mapnik_logger.cpp",
-@@ -70,6 +49,11 @@
- 'MAPNIK_GIT_REVISION="<!@(mapnik-config --git-describe)"',
- ],
- 'conditions': [
-+ ['ENABLE_GLIBC_WORKAROUND != "false"', {
-+ 'sources': [
-+ "src/glibc_workaround.cpp"
-+ ]
-+ }],
- ['OS=="win"',
- {
- 'include_dirs':[
-@@ -97,7 +81,6 @@
- 'cflags_cc!': ['-fno-rtti', '-fno-exceptions'],
- 'cflags_cc' : [
- '<!@(mapnik-config --cflags)',
-- '-D_GLIBCXX_USE_CXX11_ABI=0'
- ],
- 'libraries':[
- '<!@(mapnik-config --libs)',
---- a/gen_settings.py
-+++ /dev/null
-@@ -1,39 +0,0 @@
--import os
--import sys
--
--settings = os.path.abspath(sys.argv[1])
--
--# this goes into a mapnik_settings.js file beside the C++ _mapnik.node
--settings_template = """
--module.exports.paths = {
-- 'fonts': %s,
-- 'input_plugins': %s
--};
--"""
--
--def write_mapnik_settings(fonts='undefined',input_plugins='undefined'):
-- global settings_template
-- if '__dirname' in fonts or '__dirname' in input_plugins:
-- settings_template = "var path = require('path');\n" + settings_template
-- open(settings,'w').write(settings_template % (fonts,input_plugins))
--
--
--if __name__ == '__main__':
-- settings_dict = {}
--
-- # settings for fonts and input plugins
-- # environment settings are for windows tilemill packaging:
-- # https://github.com/mapbox/tilemill/blob/master/platforms/windows/package.bat#L37
-- ip = os.environ.get('MAPNIK_INPUT_PLUGINS')
-- if ip:
-- settings_dict['input_plugins'] = ip
-- else:
-- settings_dict['input_plugins'] = '\'%s\'' % os.popen("./mason_packages/.link/bin/mapnik-config --input-plugins").readline().strip()
--
-- mf = os.environ.get('MAPNIK_FONTS')
-- if mf:
-- settings_dict['fonts'] = mf
-- else:
-- settings_dict['fonts'] = '\'%s\'' % os.popen("./mason_packages/.link/bin/mapnik-config --fonts").readline().strip()
--
-- write_mapnik_settings(**settings_dict)
---- a/package.json
-+++ b/package.json
-@@ -4,8 +4,8 @@
- "url": "http://github.com/mapnik/node-mapnik",
- "homepage": "http://mapnik.org",
- "author": "Dane Springmeyer <dane at mapbox.com> (mapnik.org)",
-- "version": "3.6.2",
-- "mapnik_version":"v3.0.15",
-+ "version": "3.6.3",
-+ "mapnik_version": "v3.0.18",
- "main": "./lib/mapnik.js",
- "binary": {
- "module_name": "mapnik",
-@@ -38,25 +38,25 @@
- "dependencies": {
- "mapnik-vector-tile": "1.4.0",
- "protozero": "1.5.1",
-- "nan": "~2.5.0",
-+ "nan": "~2.8.0",
- "node-pre-gyp": "~0.6.30"
- },
- "bundledDependencies": [
-- "node-pre-gyp"
-+ "node-pre-gyp"
- ],
- "bin": {
-+ "mapnik-index.js": "./bin/mapnik-index.js",
- "mapnik-inspect.js": "./bin/mapnik-inspect.js",
- "mapnik-render.js": "./bin/mapnik-render.js",
- "mapnik-shapeindex.js": "./bin/mapnik-shapeindex.js"
- },
- "scripts": {
-- "prepublish": "npm ls",
-+ "prepublishOnly": "npm ls",
- "test": "jshint bin lib/index.js lib/mapnik.js && mocha -R spec --timeout 50000",
- "install": "node-pre-gyp install --fallback-to-build",
- "docs": "documentation build src/*.cpp src/mapnik_plugins.hpp --polyglot -o documentation -f html --github --name Mapnik"
- },
- "devDependencies": {
-- "node-gyp": "^3.6.1",
- "aws-sdk": "2.0.12",
- "jshint": "^2.5.10",
- "mocha": "2.x",
---- a/scripts/build-appveyor.bat
-+++ b/scripts/build-appveyor.bat
-@@ -75,6 +75,12 @@ SET PROJ_LIB=%MAPNIK_SDK%\share\proj
- SET GDAL_DATA=%MAPNIK_SDK%\share\gdal
- SET ICU_DATA=%MAPNIK_SDK%\share\icu
-
-+:: workaround node-gyp/request node v0.10.x breakage
-+IF "%nodejs_version:~0,1%"=="0" npm install https://github.com/springmeyer/node-gyp/tarball/v3.x
-+IF %ERRORLEVEL% NEQ 0 GOTO ERROR
-+IF "%nodejs_version:~0,1%"=="4" npm install node-gyp at 4.x
-+IF %ERRORLEVEL% NEQ 0 GOTO ERROR
-+
- :: actually install deps + compile node-mapnik
- ECHO building node-mapnik
- :: --msvs_version=2015 is passed along to node-gyp here
---- /dev/null
-+++ b/scripts/check_glibcxx.sh
-@@ -0,0 +1,33 @@
-+#!/bin/bash
-+
-+set -eu
-+set -o pipefail
-+shopt -s nullglob
-+
-+: '
-+
-+Ensure no GLIBCXX_3.4.2x symbols are present in the binary
-+
-+If symbols >= 3.4.20 then it returns error code 1. This means
-+the binaries would not run on ubuntu trusty without upgrading libstdc++
-+
-+'
-+
-+FINAL_RETURN_CODE=0
-+
-+function check() {
-+ local RESULT=0
-+ nm ${1} | grep "GLIBCXX_3.4.2[0-9]" > /tmp/out.txt || RESULT=$?
-+ if [[ ${RESULT} != 0 ]]; then
-+ echo "Success: GLIBCXX_3.4.2[0-9] symbols not present in binary (as expected)"
-+ else
-+ echo "$(cat /tmp/out.txt | c++filt)"
-+ FINAL_RETURN_CODE=1
-+ fi
-+}
-+
-+
-+echo "checking ./lib/binding/mapnik.node"
-+check "lib/binding/mapnik.node"
-+
-+exit ${FINAL_RETURN_CODE}
---- a/install_mason.sh
-+++ /dev/null
-@@ -1,42 +0,0 @@
--#!/bin/bash
--
--set -eu
--set -o pipefail
--
--function install() {
-- ./mason/mason install $1 $2
-- ./mason/mason link $1 $2
--}
--
--ICU_VERSION="57.1"
--
--if [ ! -f ./mason/mason.sh ]; then
-- mkdir -p ./mason
-- curl -sSfL https://github.com/mapbox/mason/archive/c1948184d9430226e36f1bc1f8f081268b6bc2ba.tar.gz | tar --gunzip --extract --strip-components=1 --exclude="*md" --exclude="test*" --directory=./mason
--fi
--
--if [ ! -f ./mason_packages/.link/bin/mapnik-config ]; then
--
-- # mapnik deps
-- install jpeg_turbo 1.5.1
-- install libpng 1.6.28
-- install libtiff 4.0.7
-- install icu ${ICU_VERSION}
-- install proj 4.9.3
-- install pixman 0.34.0
-- install cairo 1.14.8
-- install webp 0.6.0
-- install libgdal 2.1.3
-- install boost 1.63.0
-- install boost_libsystem 1.63.0
-- install boost_libfilesystem 1.63.0
-- install boost_libregex_icu57 1.63.0
-- install freetype 2.7.1
-- install harfbuzz 1.4.2-ft
--
-- # mapnik
-- # NOTE: sync this version with the `mapnik_version` in package.json (which is used for windows builds)
-- # In the future we could pull from that version automatically if mason were to support knowing the right dep
-- # versions to install automatically. Until then there is not much point since the deps are still hardcoded here.
-- install mapnik 3.0.15
--fi
---- /dev/null
-+++ b/scripts/install_deps.sh
-@@ -0,0 +1,40 @@
-+#!/bin/bash
-+
-+set -eu
-+set -o pipefail
-+
-+function install() {
-+ mason install $1 $2
-+ mason link $1 $2
-+}
-+
-+ICU_VERSION="57.1"
-+
-+./scripts/setup.sh --config local.env
-+source local.env
-+
-+if [ ! -f ./mason_packages/.link/bin/mapnik-config ]; then
-+
-+ # mapnik deps
-+ install jpeg_turbo 1.5.1
-+ install libpng 1.6.28
-+ install libtiff 4.0.7
-+ install icu ${ICU_VERSION}
-+ install proj 4.9.3
-+ install pixman 0.34.0
-+ install cairo 1.14.8
-+ install webp 0.6.0
-+ install libgdal 2.1.3
-+ install boost 1.65.1
-+ install boost_libsystem 1.65.1
-+ install boost_libfilesystem 1.65.1
-+ install boost_libregex_icu57 1.65.1
-+ install freetype 2.7.1
-+ install harfbuzz 1.4.2-ft
-+
-+ # mapnik
-+ # NOTE: sync this version with the `mapnik_version` in package.json (which is used for windows builds)
-+ # In the future we could pull from that version automatically if mason were to support knowing the right dep
-+ # versions to install automatically. Until then there is not much point since the deps are still hardcoded here.
-+ install mapnik 3.0.18
-+fi
---- a/scripts/postinstall.sh
-+++ b/scripts/postinstall.sh
-@@ -5,6 +5,30 @@ set -o pipefail
- MODULE_PATH=./lib/binding
- MAPNIK_SDK=./mason_packages/.link
-
-+# Check if we are using Mason's mapnik
-+if [[ ! "$(which mapnik-config)" -ef "$MAPNIK_SDK/bin/mapnik-config" ]]; then
-+ echo "
-+var path = require('path');
-+module.exports.paths = {
-+ 'fonts': '$(mapnik-config --fonts)',
-+ 'input_plugins': '$(mapnik-config --input-plugins)',
-+ 'mapnik_index': '$(which mapnik-index)',
-+ 'shape_index': '$(which shapeindex)'
-+};
-+" > ${MODULE_PATH}/mapnik_settings.js
-+# once https://github.com/mapnik/mapnik/pull/3759 is fixed
-+# this can be enabled
-+# echo "
-+#module.exports.env = {
-+# 'ICU_DATA': '$(mapnik-config --icu-data)',
-+# 'GDAL_DATA': '$(mapnik-config --gdal-data)',
-+# 'PROJ_LIB': '$(mapnik-config --proj-lib)'
-+#};
-+#" >> ${MODULE_PATH}/mapnik_settings.js
-+
-+ exit 0;
-+fi
-+
- mkdir -p ${MODULE_PATH}/bin/
-
- # the below switch is used since on osx the default cp
---- a/scripts/setup.sh
-+++ b/scripts/setup.sh
-@@ -3,8 +3,8 @@
- set -eu
- set -o pipefail
-
--export MASON_RELEASE="${MASON_RELEASE:-0.7.0}"
--export MASON_LLVM_RELEASE="${MASON_LLVM_RELEASE:-3.9.1}"
-+export MASON_RELEASE="${MASON_RELEASE:-5f4171e}"
-+export MASON_LLVM_RELEASE="${MASON_LLVM_RELEASE:-5.0.0}"
-
- PLATFORM=$(uname | tr A-Z a-z)
- if [[ ${PLATFORM} == 'darwin' ]]; then
-@@ -58,7 +58,7 @@ function run() {
- local mason_release=${2}
- if [[ ! -d ${install_dir} ]]; then
- mkdir -p ${install_dir}
-- curl -sSfL https://github.com/mapbox/mason/archive/v${mason_release}.tar.gz | tar --gunzip --extract --strip-components=1 --directory=${install_dir}
-+ curl -sSfL https://github.com/mapbox/mason/archive/${mason_release}.tar.gz | tar --gunzip --extract --strip-components=1 --directory=${install_dir}
- fi
- }
-
---- /dev/null
-+++ b/src/glibc_workaround.cpp
-@@ -0,0 +1,26 @@
-+#ifdef __linux__
-+
-+#ifdef MAPNIK_ENABLE_GLIBC_WORKAROUND
-+
-+#include <stdexcept>
-+
-+// https://github.com/bitcoin/bitcoin/pull/4042
-+// allows building against libstdc++-dev-4.9 while avoiding
-+// GLIBCXX_3.4.20 dep
-+// This is needed because libstdc++ itself uses this API - its not
-+// just an issue of your code using it, ughhh
-+
-+namespace std
-+{
-+
-+void __throw_out_of_range_fmt(const char *, ...) __attribute__((__noreturn__));
-+void __throw_out_of_range_fmt(const char *err, ...)
-+{
-+ // Safe and over-simplified version. Ignore the format and print it as-is.
-+ __throw_out_of_range(err);
-+}
-+}
-+
-+#endif // MAPNIK_ENABLE_GLIBC_WORKAROUND
-+
-+#endif // __linux__
-\ No newline at end of file
---- a/src/mapnik_color.cpp
-+++ b/src/mapnik_color.cpp
-@@ -13,7 +13,7 @@ Nan::Persistent<v8::FunctionTemplate> Co
- /**
- * **`mapnik.Color`**
- *
-- * A `mapnik.Color` object used for handling and converting colors
-+ * A `mapnik.Color` object used for handling and converting colors
- *
- * @class Color
- * @param {string|number} value either an array of [r, g, b, a],
-@@ -81,12 +81,12 @@ NAN_METHOD(Color::New)
- color_ptr c_p;
- try
- {
-- if (info.Length() == 1 &&
-+ if (info.Length() == 1 &&
- info[0]->IsString())
- {
- c_p = std::make_shared<mapnik::color>(TOSTR(info[0]));
- }
-- else if (info.Length() == 2 &&
-+ else if (info.Length() == 2 &&
- info[0]->IsString() &&
- info[1]->IsBoolean())
- {
-@@ -95,7 +95,7 @@ NAN_METHOD(Color::New)
- else if (info.Length() == 3 &&
- info[0]->IsNumber() &&
- info[1]->IsNumber() &&
-- info[2]->IsNumber())
-+ info[2]->IsNumber())
- {
- int r = info[0]->IntegerValue();
- int g = info[1]->IntegerValue();
-@@ -106,12 +106,12 @@ NAN_METHOD(Color::New)
- return;
- }
- c_p = std::make_shared<mapnik::color>(r,g,b);
-- }
-+ }
- else if (info.Length() == 4 &&
- info[0]->IsNumber() &&
- info[1]->IsNumber() &&
- info[2]->IsNumber() &&
-- info[3]->IsBoolean())
-+ info[3]->IsBoolean())
- {
- int r = info[0]->IntegerValue();
- int g = info[1]->IntegerValue();
-@@ -122,12 +122,12 @@ NAN_METHOD(Color::New)
- return;
- }
- c_p = std::make_shared<mapnik::color>(r,g,b,255,info[3]->BooleanValue());
-- }
-+ }
- else if (info.Length() == 4 &&
- info[0]->IsNumber() &&
- info[1]->IsNumber() &&
- info[2]->IsNumber() &&
-- info[3]->IsNumber())
-+ info[3]->IsNumber())
- {
- int r = info[0]->IntegerValue();
- int g = info[1]->IntegerValue();
-@@ -139,13 +139,13 @@ NAN_METHOD(Color::New)
- return;
- }
- c_p = std::make_shared<mapnik::color>(r,g,b,a);
-- }
-+ }
- else if (info.Length() == 5 &&
- info[0]->IsNumber() &&
- info[1]->IsNumber() &&
- info[2]->IsNumber() &&
- info[3]->IsNumber() &&
-- info[4]->IsBoolean())
-+ info[4]->IsBoolean())
- {
- int r = info[0]->IntegerValue();
- int g = info[1]->IntegerValue();
-@@ -157,8 +157,8 @@ NAN_METHOD(Color::New)
- return;
- }
- c_p = std::make_shared<mapnik::color>(r,g,b,a,info[4]->BooleanValue());
-- }
-- else
-+ }
-+ else
- {
- Nan::ThrowTypeError("invalid arguments: colors can be created from a string, integer r,g,b values, or integer r,g,b,a values");
- return;
-@@ -183,10 +183,11 @@ v8::Local<v8::Value> Color::NewInstance(
- Color* c = new Color();
- c->this_ = std::make_shared<mapnik::color>(color);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(c);
-- return scope.Escape(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Color instance");
-+ return scope.Escape(maybe_local.ToLocalChecked());
- }
-
--
- NAN_GETTER(Color::get_prop)
- {
- Color* c = Nan::ObjectWrap::Unwrap<Color>(info.Holder());
---- a/src/mapnik_datasource.cpp
-+++ b/src/mapnik_datasource.cpp
-@@ -147,7 +147,9 @@ v8::Local<v8::Value> Datasource::NewInst
- Datasource* d = new Datasource();
- d->datasource_ = ds_ptr;
- v8::Local<v8::Value> ext = Nan::New<v8::External>(d);
-- return scope.Escape(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Datasource instance");
-+ return scope.Escape(maybe_local.ToLocalChecked());
- }
-
- NAN_METHOD(Datasource::parameters)
---- a/src/mapnik_feature.cpp
-+++ b/src/mapnik_feature.cpp
-@@ -114,7 +114,9 @@ NAN_METHOD(Feature::fromJSON)
- }
- Feature* feat = new Feature(f);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(feat);
-- info.GetReturnValue().Set(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Feature instance");
-+ else info.GetReturnValue().Set(maybe_local.ToLocalChecked());
- }
- catch (std::exception const& ex)
- {
-@@ -132,7 +134,9 @@ v8::Local<v8::Value> Feature::NewInstanc
- Nan::EscapableHandleScope scope;
- Feature* f = new Feature(f_ptr);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(f);
-- return scope.Escape(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Feature instance");
-+ return scope.Escape(maybe_local.ToLocalChecked());
- }
-
- /**
---- a/src/mapnik_featureset.cpp
-+++ b/src/mapnik_featureset.cpp
-@@ -5,7 +5,7 @@ Nan::Persistent<v8::FunctionTemplate> Fe
-
- /**
- * **`mapnik.Featureset`**
-- *
-+ *
- * An iterator of {@link mapnik.Feature} objects.
- *
- * @class Featureset
-@@ -74,10 +74,10 @@ NAN_METHOD(Featureset::next)
- }
- catch (std::exception const& ex)
- {
-- // It is not immediately obvious how this could cause an exception, a check of featureset plugin
-+ // It is not immediately obvious how this could cause an exception, a check of featureset plugin
- // implementations resulted in no obvious way that an exception could be raised. Therefore, it
- // is not obvious currently what could raise this exception. However, since a plugin could possibly
-- // be developed outside of mapnik core plugins that could raise here we are probably best still
-+ // be developed outside of mapnik core plugins that could raise here we are probably best still
- // wrapping this in a try catch.
- /* LCOV_EXCL_START */
- Nan::ThrowError(ex.what());
-@@ -98,5 +98,7 @@ v8::Local<v8::Value> Featureset::NewInst
- Featureset* fs = new Featureset();
- fs->this_ = fsp;
- v8::Local<v8::Value> ext = Nan::New<v8::External>(fs);
-- return scope.Escape(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Featureset instance");
-+ return scope.Escape(maybe_local.ToLocalChecked());
- }
---- a/src/mapnik_geometry.cpp
-+++ b/src/mapnik_geometry.cpp
-@@ -88,7 +88,9 @@ v8::Local<v8::Value> Geometry::NewInstan
- Nan::EscapableHandleScope scope;
- Geometry* g = new Geometry(f);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(g);
-- return scope.Escape(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Geometry instance");
-+ return scope.Escape(maybe_local.ToLocalChecked());
- }
-
- /**
---- a/src/mapnik_grid_view.cpp
-+++ b/src/mapnik_grid_view.cpp
-@@ -83,7 +83,9 @@ v8::Local<v8::Value> GridView::NewInstan
- GridView* gv = new GridView(JSGrid);
- gv->this_ = std::make_shared<mapnik::grid_view>(JSGrid->get()->get_view(x,y,w,h));
- v8::Local<v8::Value> ext = Nan::New<v8::External>(gv);
-- return scope.Escape(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new GridView instance");
-+ return scope.Escape(maybe_local.ToLocalChecked());
- }
-
- NAN_METHOD(GridView::width)
-@@ -301,7 +303,7 @@ NAN_METHOD(GridView::encodeSync)
- }
-
- resolution = bind_opt->IntegerValue();
--
-+
- if (resolution == 0)
- {
- Nan::ThrowTypeError("'resolution' can not be zero");
---- a/src/mapnik_image.cpp
-+++ b/src/mapnik_image.cpp
-@@ -49,7 +49,7 @@ Nan::Persistent<v8::FunctionTemplate> Im
-
- /**
- * **`mapnik.Image`**
-- *
-+ *
- * Create a new image object (surface) that can be used for rendering data to.
- * @class Image
- * @param {number} width - width in pixels
-@@ -109,7 +109,7 @@ void Image::Initialize(v8::Local<v8::Obj
- Nan::SetPrototypeMethod(lcons, "resize", resize);
- Nan::SetPrototypeMethod(lcons, "resizeSync", resizeSync);
- Nan::SetPrototypeMethod(lcons, "data", data);
--
-+
- // properties
- ATTR(lcons, "scaling", get_scaling, set_scaling);
- ATTR(lcons, "offset", get_offset, set_offset);
-@@ -265,7 +265,7 @@ NAN_METHOD(Image::New)
- return;
- }
- }
--
-+
- try {
- Image* im = new Image(info[0]->IntegerValue(),
- info[1]->IntegerValue(),
-@@ -360,7 +360,7 @@ struct visitor_get_pixel
- std::uint32_t val = mapnik::get_pixel<std::uint32_t>(data, x_, y_);
- return scope.Escape(Nan::New<v8::Uint32>(val));
- }
--
-+
- v8::Local<v8::Value> operator() (mapnik::image_gray32s const& data)
- {
- Nan::EscapableHandleScope scope;
-@@ -406,7 +406,7 @@ struct visitor_get_pixel
- private:
- int x_;
- int y_;
--
-+
- };
-
- /**
-@@ -535,11 +535,11 @@ NAN_METHOD(Image::setPixel)
- else if (info[2]->IsObject())
- {
- v8::Local<v8::Object> obj = info[2]->ToObject();
-- if (obj->IsNull() || obj->IsUndefined() || !Nan::New(Color::constructor)->HasInstance(obj))
-+ if (obj->IsNull() || obj->IsUndefined() || !Nan::New(Color::constructor)->HasInstance(obj))
- {
- Nan::ThrowTypeError("A numeric or color value is expected as third arg");
- }
-- else
-+ else
- {
- Color * color = Nan::ObjectWrap::Unwrap<Color>(obj);
- mapnik::set_pixel(*im->this_,x,y,*(color->get()));
-@@ -553,9 +553,9 @@ NAN_METHOD(Image::setPixel)
- }
-
- /**
-- * Compare the pixels of one image to the pixels of another. Returns the number
-- * of pixels that are different. So, if the images are identical then it returns `0`.
-- * And if the images share no common pixels it returns the total number of pixels
-+ * Compare the pixels of one image to the pixels of another. Returns the number
-+ * of pixels that are different. So, if the images are identical then it returns `0`.
-+ * And if the images share no common pixels it returns the total number of pixels
- * in an image which is equivalent to `im.width()*im.height()`.
- *
- * @name compare
-@@ -563,10 +563,10 @@ NAN_METHOD(Image::setPixel)
- * @memberof Image
- * @param {mapnik.Image} image - another {@link mapnik.Image} instance to compare to
- * @param {Object} [options]
-- * @param {number} [options.threshold=16] - A value that should be `0` or greater to
-- * determine if the pixels match. Defaults to 16 which means that `rgba(0,0,0,0)`
-+ * @param {number} [options.threshold=16] - A value that should be `0` or greater to
-+ * determine if the pixels match. Defaults to 16 which means that `rgba(0,0,0,0)`
- * would be considered the same as `rgba(15,15,15,0)`.
-- * @param {boolean} [options.alpha=true] - `alpha` value, along with `rgb`, is considered
-+ * @param {boolean} [options.alpha=true] - `alpha` value, along with `rgb`, is considered
- * when comparing pixels
- * @returns {number} quantified visual difference between these two images in "number of
- * pixels" (i.e. `80` pixels are different);
-@@ -574,20 +574,20 @@ NAN_METHOD(Image::setPixel)
- * // start with the exact same images
- * var img1 = new mapnik.Image(2,2);
- * var img2 = new mapnik.Image(2,2);
-- * console.log(img1.compare(img2)); // 0
-- *
-+ * console.log(img1.compare(img2)); // 0
-+ *
- * // change 1 pixel in img2
- * img2.setPixel(0,0, new mapnik.Color('green'));
-- * console.log(img1.compare(img2)); // 1
-- *
-+ * console.log(img1.compare(img2)); // 1
-+ *
- * // difference in color at first pixel
- * img1.setPixel(0,0, new mapnik.Color('red'));
-- * console.log(img1.compare(img2)); // 1
-- *
-+ * console.log(img1.compare(img2)); // 1
-+ *
- * // two pixels different
- * img2.setPixel(0,1, new mapnik.Color('red'));
-- * console.log(img1.compare(img2)); // 2
-- *
-+ * console.log(img1.compare(img2)); // 2
-+ *
- * // all pixels different
- * img2.setPixel(1,1, new mapnik.Color('blue'));
- * img2.setPixel(1,0, new mapnik.Color('blue'));
-@@ -653,7 +653,7 @@ NAN_METHOD(Image::compare)
- * @name filterSync
- * @instance
- * @memberof Image
-- * @param {string} filter - can be `blur`, `emboss`, `sharpen`,
-+ * @param {string} filter - can be `blur`, `emboss`, `sharpen`,
- * `sobel`, or `gray`.
- * @example
- * var img = new mapnik.Image(5, 5);
-@@ -704,7 +704,7 @@ typedef struct {
- * @name filter
- * @instance
- * @memberof Image
-- * @param {string} filter - can be `blur`, `emboss`, `sharpen`,
-+ * @param {string} filter - can be `blur`, `emboss`, `sharpen`,
- * `sobel`, or `gray`.
- * @param {Function} callback - `function(err, img)`
- * @example
-@@ -726,7 +726,7 @@ NAN_METHOD(Image::filter)
- Nan::ThrowTypeError("last argument must be a callback function");
- return;
- }
--
-+
- Image* im = Nan::ObjectWrap::Unwrap<Image>(info.Holder());
- if (!info[0]->IsString())
- {
-@@ -735,7 +735,7 @@ NAN_METHOD(Image::filter)
- }
- filter_image_baton_t *closure = new filter_image_baton_t();
- closure->filter = TOSTR(info[0]);
--
-+
- // ensure callback is a function
- v8::Local<v8::Value> callback = info[info.Length()-1];
- closure->request.data = closure;
-@@ -828,11 +828,11 @@ v8::Local<v8::Value> Image::_fillSync(Na
- else if (info[0]->IsObject())
- {
- v8::Local<v8::Object> obj = info[0]->ToObject();
-- if (obj->IsNull() || obj->IsUndefined() || !Nan::New(Color::constructor)->HasInstance(obj))
-+ if (obj->IsNull() || obj->IsUndefined() || !Nan::New(Color::constructor)->HasInstance(obj))
- {
- Nan::ThrowTypeError("A numeric or color value is expected");
- }
-- else
-+ else
- {
- Color * color = Nan::ObjectWrap::Unwrap<Color>(obj);
- mapnik::fill(*im->this_,*(color->get()));
-@@ -886,9 +886,9 @@ typedef struct {
- * if (err) throw err;
- * var colors = img.getPixel(0,0, {get_color: true});
- * pixel is colored blue
-- * console.log(color.b); // 255
-+ * console.log(color.b); // 255
- * });
-- *
-+ *
- * // or fill with rgb string
- * img.fill('rgba(255,255,255,0)', function(err, img) { ... });
- */
-@@ -898,7 +898,7 @@ NAN_METHOD(Image::fill)
- info.GetReturnValue().Set(_fillSync(info));
- return;
- }
--
-+
- Image* im = Nan::ObjectWrap::Unwrap<Image>(info.Holder());
- fill_image_baton_t *closure = new fill_image_baton_t();
- if (info[0]->IsUint32())
-@@ -919,13 +919,13 @@ NAN_METHOD(Image::fill)
- else if (info[0]->IsObject())
- {
- v8::Local<v8::Object> obj = info[0]->ToObject();
-- if (obj->IsNull() || obj->IsUndefined() || !Nan::New(Color::constructor)->HasInstance(obj))
-+ if (obj->IsNull() || obj->IsUndefined() || !Nan::New(Color::constructor)->HasInstance(obj))
- {
- delete closure;
- Nan::ThrowTypeError("A numeric or color value is expected");
- return;
- }
-- else
-+ else
- {
- Color * color = Nan::ObjectWrap::Unwrap<Color>(obj);
- closure->c = *(color->get());
-@@ -1219,7 +1219,7 @@ v8::Local<v8::Value> Image::_premultiply
- * @example
- * var img = new mapnik.Image(5,5);
- * img.premultiply(function(err, img) {
-- * if (err) throw err;
-+ * if (err) throw err;
- * // your custom code with premultiplied img
- * })
- */
-@@ -1342,7 +1342,7 @@ typedef struct {
- * @example
- * var img = new mapnik.Image(2,2);
- * console.log(img.isSolid()); // true
-- *
-+ *
- * // change a pixel
- * img.setPixel(0,0, new mapnik.Color('green'));
- * console.log(img.isSolid()); // false
-@@ -1450,7 +1450,7 @@ typedef struct {
- uv_work_t request;
- Image* im1;
- image_ptr im2;
-- mapnik::image_dtype type;
-+ mapnik::image_dtype type;
- double offset;
- double scaling;
- Nan::Persistent<v8::Function> cb;
-@@ -1483,14 +1483,14 @@ NAN_METHOD(Image::copy)
- info.GetReturnValue().Set(_copySync(info));
- return;
- }
--
-+
- Image* im1 = Nan::ObjectWrap::Unwrap<Image>(info.Holder());
- double offset = 0.0;
- bool scaling_or_offset_set = false;
- double scaling = 1.0;
- mapnik::image_dtype type = im1->this_->get_dtype();
- v8::Local<v8::Object> options = Nan::New<v8::Object>();
--
-+
- if (info.Length() >= 2)
- {
- if (info[0]->IsNumber())
-@@ -1524,7 +1524,7 @@ NAN_METHOD(Image::copy)
- return;
- }
- }
--
-+
- if (options->Has(Nan::New("scaling").ToLocalChecked()))
- {
- v8::Local<v8::Value> scaling_val = options->Get(Nan::New("scaling").ToLocalChecked());
-@@ -1539,7 +1539,7 @@ NAN_METHOD(Image::copy)
- return;
- }
- }
--
-+
- if (options->Has(Nan::New("offset").ToLocalChecked()))
- {
- v8::Local<v8::Value> offset_val = options->Get(Nan::New("offset").ToLocalChecked());
-@@ -1560,7 +1560,7 @@ NAN_METHOD(Image::copy)
- scaling = im1->this_->get_scaling();
- offset = im1->this_->get_offset();
- }
--
-+
- copy_image_baton_t *closure = new copy_image_baton_t();
- closure->request.data = closure;
- closure->im1 = im1;
-@@ -1615,8 +1615,9 @@ void Image::EIO_AfterCopy(uv_work_t* req
- {
- Image* im = new Image(closure->im2);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(im);
-- v8::Local<v8::Object> image_obj = Nan::New(constructor)->GetFunction()->NewInstance(1, &ext);
-- v8::Local<v8::Value> argv[2] = { Nan::Null(), image_obj };
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Image instance");
-+ v8::Local<v8::Value> argv[2] = { Nan::Null(), maybe_local.ToLocalChecked() };
- Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(closure->cb), 2, argv);
- }
- closure->im1->Unref();
-@@ -1686,7 +1687,7 @@ v8::Local<v8::Value> Image::_copySync(Na
- return scope.Escape(Nan::Undefined());
- }
- }
--
-+
- if (options->Has(Nan::New("scaling").ToLocalChecked()))
- {
- v8::Local<v8::Value> scaling_val = options->Get(Nan::New("scaling").ToLocalChecked());
-@@ -1701,7 +1702,7 @@ v8::Local<v8::Value> Image::_copySync(Na
- return scope.Escape(Nan::Undefined());
- }
- }
--
-+
- if (options->Has(Nan::New("offset").ToLocalChecked()))
- {
- v8::Local<v8::Value> offset_val = options->Get(Nan::New("offset").ToLocalChecked());
-@@ -1733,7 +1734,9 @@ v8::Local<v8::Value> Image::_copySync(Na
- );
- Image* new_im = new Image(imagep);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(new_im);
-- return scope.Escape(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Image instance");
-+ return scope.Escape(maybe_local.ToLocalChecked());
- }
- catch (std::exception const& ex)
- {
-@@ -1779,7 +1782,7 @@ typedef struct {
- * });
- */
- NAN_METHOD(Image::resize)
--{
-+{
- // ensure callback is a function
- v8::Local<v8::Value> callback = info[info.Length() - 1];
- if (!info[info.Length()-1]->IsFunction()) {
-@@ -1794,7 +1797,7 @@ NAN_METHOD(Image::resize)
- double filter_factor = 1.0;
- mapnik::scaling_method_e scaling_method = mapnik::SCALING_NEAR;
- v8::Local<v8::Object> options = Nan::New<v8::Object>();
--
-+
- if (info.Length() >= 3)
- {
- if (info[0]->IsNumber())
-@@ -1845,7 +1848,7 @@ NAN_METHOD(Image::resize)
- return;
- }
- }
-- if (options->Has(Nan::New("offset_x").ToLocalChecked()))
-+ if (options->Has(Nan::New("offset_x").ToLocalChecked()))
- {
- v8::Local<v8::Value> bind_opt = options->Get(Nan::New("offset_x").ToLocalChecked());
- if (!bind_opt->IsNumber())
-@@ -1855,7 +1858,7 @@ NAN_METHOD(Image::resize)
- }
- offset_x = bind_opt->IntegerValue();
- }
-- if (options->Has(Nan::New("offset_y").ToLocalChecked()))
-+ if (options->Has(Nan::New("offset_y").ToLocalChecked()))
- {
- v8::Local<v8::Value> bind_opt = options->Get(Nan::New("offset_y").ToLocalChecked());
- if (!bind_opt->IsNumber())
-@@ -1884,7 +1887,7 @@ NAN_METHOD(Image::resize)
- return;
- }
- }
--
-+
- if (options->Has(Nan::New("filter_factor").ToLocalChecked()))
- {
- v8::Local<v8::Value> ff_val = options->Get(Nan::New("filter_factor").ToLocalChecked());
-@@ -1917,7 +1920,7 @@ NAN_METHOD(Image::resize)
- struct resize_visitor
- {
-
-- resize_visitor(mapnik::image_any const& im1,
-+ resize_visitor(mapnik::image_any const& im1,
- mapnik::scaling_method_e scaling_method,
- double image_ratio_x,
- double image_ratio_y,
-@@ -1938,7 +1941,7 @@ struct resize_visitor
- {
- throw std::runtime_error("RGBA8 images must be premultiplied prior to using resize");
- }
-- mapnik::scale_image_agg(im2,
-+ mapnik::scale_image_agg(im2,
- mapnik::util::get<mapnik::image_rgba8>(im1_),
- scaling_method_,
- image_ratio_x_,
-@@ -1951,7 +1954,7 @@ struct resize_visitor
- template <typename T>
- void operator()(T & im2) const
- {
-- mapnik::scale_image_agg(im2,
-+ mapnik::scale_image_agg(im2,
- mapnik::util::get<T>(im1_),
- scaling_method_,
- image_ratio_x_,
-@@ -1960,7 +1963,7 @@ struct resize_visitor
- offset_y_,
- filter_factor_);
- }
--
-+
- void operator()(mapnik::image_null &) const
- {
- // Should be caught earlier so no test coverage should reach here.
-@@ -1968,7 +1971,7 @@ struct resize_visitor
- throw std::runtime_error("Can not resize null images");
- /* LCOV_EXCL_STOP */
- }
--
-+
- void operator()(mapnik::image_gray8s &) const
- {
- throw std::runtime_error("Mapnik currently does not support resizing signed 8 bit integer rasters");
-@@ -1978,27 +1981,27 @@ struct resize_visitor
- {
- throw std::runtime_error("Mapnik currently does not support resizing signed 16 bit integer rasters");
- }
--
-+
- void operator()(mapnik::image_gray32 &) const
- {
- throw std::runtime_error("Mapnik currently does not support resizing unsigned 32 bit integer rasters");
- }
--
-+
- void operator()(mapnik::image_gray32s &) const
- {
- throw std::runtime_error("Mapnik currently does not support resizing signed 32 bit integer rasters");
- }
--
-+
- void operator()(mapnik::image_gray64 &) const
- {
- throw std::runtime_error("Mapnik currently does not support resizing unsigned 64 bit integer rasters");
- }
--
-+
- void operator()(mapnik::image_gray64s &) const
- {
- throw std::runtime_error("Mapnik currently does not support resizing signed 64 bit integer rasters");
- }
--
-+
- void operator()(mapnik::image_gray64f &) const
- {
- throw std::runtime_error("Mapnik currently does not support resizing 64 bit floating point rasters");
-@@ -2030,8 +2033,8 @@ void Image::EIO_Resize(uv_work_t* req)
- double offset = closure->im1->this_->get_offset();
- double scaling = closure->im1->this_->get_scaling();
-
-- closure->im2 = std::make_shared<mapnik::image_any>(closure->size_x,
-- closure->size_y,
-+ closure->im2 = std::make_shared<mapnik::image_any>(closure->size_x,
-+ closure->size_y,
- closure->im1->this_->get_dtype(),
- true,
- true,
-@@ -2046,7 +2049,7 @@ void Image::EIO_Resize(uv_work_t* req)
- closure->error_name = "Image width or height is zero or less then zero.";
- return;
- }
-- double image_ratio_x = static_cast<double>(closure->size_x) / im_width;
-+ double image_ratio_x = static_cast<double>(closure->size_x) / im_width;
- double image_ratio_y = static_cast<double>(closure->size_y) / im_height;
- resize_visitor visit(*(closure->im1->this_),
- closure->scaling_method,
-@@ -2077,8 +2080,9 @@ void Image::EIO_AfterResize(uv_work_t* r
- {
- Image* im = new Image(closure->im2);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(im);
-- v8::Local<v8::Object> image_obj = Nan::New(constructor)->GetFunction()->NewInstance(1, &ext);
-- v8::Local<v8::Value> argv[2] = { Nan::Null(), image_obj };
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Image instance");
-+ v8::Local<v8::Value> argv[2] = { Nan::Null(), maybe_local.ToLocalChecked() };
- Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(closure->cb), 2, argv);
- }
- closure->im1->Unref();
-@@ -2158,7 +2162,7 @@ v8::Local<v8::Value> Image::_resizeSync(
- {
- Nan::ThrowTypeError("Resize requires at least a width and height parameter");
- return scope.Escape(Nan::Undefined());
-- }
-+ }
- if (info.Length() >= 3)
- {
- if (info[2]->IsObject())
-@@ -2171,7 +2175,7 @@ v8::Local<v8::Value> Image::_resizeSync(
- return scope.Escape(Nan::Undefined());
- }
- }
-- if (options->Has(Nan::New("offset_x").ToLocalChecked()))
-+ if (options->Has(Nan::New("offset_x").ToLocalChecked()))
- {
- v8::Local<v8::Value> bind_opt = options->Get(Nan::New("offset_x").ToLocalChecked());
- if (!bind_opt->IsNumber())
-@@ -2181,7 +2185,7 @@ v8::Local<v8::Value> Image::_resizeSync(
- }
- offset_x = bind_opt->IntegerValue();
- }
-- if (options->Has(Nan::New("offset_y").ToLocalChecked()))
-+ if (options->Has(Nan::New("offset_y").ToLocalChecked()))
- {
- v8::Local<v8::Value> bind_opt = options->Get(Nan::New("offset_y").ToLocalChecked());
- if (!bind_opt->IsNumber())
-@@ -2191,7 +2195,7 @@ v8::Local<v8::Value> Image::_resizeSync(
- }
- offset_y = bind_opt->IntegerValue();
- }
--
-+
- if (options->Has(Nan::New("scaling_method").ToLocalChecked()))
- {
- v8::Local<v8::Value> scaling_val = options->Get(Nan::New("scaling_method").ToLocalChecked());
-@@ -2211,7 +2215,7 @@ v8::Local<v8::Value> Image::_resizeSync(
- return scope.Escape(Nan::Undefined());
- }
- }
--
-+
- if (options->Has(Nan::New("filter_factor").ToLocalChecked()))
- {
- v8::Local<v8::Value> ff_val = options->Get(Nan::New("filter_factor").ToLocalChecked());
-@@ -2243,16 +2247,16 @@ v8::Local<v8::Value> Image::_resizeSync(
- double offset = im->this_->get_offset();
- double scaling = im->this_->get_scaling();
-
-- image_ptr imagep = std::make_shared<mapnik::image_any>(width,
-- height,
-+ image_ptr imagep = std::make_shared<mapnik::image_any>(width,
-+ height,
- im->this_->get_dtype(),
- true,
- true,
- false);
- imagep->set_offset(offset);
- imagep->set_scaling(scaling);
-- double image_ratio_x = static_cast<double>(width) / im_width;
-- double image_ratio_y = static_cast<double>(height) / im_height;
-+ double image_ratio_x = static_cast<double>(width) / im_width;
-+ double image_ratio_y = static_cast<double>(height) / im_height;
- resize_visitor visit(*(im->this_),
- scaling_method,
- image_ratio_x,
-@@ -2263,7 +2267,9 @@ v8::Local<v8::Value> Image::_resizeSync(
- mapnik::util::apply_visitor(visit, *imagep);
- Image* new_im = new Image(imagep);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(new_im);
-- return scope.Escape(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Image instance");
-+ return scope.Escape(maybe_local.ToLocalChecked());
- }
- catch (std::exception const& ex)
- {
-@@ -2372,7 +2378,9 @@ v8::Local<v8::Value> Image::_openSync(Na
- }
- Image* im = new Image(imagep);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(im);
-- return scope.Escape(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Image instance");
-+ return scope.Escape(maybe_local.ToLocalChecked());
- }
- }
- Nan::ThrowTypeError(("Unsupported image format:" + filename).c_str());
-@@ -2413,11 +2421,11 @@ typedef struct {
- * @memberof Image
- * @static
- * @param {string} path - path to the image you want to load
-- * @param {Function} callback -
-+ * @param {Function} callback -
- * @example
- * mapnik.Image.open('./path/to/image.jpg', function(err, img) {
- * if (err) throw err;
-- * // img is now an Image object
-+ * // img is now an Image object
- * });
- */
- NAN_METHOD(Image::open)
-@@ -2508,8 +2516,9 @@ void Image::EIO_AfterOpen(uv_work_t* req
- {
- Image* im = new Image(closure->im);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(im);
-- v8::Local<v8::Object> image_obj = Nan::New(constructor)->GetFunction()->NewInstance(1, &ext);
-- v8::Local<v8::Value> argv[2] = { Nan::Null(), image_obj };
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Image instance");
-+ v8::Local<v8::Value> argv[2] = { Nan::Null(), maybe_local.ToLocalChecked() };
- Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(closure->cb), 2, argv);
- }
- closure->cb.Reset();
-@@ -2564,13 +2573,13 @@ v8::Local<v8::Value> Image::_fromSVGSync
- {
- Nan::EscapableHandleScope scope;
-
-- if (!fromFile && (info.Length() < 1 || !info[0]->IsObject()))
-+ if (!fromFile && (info.Length() < 1 || !info[0]->IsObject()))
- {
- Nan::ThrowTypeError("must provide a buffer argument");
- return scope.Escape(Nan::Undefined());
- }
-
-- if (fromFile && (info.Length() < 1 || !info[0]->IsString()))
-+ if (fromFile && (info.Length() < 1 || !info[0]->IsString()))
- {
- Nan::ThrowTypeError("must provide a filename argument");
- return scope.Escape(Nan::Undefined());
-@@ -2579,9 +2588,10 @@ v8::Local<v8::Value> Image::_fromSVGSync
-
- double scale = 1.0;
- std::uint32_t max_size = 2048;
-- if (info.Length() >= 2)
-+ bool strict = false;
-+ if (info.Length() >= 2)
- {
-- if (!info[1]->IsObject())
-+ if (!info[1]->IsObject())
- {
- Nan::ThrowTypeError("optional second arg must be an options object");
- return scope.Escape(Nan::Undefined());
-@@ -2590,7 +2600,7 @@ v8::Local<v8::Value> Image::_fromSVGSync
- if (options->Has(Nan::New("scale").ToLocalChecked()))
- {
- v8::Local<v8::Value> scale_opt = options->Get(Nan::New("scale").ToLocalChecked());
-- if (!scale_opt->IsNumber())
-+ if (!scale_opt->IsNumber())
- {
- Nan::ThrowTypeError("'scale' must be a number");
- return scope.Escape(Nan::Undefined());
-@@ -2607,16 +2617,26 @@ v8::Local<v8::Value> Image::_fromSVGSync
- v8::Local<v8::Value> opt = options->Get(Nan::New("max_size").ToLocalChecked());
- if (!opt->IsNumber())
- {
-- Nan::ThrowTypeError("max_size must be a positive integer");
-+ Nan::ThrowTypeError("'max_size' must be a positive integer");
- return scope.Escape(Nan::Undefined());
- }
- auto max_size_val = opt->IntegerValue();
- if (max_size_val < 0 || max_size_val > 65535) {
-- Nan::ThrowTypeError("max_size must be a positive integer between 0 and 65535");
-+ Nan::ThrowTypeError("'max_size' must be a positive integer between 0 and 65535");
- return scope.Escape(Nan::Undefined());
- }
- max_size = static_cast<std::uint32_t>(max_size_val);
- }
-+ if (options->Has(Nan::New("strict").ToLocalChecked()))
-+ {
-+ v8::Local<v8::Value> opt = options->Get(Nan::New("strict").ToLocalChecked());
-+ if (!opt->IsBoolean())
-+ {
-+ Nan::ThrowTypeError("'strict' must be a boolean value");
-+ return scope.Escape(Nan::Undefined());
-+ }
-+ strict = opt->BooleanValue();
-+ }
- }
-
- try
-@@ -2626,15 +2646,15 @@ v8::Local<v8::Value> Image::_fromSVGSync
- vertex_stl_adapter<svg_path_storage> stl_storage(marker_path->source());
- svg_path_adapter svg_path(stl_storage);
- svg_converter_type svg(svg_path, marker_path->attributes());
-- svg_parser p(svg);
-+ svg_parser p(svg, strict);
- if (fromFile)
- {
-- if (!p.parse(TOSTR(info[0])))
-+ p.parse(TOSTR(info[0]));
-+ if (!p.err_handler().error_messages().empty())
- {
-- std::ostringstream errorMessage("");
-+ std::ostringstream errorMessage;
- errorMessage << "SVG parse error:" << std::endl;
-- auto const& errors = p.error_messages();
-- for (auto error : errors) {
-+ for (auto const& error : p.err_handler().error_messages()) {
- errorMessage << error << std::endl;
- }
- Nan::ThrowTypeError(errorMessage.str().c_str());
-@@ -2644,18 +2664,18 @@ v8::Local<v8::Value> Image::_fromSVGSync
- else
- {
- v8::Local<v8::Object> obj = info[0]->ToObject();
-- if (obj->IsNull() || obj->IsUndefined() || !node::Buffer::HasInstance(obj))
-+ if (obj->IsNull() || obj->IsUndefined() || !node::Buffer::HasInstance(obj))
- {
- Nan::ThrowTypeError("first argument is invalid, must be a Buffer");
- return scope.Escape(Nan::Undefined());
- }
- std::string svg_buffer(node::Buffer::Data(obj),node::Buffer::Length(obj));
-- if (!p.parse_from_string(svg_buffer))
-+ p.parse_from_string(svg_buffer);
-+ if (!p.err_handler().error_messages().empty())
- {
-- std::ostringstream errorMessage("");
-+ std::ostringstream errorMessage;
- errorMessage << "SVG parse error:" << std::endl;
-- auto const& errors = p.error_messages();
-- for (auto error : errors) {
-+ for (auto const& error : p.err_handler().error_messages()) {
- errorMessage << error << std::endl;
- }
- Nan::ThrowTypeError(errorMessage.str().c_str());
-@@ -2677,7 +2697,7 @@ v8::Local<v8::Value> Image::_fromSVGSync
- double opacity = 1;
- double svg_width = svg.width() * scale;
- double svg_height = svg.height() * scale;
--
-+
- if (svg_width <= 0 || svg_height <= 0)
- {
- Nan::ThrowTypeError("image created from svg must have a width and height greater then zero");
-@@ -2718,7 +2738,9 @@ v8::Local<v8::Value> Image::_fromSVGSync
- image_ptr imagep = std::make_shared<mapnik::image_any>(im);
- Image *im2 = new Image(imagep);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(im2);
-- return scope.Escape(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Image instance");
-+ return scope.Escape(maybe_local.ToLocalChecked());
- }
- catch (std::exception const& ex)
- {
-@@ -2739,6 +2761,7 @@ typedef struct {
- bool error;
- double scale;
- std::uint32_t max_size;
-+ bool strict;
- std::string error_name;
- Nan::Persistent<v8::Function> cb;
- } svg_file_ptr_baton_t;
-@@ -2751,6 +2774,7 @@ typedef struct {
- bool error;
- double scale;
- std::uint32_t max_size;
-+ bool strict;
- std::string error_name;
- Nan::Persistent<v8::Object> buffer;
- Nan::Persistent<v8::Function> cb;
-@@ -2773,7 +2797,7 @@ typedef struct {
- * @example
- * mapnik.Image.fromSVG('./path/to/image.svg', {scale: 0.5}, function(err, img) {
- * if (err) throw err;
-- * // new img object (at 50% scale)
-+ * // new img object (at 50% scale)
- * });
- */
- NAN_METHOD(Image::fromSVG)
-@@ -2783,7 +2807,7 @@ NAN_METHOD(Image::fromSVG)
- return;
- }
-
-- if (info.Length() < 2 || !info[0]->IsString())
-+ if (info.Length() < 2 || !info[0]->IsString())
- {
- Nan::ThrowTypeError("must provide a filename argument");
- return;
-@@ -2798,9 +2822,10 @@ NAN_METHOD(Image::fromSVG)
-
- double scale = 1.0;
- std::uint32_t max_size = 2048;
-- if (info.Length() >= 3)
-+ bool strict = false;
-+ if (info.Length() >= 3)
- {
-- if (!info[1]->IsObject())
-+ if (!info[1]->IsObject())
- {
- Nan::ThrowTypeError("optional second arg must be an options object");
- return;
-@@ -2809,7 +2834,7 @@ NAN_METHOD(Image::fromSVG)
- if (options->Has(Nan::New("scale").ToLocalChecked()))
- {
- v8::Local<v8::Value> scale_opt = options->Get(Nan::New("scale").ToLocalChecked());
-- if (!scale_opt->IsNumber())
-+ if (!scale_opt->IsNumber())
- {
- Nan::ThrowTypeError("'scale' must be a number");
- return;
-@@ -2826,16 +2851,26 @@ NAN_METHOD(Image::fromSVG)
- v8::Local<v8::Value> opt = options->Get(Nan::New("max_size").ToLocalChecked());
- if (!opt->IsNumber())
- {
-- Nan::ThrowTypeError("max_size must be a positive integer");
-+ Nan::ThrowTypeError("'max_size' must be a positive integer");
- return;
- }
- auto max_size_val = opt->IntegerValue();
- if (max_size_val < 0 || max_size_val > 65535) {
-- Nan::ThrowTypeError("max_size must be a positive integer between 0 and 65535");
-+ Nan::ThrowTypeError("'max_size' must be a positive integer between 0 and 65535");
- return;
- }
- max_size = static_cast<std::uint32_t>(max_size_val);
- }
-+ if (options->Has(Nan::New("strict").ToLocalChecked()))
-+ {
-+ v8::Local<v8::Value> opt = options->Get(Nan::New("strict").ToLocalChecked());
-+ if (!opt->IsBoolean())
-+ {
-+ Nan::ThrowTypeError("'strict' must be a boolean value");
-+ return;
-+ }
-+ strict = opt->BooleanValue();
-+ }
- }
-
- svg_file_ptr_baton_t *closure = new svg_file_ptr_baton_t();
-@@ -2844,6 +2879,7 @@ NAN_METHOD(Image::fromSVG)
- closure->error = false;
- closure->scale = scale;
- closure->max_size = max_size;
-+ closure->strict = strict;
- closure->cb.Reset(callback.As<v8::Function>());
- uv_queue_work(uv_default_loop(), &closure->request, EIO_FromSVG, (uv_after_work_cb)EIO_AfterFromSVG);
- return;
-@@ -2860,13 +2896,13 @@ void Image::EIO_FromSVG(uv_work_t* req)
- vertex_stl_adapter<svg_path_storage> stl_storage(marker_path->source());
- svg_path_adapter svg_path(stl_storage);
- svg_converter_type svg(svg_path, marker_path->attributes());
-- svg_parser p(svg);
-- if (!p.parse(closure->filename))
-+ svg_parser p(svg, closure->strict);
-+ p.parse(closure->filename);
-+ if (!p.err_handler().error_messages().empty())
- {
-- std::ostringstream errorMessage("");
-+ std::ostringstream errorMessage;
- errorMessage << "SVG parse error:" << std::endl;
-- auto const& errors = p.error_messages();
-- for (auto error : errors) {
-+ for (auto const& error : p.err_handler().error_messages()) {
- errorMessage << error << std::endl;
- }
- closure->error = true;
-@@ -2937,7 +2973,7 @@ void Image::EIO_FromSVG(uv_work_t* req)
- // it is a good idea to keep this. Therefore, any exceptions thrown will fail gracefully.
- // LCOV_EXCL_START
- closure->error = true;
-- closure->error_name = "Failed to load: " + closure->filename;
-+ closure->error_name = ex.what();
- // LCOV_EXCL_STOP
- }
- }
-@@ -2955,8 +2991,9 @@ void Image::EIO_AfterFromSVG(uv_work_t*
- {
- Image* im = new Image(closure->im);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(im);
-- v8::Local<v8::Object> image_obj = Nan::New(constructor)->GetFunction()->NewInstance(1, &ext);
-- v8::Local<v8::Value> argv[2] = { Nan::Null(), image_obj };
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Image instance");
-+ v8::Local<v8::Value> argv[2] = { Nan::Null(), maybe_local.ToLocalChecked() };
- Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(closure->cb), 2, argv);
- }
- closure->cb.Reset();
-@@ -2973,12 +3010,13 @@ void Image::EIO_AfterFromSVG(uv_work_t*
- * @param {number} [options.scale] - scale the image. For example passing `0.5` as scale would render
- * your SVG at 50% the original size.
- * @param {number} [options.max_size] - the maximum allowed size of the svg dimensions * scale. The default is 2048.
-+ * @param {boolean} [options.strict] - enable `strict` parsing mode e.g throw on unsupported element/attribute. The default is `false`.
- * This option can be passed a smaller or larger size in order to control the final size of the image allocated for
- * rasterizing the SVG.
- * @param {Function} callback = `function(err, img)`
- * @example
- * var buffer = fs.readFileSync('./path/to/image.svg');
-- * mapnik.Image.fromSVGBytesSync(buffer, function(err, img) {
-+ * mapnik.Image.fromSVGBytes(buffer, function(err, img) {
- * if (err) throw err;
- * // your custom code with `img`
- * });
-@@ -3010,9 +3048,10 @@ NAN_METHOD(Image::fromSVGBytes)
-
- double scale = 1.0;
- std::uint32_t max_size = 2048;
-- if (info.Length() >= 3)
-+ bool strict = true;
-+ if (info.Length() >= 3)
- {
-- if (!info[1]->IsObject())
-+ if (!info[1]->IsObject())
- {
- Nan::ThrowTypeError("optional second arg must be an options object");
- return;
-@@ -3021,7 +3060,7 @@ NAN_METHOD(Image::fromSVGBytes)
- if (options->Has(Nan::New("scale").ToLocalChecked()))
- {
- v8::Local<v8::Value> scale_opt = options->Get(Nan::New("scale").ToLocalChecked());
-- if (!scale_opt->IsNumber())
-+ if (!scale_opt->IsNumber())
- {
- Nan::ThrowTypeError("'scale' must be a number");
- return;
-@@ -3038,16 +3077,26 @@ NAN_METHOD(Image::fromSVGBytes)
- v8::Local<v8::Value> opt = options->Get(Nan::New("max_size").ToLocalChecked());
- if (!opt->IsNumber())
- {
-- Nan::ThrowTypeError("max_size must be a positive integer");
-+ Nan::ThrowTypeError("'max_size' must be a positive integer");
- return;
- }
- auto max_size_val = opt->IntegerValue();
- if (max_size_val < 0 || max_size_val > 65535) {
-- Nan::ThrowTypeError("max_size must be a positive integer between 0 and 65535");
-+ Nan::ThrowTypeError("'max_size' must be a positive integer between 0 and 65535");
- return;
- }
- max_size = static_cast<std::uint32_t>(max_size_val);
- }
-+ if (options->Has(Nan::New("strict").ToLocalChecked()))
-+ {
-+ v8::Local<v8::Value> opt = options->Get(Nan::New("strict").ToLocalChecked());
-+ if (!opt->IsBoolean())
-+ {
-+ Nan::ThrowTypeError("'strict' must be a boolean value");
-+ return;
-+ }
-+ strict = opt->BooleanValue();
-+ }
- }
-
- svg_mem_ptr_baton_t *closure = new svg_mem_ptr_baton_t();
-@@ -3058,6 +3107,7 @@ NAN_METHOD(Image::fromSVGBytes)
- closure->data = node::Buffer::Data(obj);
- closure->scale = scale;
- closure->max_size = max_size;
-+ closure->strict = strict;
- closure->dataLength = node::Buffer::Length(obj);
- uv_queue_work(uv_default_loop(), &closure->request, EIO_FromSVGBytes, (uv_after_work_cb)EIO_AfterFromSVGBytes);
- return;
-@@ -3074,15 +3124,15 @@ void Image::EIO_FromSVGBytes(uv_work_t*
- vertex_stl_adapter<svg_path_storage> stl_storage(marker_path->source());
- svg_path_adapter svg_path(stl_storage);
- svg_converter_type svg(svg_path, marker_path->attributes());
-- svg_parser p(svg);
-+ svg_parser p(svg, closure->strict);
-
- std::string svg_buffer(closure->data,closure->dataLength);
-- if (!p.parse_from_string(svg_buffer))
-+ p.parse_from_string(svg_buffer);
-+ if (!p.err_handler().error_messages().empty())
- {
-- std::ostringstream errorMessage("");
-+ std::ostringstream errorMessage;
- errorMessage << "SVG parse error:" << std::endl;
-- auto const& errors = p.error_messages();
-- for (auto error : errors) {
-+ for (auto const& error : p.err_handler().error_messages()) {
- errorMessage << error << std::endl;
- }
- closure->error = true;
-@@ -3180,9 +3230,9 @@ void Image::EIO_AfterFromSVGBytes(uv_wor
- }
-
- /**
-- * Create an image of the existing buffer.
-- *
-- * Note: the buffer must live as long as the image.
-+ * Create an image of the existing buffer.
-+ *
-+ * Note: the buffer must live as long as the image.
- * It is recommended that you do not use this method. Be warned!
- *
- * @name fromBufferSync
-@@ -3214,7 +3264,7 @@ v8::Local<v8::Value> Image::_fromBufferS
- unsigned width = info[0]->IntegerValue();
- unsigned height = info[1]->IntegerValue();
-
-- if (width <= 0 || height <= 0)
-+ if (width <= 0 || height <= 0)
- {
- Nan::ThrowTypeError("width and height must be greater then zero");
- return scope.Escape(Nan::Undefined());
-@@ -3288,10 +3338,11 @@ v8::Local<v8::Value> Image::_fromBufferS
- image_ptr imagep = std::make_shared<mapnik::image_any>(im_wrapper);
- Image* im = new Image(imagep);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(im);
-- v8::Local<v8::Value> image_instance = Nan::New(constructor)->GetFunction()->NewInstance(1, &ext);
-- v8::Local<v8::Object> image_obj = image_instance->ToObject();
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Image instance");
-+ v8::Local<v8::Object> image_obj = maybe_local.ToLocalChecked()->ToObject();
- image_obj->Set(Nan::New("_buffer").ToLocalChecked(),obj);
-- return scope.Escape(image_instance);
-+ return scope.Escape(maybe_local.ToLocalChecked());
- }
- catch (std::exception const& ex)
- {
-@@ -3343,7 +3394,9 @@ v8::Local<v8::Value> Image::_fromBytesSy
- image_ptr imagep = std::make_shared<mapnik::image_any>(reader->read(0,0,reader->width(),reader->height()));
- Image* im = new Image(imagep);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(im);
-- return scope.Escape(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Image instance");
-+ return scope.Escape(maybe_local.ToLocalChecked());
- }
- // The only way this is ever reached is if the reader factory in
- // mapnik was not providing an image type it should. This should never
-@@ -3361,7 +3414,7 @@ v8::Local<v8::Value> Image::_fromBytesSy
- }
-
- /**
-- * Create an image from a byte stream buffer.
-+ * Create an image from a byte stream buffer.
- *
- * @name fromBytes
- * @param {Buffer} buffer - image buffer
-@@ -3373,9 +3426,9 @@ v8::Local<v8::Value> Image::_fromBytesSy
- * @memberof Image
- * @example
- * var buffer = fs.readFileSync('./path/to/image.png');
-- * mapnik.Image.fromBytesSync(buffer, function(err, img) {
-+ * mapnik.Image.fromBytes(buffer, function(err, img) {
- * if (err) throw err;
-- * // your custom code with `img` object
-+ * // your custom code with `img` object
- * });
- */
- NAN_METHOD(Image::fromBytes)
-@@ -3502,7 +3555,7 @@ void Image::EIO_AfterFromBytes(uv_work_t
- else if (closure->im == nullptr)
- {
- /* LCOV_EXCL_START */
-- // The only way this is ever reached is if the reader factory in
-+ // The only way this is ever reached is if the reader factory in
- // mapnik was not providing an image type it should. This should never
- // be occuring so marking this out from coverage
- v8::Local<v8::Value> argv[1] = { Nan::Error("Failed to load from buffer") };
-@@ -3512,8 +3565,9 @@ void Image::EIO_AfterFromBytes(uv_work_t
- {
- Image* im = new Image(closure->im);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(im);
-- v8::Local<v8::Object> image_obj = Nan::New(constructor)->GetFunction()->NewInstance(1, &ext);
-- v8::Local<v8::Value> argv[2] = { Nan::Null(), image_obj };
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Image instance");
-+ v8::Local<v8::Value> argv[2] = { Nan::Null(), maybe_local.ToLocalChecked() };
- Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(closure->cb), 2, argv);
- }
- closure->cb.Reset();
-@@ -3622,17 +3676,17 @@ typedef struct {
- * @example
- * var img = new mapnik.Image.open('./path/to/image.png');
- * myImage.encode('png', function(err, encoded) {
-- * if (err) throw err;
-+ * if (err) throw err;
- * // write buffer to new file
- * fs.writeFileSync('myimage.png', encoded);
- * });
-- *
-+ *
- * // encoding an image object with a mapnik.Palette
- * var im = new mapnik.Image(256, 256);
- * var pal = new mapnik.Palette(new Buffer('\xff\x09\x93\xFF\x01\x02\x03\x04','ascii'));
- * im.encode('png', {palette: pal}, function(err, encode) {
- * if (err) throw err;
-- * // your custom code with `encode` image buffer
-+ * // your custom code with `encode` image buffer
- * });
- */
- NAN_METHOD(Image::encode)
-@@ -3794,12 +3848,12 @@ NAN_METHOD(Image::saveSync)
- v8::Local<v8::Value> Image::_saveSync(Nan::NAN_METHOD_ARGS_TYPE info) {
- Nan::EscapableHandleScope scope;
- Image* im = Nan::ObjectWrap::Unwrap<Image>(info.Holder());
--
-+
- if (info.Length() == 0 || !info[0]->IsString()){
- Nan::ThrowTypeError("filename required to save file");
- return scope.Escape(Nan::Undefined());
- }
--
-+
- std::string filename = TOSTR(info[0]);
- std::string format("");
-
-@@ -3854,13 +3908,13 @@ typedef struct {
- * @example
- * img.save('image.png', 'png', function(err) {
- * if (err) throw err;
-- * // your custom code
-+ * // your custom code
- * });
- */
- NAN_METHOD(Image::save)
- {
- Image* im = Nan::ObjectWrap::Unwrap<Image>(info.Holder());
--
-+
- if (info.Length() == 0 || !info[0]->IsString()){
- Nan::ThrowTypeError("filename required to save file");
- return;
-@@ -3872,7 +3926,7 @@ NAN_METHOD(Image::save)
- }
- // ensure callback is a function
- v8::Local<v8::Value> callback = info[info.Length()-1];
--
-+
- std::string filename = TOSTR(info[0]);
- std::string format("");
-
-@@ -3912,7 +3966,7 @@ void Image::EIO_Save(uv_work_t* req)
- try
- {
- mapnik::save_to_file(*(closure->im->this_),
-- closure->filename,
-+ closure->filename,
- closure->format);
- }
- catch (std::exception const& ex)
-@@ -4157,7 +4211,7 @@ void Image::EIO_AfterComposite(uv_work_t
-
- composite_image_baton_t *closure = static_cast<composite_image_baton_t *>(req->data);
-
-- if (closure->error)
-+ if (closure->error)
- {
- v8::Local<v8::Value> argv[1] = { Nan::Error(closure->error_name.c_str()) };
- Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(closure->cb), 1, argv);
-@@ -4190,8 +4244,8 @@ NAN_SETTER(Image::set_scaling)
- if (!value->IsNumber())
- {
- Nan::ThrowError("Must provide a number");
-- }
-- else
-+ }
-+ else
- {
- double val = value->NumberValue();
- if (val == 0.0)
-@@ -4209,8 +4263,8 @@ NAN_SETTER(Image::set_offset)
- if (!value->IsNumber())
- {
- Nan::ThrowError("Must provide a number");
-- }
-- else
-+ }
-+ else
- {
- double val = value->NumberValue();
- im->this_->set_offset(val);
-@@ -4234,4 +4288,3 @@ NAN_METHOD(Image::data)
- // TODO - make this zero copy
- info.GetReturnValue().Set(Nan::CopyBuffer(reinterpret_cast<const char *>(im->this_->bytes()), im->this_->size()).ToLocalChecked());
- }
--
---- a/src/mapnik_image_view.cpp
-+++ b/src/mapnik_image_view.cpp
-@@ -1,4 +1,3 @@
--
- // mapnik
- #include <mapnik/color.hpp> // for color
- #include <mapnik/image_view.hpp> // for image_view, etc
-@@ -99,7 +98,9 @@ v8::Local<v8::Value> ImageView::NewInsta
- ImageView* imv = new ImageView(JSImage);
- imv->this_ = std::make_shared<mapnik::image_view_any>(mapnik::create_view(*(JSImage->get()),x,y,w,h));
- v8::Local<v8::Value> ext = Nan::New<v8::External>(imv);
-- return scope.Escape(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new ImageView instance");
-+ return scope.Escape(maybe_local.ToLocalChecked());
- }
-
- typedef struct {
-@@ -155,7 +156,7 @@ struct visitor_get_pixel_view
- {
- visitor_get_pixel_view(int x, int y)
- : x_(x), y_(y) {}
--
-+
- v8::Local<v8::Value> operator() (mapnik::image_view_null const& data)
- {
- // This should never be reached because the width and height of 0 for a null
-@@ -200,7 +201,7 @@ struct visitor_get_pixel_view
- std::uint32_t val = mapnik::get_pixel<std::uint32_t>(data, x_, y_);
- return scope.Escape(Nan::New<v8::Uint32>(val));
- }
--
-+
- v8::Local<v8::Value> operator() (mapnik::image_view_gray32s const& data)
- {
- Nan::EscapableHandleScope scope;
-@@ -246,7 +247,7 @@ struct visitor_get_pixel_view
- private:
- int x_;
- int y_;
--
-+
- };
-
- void ImageView::EIO_AfterIsSolid(uv_work_t* req)
-@@ -585,5 +586,3 @@ NAN_METHOD(ImageView::save)
- }
- return;
- }
--
--
---- a/src/mapnik_layer.cpp
-+++ b/src/mapnik_layer.cpp
-@@ -111,7 +111,9 @@ v8::Local<v8::Value> Layer::NewInstance(
- // copy new mapnik::layer into the shared_ptr
- l->layer_ = std::make_shared<mapnik::layer>(lay_ref);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(l);
-- return scope.Escape(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Layer instance");
-+ return scope.Escape(maybe_local.ToLocalChecked());
- }
-
- NAN_GETTER(Layer::get_prop)
-@@ -147,25 +149,25 @@ NAN_GETTER(Layer::get_prop)
- }
- return;
- }
-- else if (a == "minimum_scale_denominator")
-+ else if (a == "minimum_scale_denominator")
- {
-- info.GetReturnValue().Set(Nan::New<v8::Number>(l->layer_->minimum_scale_denominator()));
-+ info.GetReturnValue().Set(Nan::New<v8::Number>(l->layer_->minimum_scale_denominator()));
- }
-- else if (a == "maximum_scale_denominator")
-+ else if (a == "maximum_scale_denominator")
- {
-- info.GetReturnValue().Set(Nan::New<v8::Number>(l->layer_->maximum_scale_denominator()));
-+ info.GetReturnValue().Set(Nan::New<v8::Number>(l->layer_->maximum_scale_denominator()));
- }
-- else if (a == "queryable")
-+ else if (a == "queryable")
- {
-- info.GetReturnValue().Set(Nan::New<v8::Boolean>(l->layer_->queryable()));
-+ info.GetReturnValue().Set(Nan::New<v8::Boolean>(l->layer_->queryable()));
- }
-- else if (a == "clear_label_cache")
-+ else if (a == "clear_label_cache")
- {
-- info.GetReturnValue().Set(Nan::New<v8::Boolean>(l->layer_->clear_label_cache()));
-+ info.GetReturnValue().Set(Nan::New<v8::Boolean>(l->layer_->clear_label_cache()));
- }
-- else // if (a == "active")
-+ else // if (a == "active")
- {
-- info.GetReturnValue().Set(Nan::New<v8::Boolean>(l->layer_->active()));
-+ info.GetReturnValue().Set(Nan::New<v8::Boolean>(l->layer_->active()));
- }
- }
-
-@@ -283,7 +285,7 @@ NAN_METHOD(Layer::describe)
-
- v8::Local<v8::Object> description = Nan::New<v8::Object>();
- mapnik::layer const& layer = *l->layer_;
--
-+
- description->Set(Nan::New("name").ToLocalChecked(), Nan::New<v8::String>(layer.name()).ToLocalChecked());
-
- description->Set(Nan::New("srs").ToLocalChecked(), Nan::New<v8::String>(layer.srs()).ToLocalChecked());
---- a/src/mapnik_map.cpp
-+++ b/src/mapnik_map.cpp
-@@ -611,7 +611,7 @@ typedef struct {
- * @param {String|number} [options.layer] - layer name (string) or index (positive integer, 0 index)
- * to query. If left blank, will query all layers.
- * @param {Function} callback
-- * @returns {Array} array - An array of `Featureset` objects and layer names, which each contain their own
-+ * @returns {Array} array - An array of `Featureset` objects and layer names, which each contain their own
- * `Feature` objects.
- * @example
- * // iterate over the first layer returned and get all attribute information for each feature
-@@ -626,7 +626,7 @@ typedef struct {
- * }
- * console.log(attributes); // => [{"attr_key": "attr_value"}, {...}, {...}]
- * });
-- *
-+ *
- */
- NAN_METHOD(Map::queryMapPoint)
- {
-@@ -635,7 +635,7 @@ NAN_METHOD(Map::queryMapPoint)
- }
-
- /**
-- * Query a `Mapnik#Map` object to retrieve layer and feature data based on geographic
-+ * Query a `Mapnik#Map` object to retrieve layer and feature data based on geographic
- * coordinates of the source data (use `Map#queryMapPoint` to query with XY coordinates).
- *
- * @name queryPoint
-@@ -647,7 +647,7 @@ NAN_METHOD(Map::queryMapPoint)
- * @param {String|number} [options.layer] - layer name (string) or index (positive integer, 0 index)
- * to query. If left blank, will query all layers.
- * @param {Function} callback
-- * @returns {Array} array - An array of `Featureset` objects and layer names, which each contain their own
-+ * @returns {Array} array - An array of `Featureset` objects and layer names, which each contain their own
- * `Feature` objects.
- * @example
- * // query based on web mercator coordinates
-@@ -662,7 +662,7 @@ NAN_METHOD(Map::queryMapPoint)
- * }
- * console.log(attributes); // => [{"attr_key": "attr_value"}, {...}, {...}]
- * });
-- *
-+ *
- */
- NAN_METHOD(Map::queryPoint)
- {
-@@ -1456,7 +1456,9 @@ NAN_METHOD(Map::clone)
- Map* m2 = new Map();
- m2->map_ = std::make_shared<mapnik::Map>(*m->map_);
- v8::Local<v8::Value> ext = Nan::New<v8::External>(m2);
-- info.GetReturnValue().Set(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Map instance");
-+ else info.GetReturnValue().Set(maybe_local.ToLocalChecked());
- }
-
- /**
-@@ -1667,8 +1669,8 @@ struct vector_tile_baton_t {
- * @param {Object} [options={}]
- * @param {Number} [options.buffer_size=0] size of the buffer on the image
- * @param {Number} [options.scale=1.0] scale the image
-- * @param {Number} [options.scale_denominator=0.0]
-- * @param {Number} [options.offset_x=0] pixel offset along the x-axis
-+ * @param {Number} [options.scale_denominator=0.0]
-+ * @param {Number} [options.offset_x=0] pixel offset along the x-axis
- * @param {Number} [options.offset_y=0] pixel offset along the y-axis
- * @param {String} [options.image_scaling] must be a valid scaling method (used when rendering a vector tile)
- * @param {String} [options.image_format] must be a string and valid image format (used when rendering a vector tile)
-@@ -1676,23 +1678,23 @@ struct vector_tile_baton_t {
- * @param {Boolean} [options.strictly_simple=] ensure all geometry is valid according to
- * OGC Simple definition (used when rendering a vector tile)
- * @param {Boolean} [options.multi_polygon_union] union all multipolygons (used when rendering a vector tile)
-- * @param {String} [options.fill_type] the fill type used in determining what are holes and what are outer rings. See the
-+ * @param {String} [options.fill_type] the fill type used in determining what are holes and what are outer rings. See the
- * [Clipper documentation](http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Types/PolyFillType.htm)
- * to learn more about fill types. (used when rendering a vector tile)
- * @param {String} [options.threading_mode] (used when rendering a vector tile)
-- * @param {Number} [options.simplify_distance] Simplification works to generalize
-- * geometries before encoding into vector tiles.simplification distance The
-+ * @param {Number} [options.simplify_distance] Simplification works to generalize
-+ * geometries before encoding into vector tiles.simplification distance The
- * `simplify_distance` value works in integer space over a 4096 pixel grid and uses
- * the [Douglas-Peucker algorithm](https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm).
- * (used when rendering a vector tile)
-- * @param {Object} [options.variables] Mapnik 3.x ONLY: A javascript object
-- * containing key value pairs that should be passed into Mapnik as variables
-- * for rendering and for datasource queries. For example if you passed
-+ * @param {Object} [options.variables] Mapnik 3.x ONLY: A javascript object
-+ * containing key value pairs that should be passed into Mapnik as variables
-+ * for rendering and for datasource queries. For example if you passed
- * `vtile.render(map,image,{ variables : {zoom:1} },cb)` then the `@zoom`
- * variable would be usable in Mapnik symbolizers like `line-width:"@zoom"`
-- * and as a token in Mapnik postgis sql sub-selects like
-+ * and as a token in Mapnik postgis sql sub-selects like
- * `(select * from table where some_field > @zoom)` as tmp (used when rendering a vector tile)
-- * @param {Boolean} [options.process_all_rings] if `true`, don't assume winding order and ring order of
-+ * @param {Boolean} [options.process_all_rings] if `true`, don't assume winding order and ring order of
- * polygons are correct according to the [`2.0` Mapbox Vector Tile specification](https://github.com/mapbox/vector-tile-spec)
- * (used when rendering a vector tile)
- * @returns {mapnik.Map} rendered image tile
-@@ -1714,7 +1716,7 @@ struct vector_tile_baton_t {
- * var vtile = new mapnik.VectorTile(9,112,195);
- * map.render(vtile, {}, function(err, vtile) {
- * if (err) throw err;
-- * console.log(vtile); // => vector tile object with data from xml
-+ * console.log(vtile); // => vector tile object with data from xml
- * });
- */
- NAN_METHOD(Map::render)
---- a/src/mapnik_memory_datasource.cpp
-+++ b/src/mapnik_memory_datasource.cpp
-@@ -46,6 +46,7 @@ MemoryDatasource::~MemoryDatasource()
-
- NAN_METHOD(MemoryDatasource::New)
- {
-+ std::clog << "WARNING: MemoryDatasource is deprecated and will be removed in node-mapnik >= 3.7.x\n";
- if (!info.IsConstructCall())
- {
- Nan::ThrowError("Cannot call constructor as function, you need to use 'new' keyword");
-@@ -112,7 +113,9 @@ v8::Local<v8::Value> MemoryDatasource::N
- MemoryDatasource* d = new MemoryDatasource();
- d->datasource_ = ds_ptr;
- v8::Local<v8::Value> ext = Nan::New<v8::External>(d);
-- return scope.Escape( Nan::New(constructor)->GetFunction()->NewInstance(1, &ext));
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new MemoryDatasource instance");
-+ return scope.Escape(maybe_local.ToLocalChecked());
- }
-
- NAN_METHOD(MemoryDatasource::parameters)
---- a/src/mapnik_projection.cpp
-+++ b/src/mapnik_projection.cpp
-@@ -10,7 +10,7 @@ Nan::Persistent<v8::FunctionTemplate> Pr
-
- /**
- * **`mapnik.Projection`**
-- *
-+ *
- * A geographical projection: this class makes it possible to translate between
- * locations in different projections
- *
-@@ -79,7 +79,7 @@ NAN_METHOD(Projection::New)
- lazy = lazy_opt->BooleanValue();
- }
- }
--
-+
- try
- {
- Projection* p = new Projection(TOSTR(info[0]), lazy);
---- a/src/mapnik_vector_tile.cpp
-+++ b/src/mapnik_vector_tile.cpp
-@@ -1396,8 +1396,9 @@ NAN_METHOD(VectorTile::layer)
- }
- }
- v8::Local<v8::Value> ext = Nan::New<v8::External>(v);
-- v8::Local<v8::Object> vt_obj = Nan::New(constructor)->GetFunction()->NewInstance(1, &ext);
-- info.GetReturnValue().Set(vt_obj);
-+ Nan::MaybeLocal<v8::Object> maybe_local = Nan::NewInstance(Nan::New(constructor)->GetFunction(), 1, &ext);
-+ if (maybe_local.IsEmpty()) Nan::ThrowError("Could not create new Layer instance");
-+ else info.GetReturnValue().Set(maybe_local.ToLocalChecked());
- return;
- }
-
---- /dev/null
-+++ b/test/data/images/san-marino.svg
-@@ -0,0 +1,92 @@
-+<svg xmlns="http://www.w3.org/2000/svg" height="480" width="640" viewBox="0 0 640 480">
-+ <g fill-rule="evenodd" stroke-width="1pt">
-+ <path fill="#19b6ef" d="M0 240h640v240H0z"/>
-+ <path fill="#fff" d="M0 0h640v240H0z"/>
-+ </g>
-+ <path d="M317.07 339.221c52.45-39.239 108.96-119.306 42.74-161.41-12.336-2.388-26.107-1.672-32.713 3.582-3.501-1.99-6.288-1.83-9.79 1.91-2.466-3.025-4.935-4.379-10.028-2.865-10.188-5.173-19.42-6.288-31.517-3.105-57.623 34.622-22.366 116.76 41.308 161.888z" fill-rule="evenodd" stroke="#7d6c00" stroke-width="2.3686254" fill="#fd0"/>
-+ <g stroke="#3a9d4f">
-+ <path stroke-linejoin="round" d="M414.08 250.106s5.903-7.939 6.106-7.939c5.904-3.46 6.515-7.938 6.515-7.938 5.903-1.833 4.07-6.718 4.477-7.328 2.852-3.053 1.833-6.108 1.426-7.126 0-.812 2.036-8.345-.814-9.362.135-8.008-4.818-7.261-8.754-2.036-4.207 1.221-5.157 4.682-3.664 8.55-5.497 0-5.7 7.939-4.071 12.416-7.328-.203-3.257 7.939-3.461 8.347-2.442 1.221 1.832 12.824 2.24 12.416zM367.857 318.3l3.664 2.239c.746 2.781 3.325 4.547 5.294 4.072.95 4.274 5.563 3.665 8.956 1.221 2.714 3.936 [...]
-+ <path stroke-linejoin="round" d="M404.502 266.397c-4.14-3.122-6.446-6.853-5.7-10.586-2.713-3.664-4.614-5.903-2.035-9.16 0 0-2.036-7.329-2.036-7.532-5.292-2.035-3.053-6.513-1.629-8.142-2.51-3.461-2.578-7.126-.203-10.382-.068-6.515 4.546-4.071 8.345 0 0 0 6.311 4.479 1.63 8.55 4.681 1.629 6.107 5.698 3.46 7.327 4.071 1.833 4.681 5.497 2.442 7.94 4.14 3.326 2.579 7.465 3.868 11.196l-8.142 10.789z" fill-rule="evenodd" stroke-width="2.3686254" fill="#4fd46b"/>
-+ <path stroke-linejoin="round" d="M411.831 236.064c-.203-.203-6.92-8.753-5.089-9.364-.406-2.647-2.441-5.497-1.22-8.142-3.325-3.325-3.394-7.26-.815-10.38-2.239-3.054-1.221-7.125 1.832-9.772-.95-5.022 2.579-6.175 5.7-7.126 2.307-8.075 6.038-5.971 8.142.203 3.19 2.782 2.715 6.99 1.63 10.18 3.799 2.578 1.492 5.766-.204 7.124l-9.976 27.277z" fill-rule="evenodd" stroke-width="2.3686254" fill="#4fd46b"/>
-+ <path stroke-linejoin="round" d="M410.815 193.106l-5.7-5.7c1.473-3.02 2.659-8.344-1.627-10.789-2.364-5.757-14.182-12.892-16.083.815-1.799-4.136-5.563-8.21-8.345-3.46-6.175-5.292-9.5-3.665-6.311 3.053 0 0-2.848 4.478 4.682 7.939.611.61-2.442 8.142 6.515 8.345-1.696 2.579 1.086 6.175 4.682 5.903-2.579 3.19 1.764 6.583 4.477 5.294-1.154 3.528-1.086 5.225 3.868 5.7l5.497 6.31 4.477 6.106 3.868-29.516z" fill-rule="evenodd" stroke-width="2.3686254" fill="#4fd46b"/>
-+ <path d="M414.28 246.508c.288-.288 10.938-24.757 12.378-32.243M415.43 203.05s1.726 19.864-3.167 34.545M382.615 182.895s21.879 21.015 23.893 29.651M397.873 180.596s1.439 17.274 7.484 34.259M436.45 243.343s-21.879 18.425-32.53 34.545M415.712 307.84s-28.788 4.03-41.454 4.318M406.218 320.215s-35.698-.864-38.29-3.454M388.361 273.859c0 .287-18.136 30.226-18.712 40.015" stroke-linecap="round" stroke-width="2.2203781" fill="none"/>
-+ </g>
-+ <path d="M316.87 333.441c-37.768-35.624-76.454-102.482-37.972-136.27 6.84 3.88 14.903.409 26.03-3.98 3.368 3.674 7.654 4.594 11.942 1.837 4.797 2.042 8.37.408 10.718-2.144 10.922 6.33 24.906 9.596 28.172 3.37 37.87 35.93-.511 103.095-38.89 137.187z" fill-rule="evenodd" stroke="#7d6c00" stroke-width="2.3686254" fill="#65c7ff"/>
-+ <path d="M317.086 332.408c-16.219-16.307-31.017-34.385-42.347-57.66 1.939-1.632 2.84-2.138 3.861-4.997 5.818.818 8.88 1.021 16.536-.306 1.53 5.717 1.837 10.514 5.511 15.311l7.656-15.005c5.205 1.226 11.637 1.533 16.535 0 3.165 4.288 2.042 10.72 7.656 15.618 3.368-9.9 6.738-10.615 10.106-15.924 5.002 1.736 8.167 1.021 12.25-.307 2.143 2.45 1.072 2.41 4.975 6.007-10.233 20.32-24.265 40.728-42.739 57.263z" fill-rule="evenodd" fill="#8fc753"/>
-+ <path d="M272.65 164.304a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0zM269.158 156.594a3.346 3.346 0 1 1-6.691 0 3.346 3.346 0 0 1 6.691 0zM265.085 149.465a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0zM262.321 142.482a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0zM262.757 134.918a3.346 3.346 0 1 1-6.691 0 3.346 3.346 0 0 1 6.691 0zM280.42 122.407a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0z" fill-rule="evenodd" stroke="#000" stroke-width="1.1110219000000001 [...]
-+ <path d="M273.814 123.571a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0zM266.54 127.935a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0zM288.943 122.552a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0zM298.254 123.28a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0zM306.546 122.843a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0z" fill-rule="evenodd" stroke="#000" stroke-width="1.1110219000000001" fill="#fff"/>
-+ <path d="M325.874 117.504a8.583 8.583 0 1 1-17.166 0 8.583 8.583 0 0 1 17.166 0z" fill-rule="evenodd" stroke="#7d6c00" stroke-width="1.110941" fill="#fd0"/>
-+ <path d="M334.913 122.698a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0zM343.642 123.425a3.346 3.346 0 1 1-6.691 0 3.346 3.346 0 0 1 6.691 0zM352.08 122.988a3.346 3.346 0 1 1-6.693 0 3.346 3.346 0 0 1 6.692 0zM359.207 122.698a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0zM368.082 123.716a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0zM375.064 128.08a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0z" fill-rule="evenodd" stroke="#000" stroke-width="1.1110219000000001 [...]
-+ <path d="M269.414 151.697c2.85 5.42 5.698 11.05 8.548 16.47h79.23l9.174-15.846c-5.352-3.683-9.035-6.533-16.68-4.795-4.31-6.185-9.035-7.366-16.054-6.671-2.086-2.154-3.963-3.475-7.508-3.961l-16.678.416c-4.38.416-7.716 3.753-7.924 3.753-7.09-.835-13.552-.627-15.22 6.254-6.463-1.599-11.05.14-16.888 4.38z" fill-rule="evenodd" stroke="#ac0000" stroke-width="2.3686254" fill="#e40000"/>
-+ <path d="M377.974 135.354a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0zM378.556 143.21a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0zM376.082 150.484a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0zM373.027 156.448a3.346 3.346 0 1 1-6.692 0 3.346 3.346 0 0 1 6.692 0zM369.39 164.013a3.346 3.346 0 1 1-6.69 0 3.346 3.346 0 0 1 6.69 0z" fill-rule="evenodd" stroke="#000" stroke-width="1.1110219000000001" fill="#fff"/>
-+ <path d="M322.566 154.424a4.946 4.946 0 1 1-9.893 0 4.946 4.946 0 0 1 9.893 0z" fill-rule="evenodd" stroke="#000" stroke-width="1.1105424000000002" fill="#fff"/>
-+ <path d="M323.546 143.045a5.964 5.964 0 1 1-11.93 0 5.964 5.964 0 0 1 11.93 0z" fill-rule="evenodd" stroke="#000" stroke-width="1.11051072" fill="#fff"/>
-+ <path d="M322.685 131.995a5.383 5.383 0 1 1-10.765 0 5.383 5.383 0 0 1 10.765 0z" fill-rule="evenodd" stroke="#000" stroke-width="1.10935854" fill="#fff"/>
-+ <path d="M315.487 109.055c0-.926-.028-4.165.037-4.295l-3.572-.064.102-3.175 3.1-.037.037-2.775h4.395v2.544h3.47l-.072 3.378-3.6-.037-.03 4.526-3.867-.065z" fill-rule="evenodd" stroke="#7d6c00" stroke-width="1.1110219000000001" fill="#fd0"/>
-+ <path d="M277.56 168.17c-7.092-12.023-17.51-28.367-11.053-35.444 8.955-10.143 29.953-.973 43.367-6.881.972 11.468-2.224 30.44 2.92 34.403l-4.796 4.17c-2.92-3.753-8.418-8.782-15.22.208-3.892-3.403-8.316-2.805-10.4 1.72-1.982.267-1.867 1.06-4.819 1.824zM357.68 167.754c7.09-12.023 17.51-28.367 11.051-35.444-8.955-10.143-29.952-.973-43.366-6.882-.973 11.469 2.223 30.441-2.92 34.404l4.795 4.17c4.614-6.489 10.373-6.699 15.22.207 3.893-3.403 7.925-2.936 10.4 1.721 1.983.267 1.868 1.06 4.82 1 [...]
-+ <path d="M277.343 177.132c28.495-2.918 54.904-1.877 79.23 0l3.127-8.967c-27.66-5.003-46.773-5.628-82.982-.624l.625 9.59z" fill-rule="evenodd" stroke="#7d6c00" stroke-width="2.3686254" fill="#fd0"/>
-+ <path d="M314.121 329.377c.205-1.43.408-2.762.613-4.191 2.834.763 4.996.468 7.35-.402.815-1.225 1.633-2.45 2.45-3.676l-1.838-2.142c-1.615.348-2.941 1.85-3.98 3.158-1.628.077-3.064-.71-4.595-1.016l-1.53-6.43c-1.52-1.795-4.671-1.668-3.982 1.531l.307 2.45c.613 1.531.841 3.639 1.837 4.785v2.511c1.123 1.141 2.246 2.28 3.368 3.422zM315.337 311.087c-2.13 1.056-4.659-.78-7.349-1.837-2.45-.168-4.419 1.872-7.349 1.224.535-1.59 1.837-1.837 2.757-2.756-.673-4.131 1.53-5.512 2.144-5.512.61 0 3.061 [...]
-+ <path d="M300.779 366.089c7.066-11.472 56.259-34.508 102.422-84.251-46.99 45.243-76.357 56.35-114.812 83.974l12.39.277z" fill-rule="evenodd" stroke="#e9bf00" stroke-width="2.3686254" fill="#ffe100"/>
-+ <path d="M368.406 313.186a3.582 3.582 0 1 1-7.163 0 3.582 3.582 0 0 1 7.163 0zM402.786 278.323a4.06 4.06 0 1 1-8.118 0 4.06 4.06 0 0 1 8.118 0zM414.252 248.713a3.582 3.582 0 1 1-7.163 0 3.582 3.582 0 0 1 7.163 0zM403.02 210.28a3.582 3.582 0 1 1-7.164 0 3.582 3.582 0 0 1 7.164 0z" fill-rule="evenodd" stroke="#68300e" stroke-width="1.1110219000000001" fill="#9d4916"/>
-+ <path d="M279.125 269.595v-15.148l-1.54-1.283v-3.594l2.824-.257.513-16.945-1.797-1.028-.257-2.823s2.054.77 2.054.257.513-3.339.513-3.339-1.282-.256-1.282-.77 1.539-1.796 1.539-1.796-.77-.772-1.026-1.285-.77-2.823-.77-2.823l.77-2.825-.513-1.54-1.285-2.311 1.798-1.797s-.513-2.31-.513-2.824 1.282-2.567 1.539-2.825c.258-.256 2.312-3.08 2.312-3.08l4.364-1.027 5.135.77 2.824 1.798.513 4.62s-.513 2.824-.77 2.824-2.31 1.028-2.31 1.028-2.569.256-2.825 0 .77 3.081.77 3.081v3.08l-.256 3.851s0 1. [...]
-+ <path fill-rule="evenodd" d="M282.923 269.495v-11.938h6.686v12.416l-6.686-.478zM314.438 270.444l.238-12.178h5.97v11.938l-6.208.24zM345.486 270.211l-.478-11.46 6.448-.24v11.94l-5.97-.24zM284.588 234.149h3.82v6.208h-3.82zM314.92 234.399h5.254v5.97h-5.253zM345.953 234.865h4.537v5.73h-4.537z"/>
-+ <path d="M286.57 206.965c4.108 4.62 4.365 4.62 4.365 4.62M317.12 206.965c.769 1.539 2.053 4.877 3.594 5.133M349.984 207.73s1.284 3.595 3.081 4.108" stroke="#a8a8a8" stroke-width="1.1110219000000001" fill="none"/>
-+ <path d="M282.206 194.022c12.012-3.883-2.806-11.648-5.267 0-3.886.628-4.389 3.511-12.789 2.259-20.313 33.102-5.267 86.518 54.169 141.816-106.457-90.594-63.194-157.604-33.714-155.077 16.034 1.096 7.945 21.096-2.399 11.002z" fill-rule="evenodd" fill="#b97700"/>
-+ <path d="M285.554 177.049s9.781 2.633 9.781 6.77M295.332 176.299s6.771 3.008 8.275 5.642M348.751 177.432s-8.653 1.129-10.534 3.76M335.575 178.181s-4.888 4.138-4.514 5.265M334.46 196.237c-.753-.376-4.138-4.89-3.387-10.533M301.345 193.24s2.257-2.634 2.257-7.525M317.153 183.828l.376 10.909M326.93 193.24c0-.754 3.01-7.9-.376-11.286M306.242 180.447s-2.633 7.147-.75 13.165M325.431 186.843s-4.137 1.128-6.02 3.01M307.742 187.959c0-.375 4.514-1.128 6.018 1.506" stroke="#7d6c00" stroke-width="2 [...]
-+ <path d="M300.63 301.86c.19.096 3.745-.674 3.745-2.403 1.826-1.152.48-4.419.48-4.419l-3.361-.673-4.613-5.187c-.223-1.6.322-3.104-.671-4.802-3.17.833-4.995 3.49-6.053 6.531.77.962.866 2.018 2.307 2.882 1.504.257 2.528-.64 3.938-.383.736 1.28.51 2.37.767 3.555 1.923 1.344 2.307 3.266 3.46 4.898zM296.498 279.672v-6.148l-4.419-.193c-.545.93-1.57 1.378-2.21 2.21l-3.074 1.538c1.281 1.537 2.85 2.402 3.843 3.17 2.242.673 4.1.673 5.86-.577zM282.656 288.8l-2.402-4.036c1.473-.48 3.33-.288 4.707. [...]
-+ <path d="M353.115 193.19c-12.011-3.884 2.807-11.65 5.267 0 3.886.627 4.39 3.51 12.79 2.258 20.313 33.102 5.266 86.518-54.17 141.816 106.457-90.594 63.194-157.604 33.715-155.077-16.034 1.096-7.946 21.096 2.398 11.002z" fill-rule="evenodd" fill="#b97700"/>
-+ <path d="M354.331 284.67c-.191 0-3.073 2.112-3.073 2.112-1.378.544-2.753 1.089-4.13 1.634l-4.42.095-.961-3.074 3.363-2.978c-2.85-.416-5.7.705-7.974 2.787 0 0 0 3.361 1.922 4.995 1.153 1.44 4.514 4.035 4.514 4.035 2.114.416 4.131.063 5.476-1.058 1.76-2.85 3.523-5.699 5.283-8.549zM331.078 314.835c1.443.385 11.337-12.776 11.337-12.776-.865-2.465-2.787-4.259-4.9-5.38 0 0-4.805 5.667-4.9 7.589-.767 1.729-2.976 8.357-2.017 9.223-.096.192-.48 2.88.48 1.344z" fill-rule="evenodd" fill="#c76e2e"/>
-+ <path stroke-linejoin="round" d="M266.366 317.4c-14.817-12.887-34.809-19.991-62.716-10.35 7.51 3.248 15.628 4.364 22.529 7.915l40.187 2.435z" fill-rule="evenodd" stroke="#004100" stroke-width="2.3686254" fill="#006800"/>
-+ <path d="M223.44 308.256c29.227.608 37.752 7.913 36.23 6.696" stroke="#00a400" stroke-linecap="round" stroke-width="2.2203781" fill="none"/>
-+ <path stroke-linejoin="round" d="M266.965 318.916c-8.728 1.724-20.804 10.154-24.356 9.741-9.54-1.11-18.454-4.975-27.704-7.915-3.842-1.221-7.713 0-11.57 0 32.78-15.526 43.943-13.396 63.63-1.826z" fill-rule="evenodd" stroke="#004100" stroke-width="2.2203781" fill="#006800"/>
-+ <path stroke-linejoin="round" d="M245.361 296.08s-10.959 1.52-15.83 1.825c-4.873-.303-11.955-4.842-19.79-13.09-4.088-4.48-13.395-3.958-13.395-3.958 20.602-4.365 36.634-.204 49.015 15.222zM230.436 274.775c-14.92-.914-33.49-14.308-37.751-30.139-.002.202 5.479 3.45 4.566 4.263 24.457 6.19 26.081 11.161 33.185 25.876zM255.405 300.344c2.13-13.498 2.74-22.427-3.653-30.444-5.277-6.09-6.596-9.743-10.35-18.268-1.116 17.76-4.974 32.474 14.003 48.712zM231.952 262.899c11.06-16.136 12.99-28.314 11 [...]
-+ <path stroke-linejoin="round" d="M222.225 184.96c11.06 16.136 9.336 31.36 7.61 50.54-.305-1.523-3.958-10.96-4.26-10.96-16.441-10.351-5.48-29.534-3.35-39.58z" fill-rule="evenodd" stroke="#004100" stroke-width="2.3686254" fill="#006800"/>
-+ <path stroke-linejoin="round" d="M231.353 209.93c26.79-13.498 16.438-30.648 21.31-43.84-18.57 13.802-21.006 28.515-21.31 43.84z" fill-rule="evenodd" stroke="#004100" stroke-width="2.3686254" fill="#006800"/>
-+ <path d="M235 206.581c3.35-9.437 10.048-25.573 10.656-25.573M227.088 226.37c-.608-6.7-3.956-24.662-4.26-26.488" stroke="#00a400" stroke-linecap="round" stroke-width="2.2203781" fill="none"/>
-+ <path stroke-linejoin="round" d="M228.304 256.502c-14.92-.914-31.055-21.31-35.316-37.141-.001.201 5.479 3.45 4.566 4.262 21.412 9.538 23.646 18.165 30.75 32.88zM223.874 242.494c-11.06-16.136-12.99-28.314-11.264-47.494.305 1.522 3.958 10.96 4.261 10.96 16.44 10.35 9.133 26.488 7.003 36.534zM233.785 214.194c27.703-12.28 19.178-25.167 27.399-38.665-18.571 13.802-27.095 23.34-27.4 38.665z" fill-rule="evenodd" stroke="#004100" stroke-width="2.3686254" fill="#006800"/>
-+ <path d="M235 211.445c11.266-11.265 15.223-20.703 15.223-20.703" stroke="#00a400" stroke-linecap="round" stroke-width="2.2203781" fill="none"/>
-+ <g fill-rule="evenodd">
-+ <path d="M333.56 366.355l13.49.275c-44.787-41.942-130.599-60.205-118.667-137.39-12.298 83.701 70.117 91.41 105.177 137.115z" stroke="#e9bf00" stroke-width="2.3686254" fill="#ffe100"/>
-+ <path d="M235.417 212.661a4.298 4.298 0 1 1-8.596 0 4.298 4.298 0 0 1 8.596 0zM232.785 236.297a4.06 4.06 0 1 1-8.118 0 4.06 4.06 0 0 1 8.118 0zM236.6 269.978a3.582 3.582 0 1 1-7.164 0 3.582 3.582 0 0 1 7.164 0zM267.876 307.223a3.582 3.582 0 1 1-7.163 0 3.582 3.582 0 0 1 7.163 0zM272.412 317.907a3.582 3.582 0 1 1-7.163 0 3.582 3.582 0 0 1 7.163 0z" stroke="#68300e" stroke-width="1.1110219000000001" fill="#9d4916"/>
-+ </g>
-+ <g fill-rule="evenodd" fill="#fff">
-+ <g stroke="#000" stroke-width=".667">
-+ <path d="M288.203 349.032c-2.355-2.134-3.853-3.503-4.777-5.828l-14.044-1.528c-.063 2.675-.126 5.349-.191 8.024l19.012-.668z" stroke-width="1.1110219000000001"/>
-+ <path stroke-linejoin="round" d="M185.313 339.57c8.157 1.507 20.456-.752 24.472 4.518 4.822 5.465-15.093 13.872-12.241 18.6 6.16 6.517 12.5 3.83 19.394.226 1.624-3.523 2.878-9.804 3.766-11.672-2.51-5.773-9.253-8.601-7.53-17.32 11.37-4.249 33.23-3.897 35.583-2.258 1.848 3.623.187 5.273.564 8.16-1.883 3.64-6.728 9.81-6.738 13.074 11.93 4.203 15.074-.648 25.806-.363 12.575.155 20.225 3.531 22.955-1.467-1.87-4.315-13.403-.805-17.78-3.577-2.19-.74-3.604-2.5-5.496-4.44s-7.21-2.04-8.007- [...]
-+ <path d="M184.732 337.954a3.63 3.63 0 1 1-7.26 0 3.63 3.63 0 0 1 7.26 0zM183.78 355.911a3.63 3.63 0 1 1-7.26 0 3.63 3.63 0 0 1 7.26 0z" stroke-width="1.1110219000000001"/>
-+ </g>
-+ <g stroke="#000" stroke-width=".667">
-+ <path d="M346.253 349.097c2.355-2.134 3.852-3.503 4.777-5.828l14.043-1.528.192 8.024-19.012-.668z" stroke-width="1.1110219000000001"/>
-+ <path stroke-linejoin="round" d="M449.143 339.636c-8.157 1.506-20.457-.753-24.473 4.517-4.822 5.465 15.093 13.872 12.242 18.6-6.16 6.517-12.5 3.83-19.394.226-1.624-3.523-2.878-9.804-3.766-11.671 2.51-5.774 9.253-8.602 7.53-17.32-11.371-4.25-33.23-3.898-35.584-2.26-1.847 3.624-.187 5.274-.563 8.161 1.882 3.64 6.728 9.81 6.738 13.074-11.93 4.203-15.075-.648-25.807-.363-12.574.155-20.225 3.531-22.955-1.467 1.87-4.315 13.404-.805 17.781-3.577 2.19-.74 3.603-2.5 5.496-4.44s7.21-2.04 8. [...]
-+ <path d="M449.723 338.02a3.63 3.63 0 1 0 7.261 0 3.63 3.63 0 0 0-7.26 0zM450.675 355.976a3.63 3.63 0 1 0 7.26 0 3.63 3.63 0 0 0-7.26 0z" stroke-width="1.1110219000000001"/>
-+ </g>
-+ <path d="M316.986 329.343c-3.231-.606-4.38-.433-6.57-.65-1.715 5.271-3.427 10.541-5.141 15.812 7.938.716 15.29.716 15.29.651-4.816-.976-3.644-15.748-3.579-15.813z"/>
-+ </g>
-+ <g font-size="9" font-family="Trebuchet MS" font-weight="bold">
-+ <text y="344.274" x="448.605" transform="translate(-464.91 -233.28) scale(1.6657)">
-+ <tspan y="344.274" x="448.605">L</tspan>
-+ </text>
-+ <text y="344.622" x="453.64" transform="translate(-464.91 -233.28) scale(1.6657)">
-+ <tspan y="344.622" x="453.64">I</tspan>
-+ </text>
-+ <text y="345.056" x="456.678" transform="translate(-464.91 -233.28) scale(1.6657)">
-+ <tspan y="345.056" x="456.678">B</tspan>
-+ </text>
-+ <text y="345.49" x="462.58" transform="translate(-464.91 -233.28) scale(1.6657)">
-+ <tspan y="345.49" x="462.58">E</tspan>
-+ </text>
-+ <text y="345.576" x="468.309" transform="translate(-464.91 -233.28) scale(1.6657)">
-+ <tspan y="345.576" x="468.309">R</tspan>
-+ </text>
-+ <text y="345.403" x="473.952" transform="translate(-464.91 -233.28) scale(1.6657)">
-+ <tspan y="345.403" x="473.952">T</tspan>
-+ </text>
-+ <text y="344.535" x="479.247" transform="translate(-464.91 -233.28) scale(1.6657)">
-+ <tspan y="344.535" x="479.247">A</tspan>
-+ </text>
-+ <text y="344.274" x="485.497" transform="translate(-464.91 -233.28) scale(1.6657)">
-+ <tspan y="344.274" x="485.497">S</tspan>
-+ </text>
-+ </g>
-+ <path d="M231.353 318.616c10.047 1.218 24.052.304 30.14-.001M216.128 284.203c8.525 6.698 27.096 10.654 26.791 10.654M253.573 296.696c-2.74-14.004-5.783-17.353-8.219-26.183M201.82 254.67c14.31 6.393 16.44 10.654 25.573 17.047M232.569 257.718c1.219-17.355 3.654-21.922 7.917-25.88M201.82 229.718c5.177 5.785 22.225 23.746 22.225 23.746M217.044 213.877c6.395 4.566 6.395 21.005 6.395 21.005" stroke="#00a400" stroke-linecap="round" stroke-width="2.2203781" fill="none"/>
-+</svg>
---- a/test/datasource.test.js
-+++ b/test/datasource.test.js
-@@ -10,7 +10,7 @@ mapnik.register_datasource(path.join(map
- mapnik.register_datasource(path.join(mapnik.settings.paths.input_plugins,'gdal.input'));
-
- describe('mapnik.Datasource', function() {
--
-+
- it('should throw with invalid usage', function() {
- assert.throws(function() { mapnik.Datasource('foo'); });
- assert.throws(function() { mapnik.Datasource({ 'foo': 1 }); });
-@@ -165,7 +165,7 @@ describe('mapnik.Datasource', function()
-
- assert.deepEqual(ds.fields(), expected.fields);
- });
--
-+
- it('test invalid use of memory datasource', function() {
- var ds = new mapnik.MemoryDatasource({'extent': '-180,-90,180,90'});
- assert.throws(function() { ds.add(); });
-@@ -213,7 +213,10 @@ describe('mapnik.Datasource', function()
- });
-
- it('test empty geojson datasource due to invalid json file', function() {
-- assert.throws(function() { new mapnik.Datasource({ type:'geojson', file: './test/data/parse.error.json', cache_features: false }); });
-+ var ds = new mapnik.Datasource({ type:'geojson', file: './test/data/parse.error.json', cache_features: false });
-+ var empty_fs = ds.featureset();
-+ assert.equal(typeof(empty_fs),'undefined');
-+ assert.equal(empty_fs, null);
- });
-
- it('test valid use of memory datasource', function() {
-@@ -221,11 +224,11 @@ describe('mapnik.Datasource', function()
- assert.equal(true, ds.add({ 'x': 0, 'y': 0 }));
- assert.equal(true, ds.add({ 'x': 0.23432, 'y': 0.234234 }));
- assert.equal(true, ds.add({ 'x': 1, 'y': 1 , 'properties': {'a':'b', 'c':1, 'd':0.23 }}));
-- var expected_describe = {
-+ var expected_describe = {
- type: 'vector',
- encoding: 'utf-8',
- fields: {},
-- geometry_type: 'collection'
-+ geometry_type: 'collection'
- };
- assert.deepEqual(expected_describe, ds.describe());
- // Currently descriptors can not be added to memory datasource so will always be empty object
---- a/test/image.svg.test.js
-+++ b/test/image.svg.test.js
-@@ -25,10 +25,10 @@ describe('mapnik.Image SVG', function()
- }, /first argument is invalid, must be a Buffer/);
- assert.throws(function() {
- new mapnik.Image.fromSVGBytesSync(new Buffer('asdfasdf'));
-- }, /SVG parse error:\s+Unable to parse 'asdfasdf'/);
-+ }, /SVG error: unable to parse "asdfasdf"/);
- assert.throws(function() {
- mapnik.Image.fromSVGSync('./test/data/SVG_DOES_NOT_EXIST.svg');
-- }, /SVG parse error:\s+Unable to open '.\/test\/data\/SVG_DOES_NOT_EXIST.svg'/);
-+ }, /SVG error: unable to open "\.\/test\/data\/SVG_DOES_NOT_EXIST\.svg"/);
- assert.throws(function() {
- mapnik.Image.fromSVGSync('./test/data/vector_tile/tile0.expected-svg.svg', 256);
- }, /optional second arg must be an options object/);
-@@ -73,7 +73,7 @@ describe('mapnik.Image SVG', function()
- }, /image created from svg must have a width and height greater then zero/);
- mapnik.Image.fromSVGBytes(new Buffer('a'), { scale: 1 }, function(err, res) {
- assert.ok(err);
-- assert.ok(err.message.match(/Unable to parse 'a'/));
-+ assert.ok(err.message.match(/SVG error: unable to parse "a"/));
- var svgdata = "<svg width='1000000000000' height='1000000000000'><g id='a'><ellipse fill='#FFFFFF' stroke='#000000' stroke-width='4' cx='50' cy='50' rx='25' ry='25'/></g></svg>";
- var buffer = new Buffer(svgdata);
- mapnik.Image.fromSVGBytes(buffer, { scale: 1 }, function(err, img) {
-@@ -149,7 +149,7 @@ describe('mapnik.Image SVG', function()
- done();
- });
- });
--
-+
- it('should err with async file w/o width or height as Bytes', function(done) {
- var svgdata = "<svg width='0' height='0'><g id='a'><ellipse fill='#FFFFFF' stroke='#000000' stroke-width='4' cx='50' cy='50' rx='25' ry='25'/></g></svg>";
- var buffer = new Buffer(svgdata);
-@@ -164,7 +164,7 @@ describe('mapnik.Image SVG', function()
- it('should err with async invalid buffer', function(done) {
- mapnik.Image.fromSVGBytes(new Buffer('asdfasdf'), function(err, svg) {
- assert.ok(err);
-- assert.ok(err.message.match(/SVG parse error:\s+Unable to parse 'asdfasdf'/));
-+ assert.ok(err.message.match(/SVG error: unable to parse "asdfasdf"/));
- assert.equal(svg, undefined);
- done();
- });
-@@ -173,7 +173,7 @@ describe('mapnik.Image SVG', function()
- it('should err with async non-existent file', function(done) {
- mapnik.Image.fromSVG('./test/data/SVG_DOES_NOT_EXIST.svg', function(err, svg) {
- assert.ok(err);
-- assert.ok(err.message.match(/SVG parse error:\s+Unable to open '.\/test\/data\/SVG_DOES_NOT_EXIST.svg'/));
-+ assert.ok(err.message.match(/SVG error: unable to open "\.\/test\/data\/SVG_DOES_NOT_EXIST\.svg"/));
- assert.equal(svg, undefined);
- done();
- });
-@@ -196,7 +196,7 @@ describe('mapnik.Image SVG', function()
- assert.equal(img.height(), 256);
- assert.equal(img.encodeSync('png32').length, 17571);
- });
--
-+
- it('#fromSVGSync load from SVG file - 2', function() {
- var img = mapnik.Image.fromSVG('./test/data/vector_tile/tile0.expected-svg.svg');
- assert.ok(img);
---- a/test/vector-tile.test.js
-+++ b/test/vector-tile.test.js
-@@ -2493,7 +2493,7 @@ describe('mapnik.VectorTile ', function(
- var simplicityReport = vtile.reportGeometrySimplicity();
- var validityReport = vtile.reportGeometryValidity();
- assert.equal(simplicityReport.length, 0);
-- assert.equal(validityReport.length, 1);
-+ assert.equal(validityReport.length, 0);
- assert.equal(vtile.reportGeometryValidity({split_multi_features:true}).length, 0);
- }
- var expected = './test/data/vector_tile/tile0-mpu-true.mvt';
diff --git a/debian/patches/use-packaged-dependencies.patch b/debian/patches/use-packaged-dependencies.patch
index 838860c..afff300 100644
--- a/debian/patches/use-packaged-dependencies.patch
+++ b/debian/patches/use-packaged-dependencies.patch
@@ -4,7 +4,7 @@ Forwarded: not-needed
--- a/binding.gyp
+++ b/binding.gyp
-@@ -38,12 +38,7 @@
+@@ -39,12 +39,7 @@
'./mason_packages/.link/include/cairo',
'./src',
"<!(node -e \"require('nan')\")",
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/collab-maint/node-mapnik.git
More information about the Pkg-javascript-commits
mailing list