-
Notifications
You must be signed in to change notification settings - Fork 165
Expand file tree
/
Copy pathmapnik_image_clear.cpp
More file actions
101 lines (90 loc) · 2.37 KB
/
mapnik_image_clear.cpp
File metadata and controls
101 lines (90 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <mapnik/image.hpp> // for image types
#include <mapnik/image_any.hpp> // for image_any
#include <mapnik/image_util.hpp> // for save_to_string, guess_type, etc
#include "mapnik_image.hpp"
namespace detail {
// AsyncWorker
struct AsyncClear : Napi::AsyncWorker
{
using Base = Napi::AsyncWorker;
AsyncClear(image_ptr const& image, Napi::Function const& callback)
: Base(callback),
image_(image)
{
}
void Execute() override
{
mapnik::fill(*image_, 0);
}
std::vector<napi_value> GetResult(Napi::Env env) override
{
if (image_)
{
Napi::Value arg = Napi::External<image_ptr>::New(env, &image_);
Napi::Object obj = Image::constructor.New({arg});
return {env.Null(), napi_value(obj)};
}
return Base::GetResult(env);
}
image_ptr image_;
};
} // namespace detail
/**
* Make this image transparent. (synchronous)
*
* @name clearSync
* @instance
* @memberof Image
* @example
* var img = new mapnik.Image(5,5);
* img.fillSync(1);
* console.log(img.getPixel(0, 0)); // 1
* img.clearSync();
* console.log(img.getPixel(0, 0)); // 0
*/
Napi::Value Image::clearSync(Napi::CallbackInfo const& info)
{
Napi::Env env = info.Env();
try
{
mapnik::fill(*image_, 0);
}
catch (std::exception const& ex)
{
Napi::Error::New(env, ex.what()).ThrowAsJavaScriptException();
}
return env.Undefined();
}
/**
* Make this image transparent, removing all image data from it.
*
* @name clear
* @instance
* @param {Function} callback
* @memberof Image
* @example
* var img = new mapnik.Image(5,5);
* img.fillSync(1);
* console.log(img.getPixel(0, 0)); // 1
* img.clear(function(err, result) {
* console.log(result.getPixel(0,0)); // 0
* });
*/
Napi::Value Image::clear(Napi::CallbackInfo const& info)
{
if (info.Length() == 0)
{
return clearSync(info);
}
Napi::Env env = info.Env();
// ensure callback is a function
Napi::Value callback_val = info[info.Length() - 1];
if (!callback_val.IsFunction())
{
Napi::TypeError::New(env, "last argument must be a callback function").ThrowAsJavaScriptException();
return env.Undefined();
}
auto* worker = new detail::AsyncClear{image_, callback_val.As<Napi::Function>()};
worker->Queue();
return env.Undefined();
}