From 95e3d963ae54f5bb6ee1239c628f22d62759d831 Mon Sep 17 00:00:00 2001 From: Artem Pavlenko Date: Fri, 14 Aug 2020 14:59:37 +0100 Subject: [PATCH] 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();