From 6863301a728a47db85f6ef882e06fc82818a6d92 Mon Sep 17 00:00:00 2001 From: Artem Pavlenko Date: Wed, 12 Aug 2020 16:36:29 +0100 Subject: [PATCH 1/3] [publish binary] experimental From 43605c8bb4391e181586200f268f94853f2e1d08 Mon Sep 17 00:00:00 2001 From: Artem Pavlenko Date: Wed, 12 Aug 2020 16:37:57 +0100 Subject: [PATCH 2/3] pass Napi::ObjectWrap to AsyncWorker to be able to return existing napi_value rather than calling Object::constructor [publish binary] --- package.json | 2 +- src/mapnik_image_clear.cpp | 14 +++---- src/mapnik_image_compositing.cpp | 12 +++--- src/mapnik_image_fill.cpp | 16 ++++---- src/mapnik_image_multiply.cpp | 18 ++++----- src/mapnik_vector_tile_composite.cpp | 55 +++++++++++++++------------- src/mapnik_vector_tile_render.cpp | 33 +++++++---------- 7 files changed, 69 insertions(+), 81 deletions(-) diff --git a/package.json b/package.json index fee05cfae0..ef14a66713 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "url": "http://github.com/mapnik/node-mapnik", "homepage": "http://mapnik.org", "author": "Dane Springmeyer (mapnik.org)", - "version": "4.5.2", + "version": "4.5.2-exp1", "mapnik_version": "26d3084ea", "main": "./lib/mapnik.js", "binary": { diff --git a/src/mapnik_image_clear.cpp b/src/mapnik_image_clear.cpp index fcfd7540ce..3678588122 100644 --- a/src/mapnik_image_clear.cpp +++ b/src/mapnik_image_clear.cpp @@ -12,27 +12,25 @@ namespace detail { struct AsyncClear : Napi::AsyncWorker { using Base = Napi::AsyncWorker; - AsyncClear(image_ptr const& image, Napi::Function const& callback) + AsyncClear(Image * image, Napi::Function const& callback) : Base(callback), image_(image) {} void Execute() override { - mapnik::fill(*image_, 0); + mapnik::fill(*image_->impl(), 0); } std::vector GetResult(Napi::Env env) override { - if (image_) + if (image_ != nullptr && !image_->IsEmpty()) { - Napi::Value arg = Napi::External::New(env, &image_); - Napi::Object obj = Image::constructor.New({arg}); - return {env.Null(), napi_value(obj)}; + return {env.Null(), image_->Value()}; } return Base::GetResult(env); } - image_ptr image_; + Image * image_; }; } // ns @@ -96,7 +94,7 @@ Napi::Value Image::clear(Napi::CallbackInfo const& info) return env.Undefined(); } - auto * worker = new detail::AsyncClear{image_, callback_val.As()}; + auto * worker = new detail::AsyncClear{this, callback_val.As()}; worker->Queue(); return env.Undefined(); } diff --git a/src/mapnik_image_compositing.cpp b/src/mapnik_image_compositing.cpp index 915288321b..b2b9315974 100644 --- a/src/mapnik_image_compositing.cpp +++ b/src/mapnik_image_compositing.cpp @@ -10,7 +10,7 @@ namespace detail { struct AsyncComposite : Napi::AsyncWorker { using Base = Napi::AsyncWorker; - AsyncComposite(image_ptr const& src, image_ptr const& dst, + AsyncComposite(image_ptr const& src, Image * dst, mapnik::composite_mode_e mode, int dx, int dy, float opacity, std::vector const& filters, @@ -39,7 +39,7 @@ struct AsyncComposite : Napi::AsyncWorker } mapnik::premultiply_alpha(*src_); } - mapnik::composite(*dst_,*src_, mode_, opacity_, dx_, dy_); + mapnik::composite(*dst_->impl(), *src_, mode_, opacity_, dx_, dy_); } catch (std::exception const& ex) { @@ -49,14 +49,12 @@ struct AsyncComposite : Napi::AsyncWorker std::vector GetResult(Napi::Env env) override { - Napi::Value arg = Napi::External::New(env, &dst_); - Napi::Object obj = Image::constructor.New({arg}); - return {env.Undefined(), napi_value(obj)}; + return {env.Undefined(), dst_->Value()}; } private: image_ptr src_; - image_ptr dst_; + Image * dst_; mapnik::composite_mode_e mode_; int dx_; int dy_; @@ -228,7 +226,7 @@ Napi::Value Image::composite(Napi::CallbackInfo const& info) } } - auto * worker = new detail::AsyncComposite(source_image, image_, mode, dx, dy, opacity, + auto * worker = new detail::AsyncComposite(source_image, this, mode, dx, dy, opacity, filters, callback_val.As()); worker->Queue(); return env.Undefined(); diff --git a/src/mapnik_image_fill.cpp b/src/mapnik_image_fill.cpp index 55f5faa5a8..81718fd6b7 100644 --- a/src/mapnik_image_fill.cpp +++ b/src/mapnik_image_fill.cpp @@ -12,27 +12,25 @@ template struct AsyncFill : Napi::AsyncWorker { using Base = Napi::AsyncWorker; - AsyncFill(image_ptr const& image, T const& val, Napi::Function const& callback) + AsyncFill(Image * image, T const& val, Napi::Function const& callback) : Base(callback), image_(image), val_(val) {} void Execute() override { - mapnik::fill(*image_, val_); + mapnik::fill(*image_->impl(), val_); } std::vector GetResult(Napi::Env env) override { - if (image_) + if (image_ != nullptr && !image_->IsEmpty()) { - Napi::Value arg = Napi::External::New(env, &image_); - Napi::Object obj = Image::constructor.New({arg}); - return {env.Null(), napi_value(obj)}; + return {env.Null(), image_->Value()}; } return Base::GetResult(env); } - image_ptr image_; + Image * image_; T val_; }; } // ns @@ -139,7 +137,7 @@ Napi::Value Image::fill(Napi::CallbackInfo const& info) if (info[0].IsNumber()) { val = info[0].As().DoubleValue(); - auto* worker = new detail::AsyncFill(image_, val, callback); + auto* worker = new detail::AsyncFill(this, val, callback); worker->Queue(); return env.Undefined(); } @@ -154,7 +152,7 @@ Napi::Value Image::fill(Napi::CallbackInfo const& info) else { Color * color = Napi::ObjectWrap::Unwrap(obj); - auto* worker = new detail::AsyncFill(image_, color->color_, callback); + auto* worker = new detail::AsyncFill(this, color->color_, callback); worker->Queue(); } } diff --git a/src/mapnik_image_multiply.cpp b/src/mapnik_image_multiply.cpp index 47a7a1483d..59db44d14d 100644 --- a/src/mapnik_image_multiply.cpp +++ b/src/mapnik_image_multiply.cpp @@ -11,28 +11,26 @@ template struct AsyncMultiply : Napi::AsyncWorker { using Base = Napi::AsyncWorker; - AsyncMultiply(image_ptr const& image, Napi::Function const& callback) + AsyncMultiply(Image * image, Napi::Function const& callback) : Base(callback), image_(image) {} void Execute() override { - if (pre) mapnik::premultiply_alpha(*image_); - else mapnik::demultiply_alpha(*image_); + if (pre) mapnik::premultiply_alpha(*image_->impl()); + else mapnik::demultiply_alpha(*image_->impl()); } std::vector GetResult(Napi::Env env) override { - if (image_) + if (image_ != nullptr && !image_->IsEmpty()) { - Napi::Value arg = Napi::External::New(env, &image_); - Napi::Object obj = Image::constructor.New({arg}); - return {env.Null(), napi_value(obj)}; + return {env.Null(), image_->Value()}; } return Base::GetResult(env); } - image_ptr image_; + Image * image_; }; } // ns @@ -89,7 +87,7 @@ Napi::Value Image::premultiply(Napi::CallbackInfo const& info) Napi::TypeError::New(env, "last argument must be a callback function").ThrowAsJavaScriptException(); return env.Undefined(); } - auto * worker = new AsyncPremultiply{image_, callback_val.As()}; + auto * worker = new AsyncPremultiply{this, callback_val.As()}; worker->Queue(); return env.Undefined(); } @@ -133,7 +131,7 @@ Napi::Value Image::demultiply(Napi::CallbackInfo const& info) Napi::TypeError::New(env, "last argument must be a callback function").ThrowAsJavaScriptException(); return env.Undefined(); } - auto * worker = new AsyncDemultiply{image_, callback_val.As()}; + auto * worker = new AsyncDemultiply{this, callback_val.As()}; worker->Queue(); return env.Undefined(); } diff --git a/src/mapnik_vector_tile_composite.cpp b/src/mapnik_vector_tile_composite.cpp index f4400d8c4d..203258c09f 100644 --- a/src/mapnik_vector_tile_composite.cpp +++ b/src/mapnik_vector_tile_composite.cpp @@ -335,7 +335,7 @@ Napi::Value VectorTile::compositeSync(Napi::CallbackInfo const& info) vtiles_vec.reserve(num_tiles); for (std::size_t j=0; j < num_tiles; ++j) { - Napi::Value val = (vtiles).Get(j); + Napi::Value val = vtiles.Get(j); if (!val.IsObject()) { Napi::TypeError::New(env, "must provide an array of VectorTile objects").ThrowAsJavaScriptException(); @@ -383,7 +383,8 @@ namespace { struct AsyncCompositeVectorTile : Napi::AsyncWorker { - AsyncCompositeVectorTile(tile_type const& tile, + using Base = Napi::AsyncWorker; + AsyncCompositeVectorTile(VectorTile * tile, std::vector const& vtiles, double scale_factor, unsigned offset_x, @@ -401,31 +402,31 @@ struct AsyncCompositeVectorTile : Napi::AsyncWorker mapnik::scaling_method_e scaling_method, std::launch threading_mode, Napi::Function const& callback) - : Napi::AsyncWorker(callback), - tile_(tile), - vtiles_(vtiles), - scale_factor_(scale_factor), - offset_x_(offset_x), - offset_y_(offset_y), - area_threshold_(area_threshold), - strictly_simple_(strictly_simple), - multi_polygon_union_(multi_polygon_union), - fill_type_(fill_type), - scale_denominator_(scale_denominator), - reencode_(reencode), - max_extent_(max_extent), - simplify_distance_(simplify_distance), - process_all_rings_(process_all_rings), - image_format_(image_format), - scaling_method_(scaling_method), - threading_mode_(threading_mode) + : Base(callback), + tile_(tile), + vtiles_(vtiles), + scale_factor_(scale_factor), + offset_x_(offset_x), + offset_y_(offset_y), + area_threshold_(area_threshold), + strictly_simple_(strictly_simple), + multi_polygon_union_(multi_polygon_union), + fill_type_(fill_type), + scale_denominator_(scale_denominator), + reencode_(reencode), + max_extent_(max_extent), + simplify_distance_(simplify_distance), + process_all_rings_(process_all_rings), + image_format_(image_format), + scaling_method_(scaling_method), + threading_mode_(threading_mode) {} void Execute() override { try { - _composite(tile_, + _composite(tile_->impl(), vtiles_, scale_factor_, offset_x_, @@ -450,12 +451,14 @@ struct AsyncCompositeVectorTile : Napi::AsyncWorker } std::vector GetResult(Napi::Env env) override { - Napi::Value arg = Napi::External::New(env, &tile_); - Napi::Object obj = VectorTile::constructor.New({arg}); - return {env.Undefined(), napi_value(obj)}; + if (tile_ != nullptr && !tile_->IsEmpty()) + { + return {env.Undefined(), tile_->Value()}; + } + return Base::GetResult(env); } private: - tile_type tile_; + VectorTile *tile_; std::vector vtiles_; double scale_factor_; unsigned offset_x_; @@ -816,7 +819,7 @@ Napi::Value VectorTile::composite(Napi::CallbackInfo const& info) vtiles_vec.push_back(Napi::ObjectWrap::Unwrap(tile_obj)->tile_); } - auto * worker = new AsyncCompositeVectorTile{tile_, + auto * worker = new AsyncCompositeVectorTile{this, vtiles_vec, scale_factor, offset_x, diff --git a/src/mapnik_vector_tile_render.cpp b/src/mapnik_vector_tile_render.cpp index 083a8ebac6..74b6770a55 100644 --- a/src/mapnik_vector_tile_render.cpp +++ b/src/mapnik_vector_tile_render.cpp @@ -321,33 +321,26 @@ struct AsyncRenderTile : Napi::AsyncWorker std::vector GetResult(Napi::Env env) override { - if (surface_.is()) + if (surface_.is()) { - image_ptr image = mapnik::util::get(surface_)->impl(); - Napi::Value arg = Napi::External::New(env, &image); - Napi::Object obj = Image::constructor.New({arg}); - return {env.Undefined(), napi_value(obj)}; + Image * image = mapnik::util::get(surface_); + if (image != nullptr && !image->IsEmpty()) return {env.Undefined(), image->Value()}; } #if defined(GRID_RENDERER) - else if (surface_.is()) + else if (surface_.is()) { - grid_ptr grid = mapnik::util::get(surface_)->impl(); - Napi::Value arg = Napi::External::New(env, &grid); - Napi::Object obj = Grid::constructor.New({arg}); - return {env.Undefined(), napi_value(obj)}; + Grid * grid = mapnik::util::get(surface_); + if (grid != nullptr && !grid->IsEmpty()) return {env.Undefined(), grid->Value()}; } #endif - else if (surface_.is()) + else if (surface_.is()) { - CairoSurface * c = mapnik::util::get(surface_); - c->flush(); - Napi::Value width = Napi::Number::New(env, c->width()); - Napi::Value height = Napi::Number::New(env, c->height()); - Napi::Value format = Napi::String::New(env, c->format()); - Napi::Object obj = CairoSurface::constructor.New({format, width, height}); - CairoSurface * new_c = Napi::ObjectWrap::Unwrap(obj); - new_c->set_data(c->data()); - return {env.Undefined(), napi_value(obj)}; + CairoSurface * cairo = mapnik::util::get(surface_); + if (cairo != nullptr && !cairo->IsEmpty()) + { + cairo->flush(); + return {env.Undefined(), cairo->Value()}; + } } return Base::GetResult(env); } From 95e3d963ae54f5bb6ee1239c628f22d62759d831 Mon Sep 17 00:00:00 2001 From: Artem Pavlenko Date: Fri, 14 Aug 2020 14:59:37 +0100 Subject: [PATCH 3/3] Update Image implementation as per https://github.com/nodejs/node-addon-api/pull/754 --- binding.gyp | 2 +- package.json | 2 +- src/blend.cpp | 4 ++-- src/mapnik_image.cpp | 15 ++++++++++----- src/mapnik_image.hpp | 3 ++- src/mapnik_image_compositing.cpp | 2 +- src/mapnik_image_copy.cpp | 4 ++-- src/mapnik_image_filter.cpp | 2 +- src/mapnik_image_from_bytes.cpp | 7 ++++--- src/mapnik_image_from_svg.cpp | 6 +++--- src/mapnik_image_open.cpp | 4 ++-- src/mapnik_image_resize.cpp | 4 ++-- src/mapnik_map_render.cpp | 4 ++-- src/mapnik_vector_tile_image.cpp | 4 ++-- src/mapnik_vector_tile_render.cpp | 2 +- 15 files changed, 36 insertions(+), 29 deletions(-) diff --git a/binding.gyp b/binding.gyp index f617b1424f..3ab49ba92f 100644 --- a/binding.gyp +++ b/binding.gyp @@ -70,7 +70,7 @@ './mason_packages/.link/include/cairo', './mason_packages/.link/include/mapnik', './src', - "(); - if (obj.InstanceOf(Image::constructor.Value())) + if (obj.InstanceOf(Image::Constructor(env))) { Image * im = Napi::ObjectWrap::Unwrap(obj); @@ -876,7 +876,7 @@ Napi::Value blend(Napi::CallbackInfo const& info) else if (buffer.IsObject()) { Napi::Object possible_im = buffer.As(); - if (possible_im.InstanceOf(Image::constructor.Value())) + if (possible_im.InstanceOf(Image::Constructor(env))) { Image * im = Napi::ObjectWrap::Unwrap(possible_im); if (im->impl()->get_dtype() == mapnik::image_dtype_rgba8) diff --git a/src/mapnik_image.cpp b/src/mapnik_image.cpp index 40a5995272..98ef421309 100644 --- a/src/mapnik_image.cpp +++ b/src/mapnik_image.cpp @@ -14,8 +14,6 @@ #include // for basic_ostringstream, etc #include -Napi::FunctionReference Image::constructor; - Napi::Object Image::Initialize(Napi::Env env, Napi::Object exports, napi_property_attributes prop_attr) { Napi::HandleScope scope(env); @@ -66,12 +64,19 @@ Napi::Object Image::Initialize(Napi::Env env, Napi::Object exports, napi_propert StaticMethod<&Image::fromSVGBytesSync>("fromSVGBytesSync", prop_attr), StaticMethod<&Image::fromSVGBytes>("fromSVGBytes", prop_attr) }); - constructor = Napi::Persistent(func); - constructor.SuppressDestruct(); + Napi::FunctionReference* constructor = new Napi::FunctionReference(); + *constructor = Napi::Persistent(func); exports.Set("Image", func); + env.SetInstanceData(constructor); return exports; } +Napi::Object Image::NewInstance(Napi::Env env, Napi::Value arg) +{ + Napi::Object obj = env.GetInstanceData()->New({arg}); + return obj; +} + /** * **`mapnik.Image`** * @@ -426,7 +431,7 @@ Napi::Value Image::compare(Napi::CallbackInfo const& info) return env.Undefined(); } Napi::Object obj = info[0].As(); - if (!obj.InstanceOf(Image::constructor.Value())) + if (!obj.InstanceOf(Image::Constructor(env))) { Napi::TypeError::New(env, "mapnik.Image expected as first arg").ThrowAsJavaScriptException(); return env.Undefined(); diff --git a/src/mapnik_image.hpp b/src/mapnik_image.hpp index 38570bd21c..6336c8402e 100644 --- a/src/mapnik_image.hpp +++ b/src/mapnik_image.hpp @@ -15,6 +15,8 @@ class Image : public Napi::ObjectWrap public: // initializer static Napi::Object Initialize(Napi::Env env, Napi::Object exports, napi_property_attributes attr); + static Napi::Object NewInstance(Napi::Env env, Napi::Value arg); + static Napi::Function Constructor(Napi::Env env) { return env.GetInstanceData()->Value();} // ctor explicit Image(Napi::CallbackInfo const& info); // methods @@ -70,7 +72,6 @@ class Image : public Napi::ObjectWrap Napi::Value offset(Napi::CallbackInfo const& info); void offset(Napi::CallbackInfo const& info, Napi::Value const& value); inline image_ptr impl() const { return image_; } - static Napi::FunctionReference constructor; private: static void encode_common_args_(Napi::CallbackInfo const& info, std::string& format, palette_ptr& palette); static Napi::Value from_svg_sync_impl(Napi::CallbackInfo const& info, bool from_file); diff --git a/src/mapnik_image_compositing.cpp b/src/mapnik_image_compositing.cpp index b2b9315974..1967bd389f 100644 --- a/src/mapnik_image_compositing.cpp +++ b/src/mapnik_image_compositing.cpp @@ -111,7 +111,7 @@ Napi::Value Image::composite(Napi::CallbackInfo const& info) } Napi::Object obj = info[0].As(); - if (!obj.InstanceOf(Image::constructor.Value())) + if (!obj.InstanceOf(Image::Constructor(env))) { Napi::TypeError::New(env, "mapnik.Image expected as first arg").ThrowAsJavaScriptException(); return env.Undefined(); diff --git a/src/mapnik_image_copy.cpp b/src/mapnik_image_copy.cpp index afdbd213a1..9c10585a13 100644 --- a/src/mapnik_image_copy.cpp +++ b/src/mapnik_image_copy.cpp @@ -36,7 +36,7 @@ struct AsyncCopy : Napi::AsyncWorker if (image_out_) { Napi::Value arg = Napi::External::New(env, &image_out_); - Napi::Object obj = Image::constructor.New({arg}); + Napi::Object obj = Image::NewInstance(env, arg); return {env.Undefined(), napi_value(obj)}; } return Base::GetResult(env); @@ -265,7 +265,7 @@ Napi::Value Image::copySync(Napi::CallbackInfo const& info) mapnik::image_copy(*image_, type, offset, scaling) ); Napi::Value arg = Napi::External::New(env, &image_out); - Napi::Object obj = Image::constructor.New({arg}); + Napi::Object obj = Image::NewInstance(env, arg); return scope.Escape(obj); } catch (std::exception const& ex) diff --git a/src/mapnik_image_filter.cpp b/src/mapnik_image_filter.cpp index 57f72a6792..e474880bb4 100644 --- a/src/mapnik_image_filter.cpp +++ b/src/mapnik_image_filter.cpp @@ -36,7 +36,7 @@ struct AsyncFilter : Napi::AsyncWorker if (image_) { Napi::Value arg = Napi::External::New(env, &image_); - Napi::Object obj = Image::constructor.New({arg}); + Napi::Object obj = Image::NewInstance(env, arg); return {env.Null(), napi_value(obj)}; } return Base::GetResult(env); diff --git a/src/mapnik_image_from_bytes.cpp b/src/mapnik_image_from_bytes.cpp index 60e4e21c92..284fcff7b1 100644 --- a/src/mapnik_image_from_bytes.cpp +++ b/src/mapnik_image_from_bytes.cpp @@ -51,7 +51,7 @@ struct AsyncFromBytes : Napi::AsyncWorker if (image_) { Napi::Value arg = Napi::External::New(env, &image_); - Napi::Object obj = Image::constructor.New({arg}); + Napi::Object obj = Image::NewInstance(env, arg); return {env.Null(), napi_value(obj)}; } return Base::GetResult(env); @@ -111,7 +111,7 @@ Napi::Value Image::fromBytesSync(Napi::CallbackInfo const& info) mapnik::set_premultiplied_alpha(*imagep, true); } Napi::Value arg = Napi::External::New(env, &imagep); - Napi::Object obj = constructor.New({arg}); + Napi::Object obj = NewInstance(env, arg); return scope.Escape(napi_value(obj)).ToObject(); } // The only way this is ever reached is if the reader factory in @@ -337,7 +337,8 @@ Napi::Value Image::fromBufferSync(Napi::CallbackInfo const& info) mapnik::image_rgba8 im_wrapper(width, height, reinterpret_cast(obj.As>().Data()), premultiplied, painted); image_ptr imagep = std::make_shared(im_wrapper); Napi::Value arg = Napi::External::New(env, &imagep); - Napi::Object image_obj = constructor.New({arg}); + Napi::FunctionReference* constructor = env.GetInstanceData(); + Napi::Object image_obj = constructor->New({arg}); image_obj.Set("_buffer", obj); return scope.Escape(napi_value(image_obj)).ToObject(); } diff --git a/src/mapnik_image_from_svg.cpp b/src/mapnik_image_from_svg.cpp index 5bc9818bfa..3288fb28e5 100644 --- a/src/mapnik_image_from_svg.cpp +++ b/src/mapnik_image_from_svg.cpp @@ -126,7 +126,7 @@ struct AsyncFromSVG : Napi::AsyncWorker if (image_) { Napi::Value arg = Napi::External::New(env, &image_); - Napi::Object obj = Image::constructor.New({arg}); + Napi::Object obj = Image::NewInstance(env, arg); return {env.Null(), napi_value(obj)}; } return Base::GetResult(env); @@ -245,7 +245,7 @@ struct AsyncFromSVGBytes : Napi::AsyncWorker if (image_) { Napi::Value arg = Napi::External::New(env, &image_); - Napi::Object obj = Image::constructor.New({arg}); + Napi::Object obj = Image::NewInstance(env, arg); return {env.Null(), napi_value(obj)}; } return Base::GetResult(env); @@ -432,7 +432,7 @@ Napi::Value Image::from_svg_sync_impl(Napi::CallbackInfo const& info, bool from_ image_ptr imagep = std::make_shared(im); Napi::Value arg = Napi::External::New(env, &imagep); - Napi::Object obj = Image::constructor.New({arg}); + Napi::Object obj = Image::NewInstance(env, arg); return scope.Escape(napi_value(obj)).ToObject(); } catch (std::exception const& ex) diff --git a/src/mapnik_image_open.cpp b/src/mapnik_image_open.cpp index 80975e4e2b..c10e117a6e 100644 --- a/src/mapnik_image_open.cpp +++ b/src/mapnik_image_open.cpp @@ -46,7 +46,7 @@ struct AsyncOpen : Napi::AsyncWorker if (image_) { Napi::Value arg = Napi::External::New(env, &image_); - Napi::Object obj = Image::constructor.New({arg}); + Napi::Object obj = Image::NewInstance(env, arg); return {env.Null(), napi_value(obj)}; } return Base::GetResult(env); @@ -99,7 +99,7 @@ Napi::Value Image::openSync(Napi::CallbackInfo const& info) mapnik::set_premultiplied_alpha(*imagep, true); } Napi::Value arg = Napi::External::New(env, &imagep); - Napi::Object obj = constructor.New({arg}); + Napi::Object obj = NewInstance(env, arg); return scope.Escape(napi_value(obj)).ToObject(); } } diff --git a/src/mapnik_image_resize.cpp b/src/mapnik_image_resize.cpp index 99a9d95882..2c2c561352 100644 --- a/src/mapnik_image_resize.cpp +++ b/src/mapnik_image_resize.cpp @@ -177,7 +177,7 @@ struct AsyncResize : Napi::AsyncWorker if (image_out_) { Napi::Value arg = Napi::External::New(env, &image_out_); - Napi::Object obj = Image::constructor.New({arg}); + Napi::Object obj = Image::NewInstance(env, arg); return {env.Null(), napi_value(obj)}; } return Base::GetResult(env); @@ -594,7 +594,7 @@ Napi::Value Image::resizeSync(Napi::CallbackInfo const& info) corrected_offset_y); mapnik::util::apply_visitor(visit, *image_out); Napi::Value arg = Napi::External::New(env, &image_out); - Napi::Object obj = Image::constructor.New({arg}); + Napi::Object obj = Image::NewInstance(env, arg); return scope.Escape(obj); } catch (std::exception const& ex) diff --git a/src/mapnik_map_render.cpp b/src/mapnik_map_render.cpp index e2c7300e10..5163f5ea1e 100644 --- a/src/mapnik_map_render.cpp +++ b/src/mapnik_map_render.cpp @@ -132,7 +132,7 @@ struct AsyncRenderImage : AsyncRender std::vector GetResult(Napi::Env env) override { Napi::Value arg = Napi::External::New(env, &image_); - Napi::Object obj = Image::constructor.New({arg}); + Napi::Object obj = Image::NewInstance(env, arg); return {env.Null(), napi_value(obj)}; } @@ -550,7 +550,7 @@ Napi::Value Map::render(Napi::CallbackInfo const& info) Napi::Object obj = info[0].As(); - if (obj.InstanceOf(Image::constructor.Value())) + if (obj.InstanceOf(Image::Constructor(env))) { image_ptr image = Napi::ObjectWrap::Unwrap(obj)->impl(); mapnik::attributes variables; diff --git a/src/mapnik_vector_tile_image.cpp b/src/mapnik_vector_tile_image.cpp index 32abdb9cd5..a725e06835 100644 --- a/src/mapnik_vector_tile_image.cpp +++ b/src/mapnik_vector_tile_image.cpp @@ -59,7 +59,7 @@ Napi::Value VectorTile::addImageSync(Napi::CallbackInfo const& info) std::string layer_name = info[1].As(); Napi::Object obj = info[0].As(); - if (!obj.InstanceOf(Image::constructor.Value())) + if (!obj.InstanceOf(Image::Constructor(env))) { Napi::Error::New(env, "first argument must be an Image object").ThrowAsJavaScriptException(); return scope.Escape(env.Undefined()); @@ -253,7 +253,7 @@ Napi::Value VectorTile::addImage(Napi::CallbackInfo const& info) } std::string layer_name = info[1].As(); Napi::Object obj = info[0].As(); - if (!obj.InstanceOf(Image::constructor.Value())) + if (!obj.InstanceOf(Image::Constructor(env))) { Napi::Error::New(env, "first argument must be an Image object").ThrowAsJavaScriptException(); return env.Undefined(); diff --git a/src/mapnik_vector_tile_render.cpp b/src/mapnik_vector_tile_render.cpp index 74b6770a55..24c27a3c77 100644 --- a/src/mapnik_vector_tile_render.cpp +++ b/src/mapnik_vector_tile_render.cpp @@ -569,7 +569,7 @@ Napi::Value VectorTile::render(Napi::CallbackInfo const& info) unsigned height = 0; surface_type surface; bool use_cairo = false; - if (im_obj.InstanceOf(Image::constructor.Value())) + if (im_obj.InstanceOf(Image::Constructor(env))) { Image* im = Napi::ObjectWrap::Unwrap(im_obj); width = im->impl()->width();