@hxa-rn/react-native-gcanvas 6.0.24-beta.1 → 6.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -2
- package/LICENSE +203 -21
- package/README.md +207 -207
- package/harmony/gcanvas/LICENSE +203 -21
- package/harmony/gcanvas/NOTICE +32 -32
- package/harmony/gcanvas/OAT.xml +37 -37
- package/harmony/gcanvas/build-profile.json5 +16 -16
- package/harmony/gcanvas/hvigorfile.ts +1 -1
- package/harmony/gcanvas/index.ets +1 -1
- package/harmony/gcanvas/oh-package.json5 +14 -14
- package/harmony/gcanvas/src/main/cpp/CMakeLists.txt +126 -126
- package/harmony/gcanvas/src/main/cpp/GCanvasNapi.cpp +485 -485
- package/harmony/gcanvas/src/main/cpp/GCanvasXComponent.cpp +106 -106
- package/harmony/gcanvas/src/main/cpp/GcanvasPackage.h +24 -24
- package/harmony/gcanvas/src/main/ets/GCanvasModuleTurboModule.ts +448 -448
- package/harmony/gcanvas/src/main/ets/GCanvasNativeEngine.ts +206 -206
- package/harmony/gcanvas/src/main/ets/components/GCanvasView.ets +64 -64
- package/harmony/gcanvas/src/main/module.json5 +21 -21
- package/harmony/gcanvas/src/main/resources/base/element/string.json +12 -12
- package/harmony/gcanvas/src/main/resources/en_US/element/string.json +8 -8
- package/harmony/gcanvas/src/main/resources/zh_CN/element/string.json +12 -12
- package/harmony/gcanvas.har +0 -0
- package/package.json +4 -4
- package/packages/gcanvas/.babelrc +4 -4
- package/packages/gcanvas/.eslintrc.js +133 -133
- package/packages/gcanvas/package.json +19 -19
- package/packages/gcanvas/rollup.config.js +13 -13
- package/packages/gcanvas/src/bridge/react-native.js +286 -286
- package/packages/gcanvas/src/bridge/weex.js +210 -210
- package/packages/gcanvas/src/context/2d/FillStyleLinearGradient.js +16 -16
- package/packages/gcanvas/src/context/2d/FillStylePattern.js +7 -7
- package/packages/gcanvas/src/context/2d/FillStyleRadialGradient.js +16 -16
- package/packages/gcanvas/src/context/2d/OffScreenRenderingContext.js +48 -48
- package/packages/gcanvas/src/context/2d/RenderingContext.js +787 -787
- package/packages/gcanvas/src/context/webgl/ActiveInfo.js +10 -10
- package/packages/gcanvas/src/context/webgl/Buffer.js +20 -20
- package/packages/gcanvas/src/context/webgl/Framebuffer.js +20 -20
- package/packages/gcanvas/src/context/webgl/GLenum.js +300 -300
- package/packages/gcanvas/src/context/webgl/GLmethod.js +141 -141
- package/packages/gcanvas/src/context/webgl/GLtype.js +22 -22
- package/packages/gcanvas/src/context/webgl/Program.js +20 -20
- package/packages/gcanvas/src/context/webgl/Renderbuffer.js +20 -20
- package/packages/gcanvas/src/context/webgl/RenderingContext.js +1479 -1479
- package/packages/gcanvas/src/context/webgl/Shader.js +21 -21
- package/packages/gcanvas/src/context/webgl/ShaderPrecisionFormat.js +10 -10
- package/packages/gcanvas/src/context/webgl/Texture.js +21 -21
- package/packages/gcanvas/src/context/webgl/UniformLocation.js +21 -21
- package/packages/gcanvas/src/context/webgl/classUtils.js +2 -2
- package/packages/gcanvas/src/env/canvas.js +210 -210
- package/packages/gcanvas/src/env/image.js +76 -76
- package/packages/gcanvas/src/env/off-screen-canvas.js +74 -74
- package/packages/gcanvas/src/index.js +56 -56
- package/src/components/CanvasView.js +20 -20
- package/src/components/GCanvasComponent.js +408 -408
- package/src/index.js +69 -69
- package/src/packages/gcanvas/.babelrc +4 -4
- package/src/packages/gcanvas/.eslintrc.js +133 -133
- package/src/packages/gcanvas/package.json +19 -19
- package/src/packages/gcanvas/rollup.config.js +13 -13
- package/src/packages/gcanvas/src/bridge/react-native.js +288 -288
- package/src/packages/gcanvas/src/bridge/weex.js +210 -210
- package/src/packages/gcanvas/src/context/2d/FillStyleLinearGradient.js +16 -16
- package/src/packages/gcanvas/src/context/2d/FillStylePattern.js +7 -7
- package/src/packages/gcanvas/src/context/2d/FillStyleRadialGradient.js +16 -16
- package/src/packages/gcanvas/src/context/2d/OffScreenRenderingContext.js +48 -48
- package/src/packages/gcanvas/src/context/2d/RenderingContext.js +801 -801
- package/src/packages/gcanvas/src/context/webgl/ActiveInfo.js +10 -10
- package/src/packages/gcanvas/src/context/webgl/Buffer.js +20 -20
- package/src/packages/gcanvas/src/context/webgl/Framebuffer.js +20 -20
- package/src/packages/gcanvas/src/context/webgl/GLenum.js +300 -300
- package/src/packages/gcanvas/src/context/webgl/GLmethod.js +141 -141
- package/src/packages/gcanvas/src/context/webgl/GLtype.js +22 -22
- package/src/packages/gcanvas/src/context/webgl/Program.js +20 -20
- package/src/packages/gcanvas/src/context/webgl/Renderbuffer.js +20 -20
- package/src/packages/gcanvas/src/context/webgl/RenderingContext.js +1479 -1479
- package/src/packages/gcanvas/src/context/webgl/Shader.js +21 -21
- package/src/packages/gcanvas/src/context/webgl/ShaderPrecisionFormat.js +10 -10
- package/src/packages/gcanvas/src/context/webgl/Texture.js +21 -21
- package/src/packages/gcanvas/src/context/webgl/UniformLocation.js +21 -21
- package/src/packages/gcanvas/src/context/webgl/classUtils.js +2 -2
- package/src/packages/gcanvas/src/env/canvas.js +210 -210
- package/src/packages/gcanvas/src/env/image.js +76 -76
- package/src/packages/gcanvas/src/env/off-screen-canvas.js +74 -74
- package/src/packages/gcanvas/src/index.js +56 -56
- package/src/specs/v1/GCanvasViewNativeComponent.ts +42 -42
- package/src/specs/v1/NativeGCanvasModule.ts +140 -140
|
@@ -1,485 +1,485 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GCanvasNapi — 把 C++ GCanvasEngine 以 NAPI 模块 'libgcanvas.so' 暴露给 ArkTS。
|
|
3
|
-
*
|
|
4
|
-
* ArkTS 侧 `import nativeModule from 'libgcanvas.so'`(GCanvasNativeEngine.ts)调用本模块
|
|
5
|
-
* 导出的函数。模块名 gcanvas 与 XComponent libraryname 一致,故本 .so 同时承担:
|
|
6
|
-
* 1. XComponent native window 回调(GCanvasXComponent.cpp 的 RegisterGCanvasModule);
|
|
7
|
-
* 2. ArkTS 可调用的命令/字体/纹理 NAPI 函数(本文件)。
|
|
8
|
-
*
|
|
9
|
-
* 注意:ArkTS NAPI 互操作中,对象字面量(如 enable 的 args: {componentId, config})经
|
|
10
|
-
* napi_value 传入,此处逐一取出字段。ArrayBuffer(像素缓冲)经 napi_get_arraybuffer_info 取指针。
|
|
11
|
-
*/
|
|
12
|
-
#include "GCanvasEngine.h"
|
|
13
|
-
|
|
14
|
-
#include <hilog/log.h>
|
|
15
|
-
#include <napi/native_api.h>
|
|
16
|
-
|
|
17
|
-
#include <cstdint>
|
|
18
|
-
#include <limits>
|
|
19
|
-
#include <string>
|
|
20
|
-
#include <vector>
|
|
21
|
-
|
|
22
|
-
#define GC_LOGI(...) OH_LOG_INFO(LOG_APP, __VA_ARGS__)
|
|
23
|
-
#define GC_LOGE(...) OH_LOG_ERROR(LOG_APP, __VA_ARGS__)
|
|
24
|
-
|
|
25
|
-
namespace {
|
|
26
|
-
|
|
27
|
-
using namespace gcanvas;
|
|
28
|
-
|
|
29
|
-
std::string NapiToString(napi_env env, napi_value value) {
|
|
30
|
-
if (value == nullptr) {
|
|
31
|
-
return "";
|
|
32
|
-
}
|
|
33
|
-
size_t len = 0;
|
|
34
|
-
if (napi_get_value_string_utf8(env, value, nullptr, 0, &len) != napi_ok) {
|
|
35
|
-
return "";
|
|
36
|
-
}
|
|
37
|
-
std::vector<char> buffer(len + 1U, '\0');
|
|
38
|
-
if (napi_get_value_string_utf8(env, value, buffer.data(), buffer.size(), &len) != napi_ok) {
|
|
39
|
-
return "";
|
|
40
|
-
}
|
|
41
|
-
return std::string(buffer.data(), len);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
std::vector<double> NapiToDoubleArray(napi_env env, napi_value configValue) {
|
|
45
|
-
std::vector<double> config;
|
|
46
|
-
if (configValue == nullptr) {
|
|
47
|
-
return config;
|
|
48
|
-
}
|
|
49
|
-
uint32_t length = 0;
|
|
50
|
-
if (napi_get_array_length(env, configValue, &length) != napi_ok) {
|
|
51
|
-
return config;
|
|
52
|
-
}
|
|
53
|
-
config.reserve(length);
|
|
54
|
-
for (uint32_t i = 0; i < length; ++i) {
|
|
55
|
-
napi_value elem = nullptr;
|
|
56
|
-
napi_get_element(env, configValue, i, &elem);
|
|
57
|
-
double v = 0;
|
|
58
|
-
if (napi_get_value_double(env, elem, &v) == napi_ok) {
|
|
59
|
-
config.push_back(v);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return config;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
int32_t GetNamedInt32(napi_env env, napi_value object, const char *name) {
|
|
66
|
-
napi_value value = nullptr;
|
|
67
|
-
int32_t result = 0;
|
|
68
|
-
if (object != nullptr && napi_get_named_property(env, object, name, &value) == napi_ok) {
|
|
69
|
-
napi_get_value_int32(env, value, &result);
|
|
70
|
-
}
|
|
71
|
-
return result;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
std::string GetNamedString(napi_env env, napi_value object, const char *name) {
|
|
75
|
-
napi_value value = nullptr;
|
|
76
|
-
if (object == nullptr || napi_get_named_property(env, object, name, &value) != napi_ok) {
|
|
77
|
-
return "";
|
|
78
|
-
}
|
|
79
|
-
return NapiToString(env, value);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
DrawCanvas2CanvasArgs ParseDrawMap(napi_env env, napi_value mapValue) {
|
|
83
|
-
DrawCanvas2CanvasArgs result;
|
|
84
|
-
result.srcComponentId = GetNamedString(env, mapValue, "srcComponentId");
|
|
85
|
-
result.dstComponentId = GetNamedString(env, mapValue, "dstComponentId");
|
|
86
|
-
result.tw = GetNamedInt32(env, mapValue, "tw");
|
|
87
|
-
result.th = GetNamedInt32(env, mapValue, "th");
|
|
88
|
-
result.sx = GetNamedInt32(env, mapValue, "sx");
|
|
89
|
-
result.sy = GetNamedInt32(env, mapValue, "sy");
|
|
90
|
-
result.sw = GetNamedInt32(env, mapValue, "sw");
|
|
91
|
-
result.sh = GetNamedInt32(env, mapValue, "sh");
|
|
92
|
-
result.dx = GetNamedInt32(env, mapValue, "dx");
|
|
93
|
-
result.dy = GetNamedInt32(env, mapValue, "dy");
|
|
94
|
-
result.dw = GetNamedInt32(env, mapValue, "dw");
|
|
95
|
-
result.dh = GetNamedInt32(env, mapValue, "dh");
|
|
96
|
-
return result;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
std::vector<std::string> NapiToStringArray(napi_env env, napi_value value) {
|
|
100
|
-
std::vector<std::string> result;
|
|
101
|
-
if (value == nullptr) {
|
|
102
|
-
return result;
|
|
103
|
-
}
|
|
104
|
-
uint32_t length = 0;
|
|
105
|
-
napi_get_array_length(env, value, &length);
|
|
106
|
-
for (uint32_t i = 0; i < length; ++i) {
|
|
107
|
-
napi_value elem = nullptr;
|
|
108
|
-
napi_get_element(env, value, i, &elem);
|
|
109
|
-
result.push_back(NapiToString(env, elem));
|
|
110
|
-
}
|
|
111
|
-
return result;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
napi_value MakeString(napi_env env, const std::string &str) {
|
|
115
|
-
napi_value result = nullptr;
|
|
116
|
-
napi_create_string_utf8(env, str.c_str(), str.length(), &result);
|
|
117
|
-
return result;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
using NapiCb = napi_value (*)(napi_env, napi_callback_info);
|
|
121
|
-
|
|
122
|
-
napi_value CreateFunction(napi_env env, NapiCb cb) {
|
|
123
|
-
napi_value fn = nullptr;
|
|
124
|
-
napi_create_function(env, "fn", NAPI_AUTO_LENGTH, cb, nullptr, &fn);
|
|
125
|
-
return fn;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
void *GetArrayBuffer(napi_env env, napi_value value, size_t *length) {
|
|
129
|
-
void *data = nullptr;
|
|
130
|
-
*length = 0;
|
|
131
|
-
bool isArrayBuffer = false;
|
|
132
|
-
napi_is_arraybuffer(env, value, &isArrayBuffer);
|
|
133
|
-
if (!isArrayBuffer) {
|
|
134
|
-
return nullptr;
|
|
135
|
-
}
|
|
136
|
-
napi_get_arraybuffer_info(env, value, &data, length);
|
|
137
|
-
return data;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
bool HasRgbaBytes(size_t actualLength, int32_t width, int32_t height) {
|
|
141
|
-
if (width <= 0 || height <= 0) {
|
|
142
|
-
return false;
|
|
143
|
-
}
|
|
144
|
-
const size_t w = static_cast<size_t>(width);
|
|
145
|
-
const size_t h = static_cast<size_t>(height);
|
|
146
|
-
return w <= std::numeric_limits<size_t>::max() / h &&
|
|
147
|
-
w * h <= std::numeric_limits<size_t>::max() / 4U && actualLength >= w * h * 4U;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
#define NAPI_EXPORT(name, fn) napi_set_named_property(env, exports, name, fn)
|
|
151
|
-
|
|
152
|
-
napi_value BindSurface(napi_env env, napi_callback_info info) {
|
|
153
|
-
size_t argc = 4;
|
|
154
|
-
napi_value args[4] = {nullptr};
|
|
155
|
-
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
|
|
156
|
-
std::string componentId = NapiToString(env, argc > 0 ? args[0] : nullptr);
|
|
157
|
-
int64_t window = 0;
|
|
158
|
-
if (argc > 1) {
|
|
159
|
-
napi_get_value_int64(env, args[1], &window);
|
|
160
|
-
}
|
|
161
|
-
double w = 0, h = 0;
|
|
162
|
-
if (argc > 2) { napi_get_value_double(env, args[2], &w); }
|
|
163
|
-
if (argc > 3) { napi_get_value_double(env, args[3], &h); }
|
|
164
|
-
if (!componentId.empty() && window != 0 && w > 0 && h > 0) {
|
|
165
|
-
GCanvasEngine::Instance().OnSurfaceCreated(
|
|
166
|
-
componentId, reinterpret_cast<void *>(static_cast<uintptr_t>(window)),
|
|
167
|
-
static_cast<uint64_t>(w), static_cast<uint64_t>(h));
|
|
168
|
-
}
|
|
169
|
-
return nullptr;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
napi_value Enable(napi_env env, napi_callback_info info) {
|
|
173
|
-
size_t argc = 2;
|
|
174
|
-
napi_value args[2] = {nullptr};
|
|
175
|
-
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
|
|
176
|
-
const std::string componentId = NapiToString(env, argc > 0 ? args[0] : nullptr);
|
|
177
|
-
const std::vector<double> config = NapiToDoubleArray(env, argc > 1 ? args[1] : nullptr);
|
|
178
|
-
GCanvasEngine::Instance().Enable(componentId, config);
|
|
179
|
-
return nullptr;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
napi_value Disable(napi_env env, napi_callback_info info) {
|
|
183
|
-
size_t argc = 1;
|
|
184
|
-
napi_value argv[1] = {nullptr};
|
|
185
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
186
|
-
GCanvasEngine::Instance().Disable(NapiToString(env, argv[0]));
|
|
187
|
-
return nullptr;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
napi_value Render(napi_env env, napi_callback_info info) {
|
|
191
|
-
size_t argc = 3;
|
|
192
|
-
napi_value argv[3] = {nullptr};
|
|
193
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
194
|
-
std::string canvasId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
195
|
-
std::string cmd = NapiToString(env, argc > 1 ? argv[1] : nullptr);
|
|
196
|
-
int32_t type = 0;
|
|
197
|
-
if (argc > 2) { napi_get_value_int32(env, argv[2], &type); }
|
|
198
|
-
GCanvasEngine::Instance().Render(canvasId, cmd, type);
|
|
199
|
-
return nullptr;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
napi_value ExtendCallNative(napi_env env, napi_callback_info info) {
|
|
203
|
-
size_t argc = 3;
|
|
204
|
-
napi_value argv[3] = {nullptr};
|
|
205
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
206
|
-
const std::string contextId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
207
|
-
const std::string args = NapiToString(env, argc > 1 ? argv[1] : nullptr);
|
|
208
|
-
int32_t type = 0;
|
|
209
|
-
if (argc > 2) { napi_get_value_int32(env, argv[2], &type); }
|
|
210
|
-
std::string result = GCanvasEngine::Instance().ExtendCallNative(contextId, args, type);
|
|
211
|
-
return MakeString(env, result);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
napi_value SetContextType(napi_env env, napi_callback_info info) {
|
|
215
|
-
size_t argc = 2;
|
|
216
|
-
napi_value argv[2] = {nullptr};
|
|
217
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
218
|
-
int32_t contextType = 0;
|
|
219
|
-
if (argc > 0) { napi_get_value_int32(env, argv[0], &contextType); }
|
|
220
|
-
std::string refId = NapiToString(env, argc > 1 ? argv[1] : nullptr);
|
|
221
|
-
GCanvasEngine::Instance().SetContextType(contextType, refId);
|
|
222
|
-
return nullptr;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
napi_value SetDevicePixelRatio(napi_env env, napi_callback_info info) {
|
|
226
|
-
size_t argc = 2;
|
|
227
|
-
napi_value argv[2] = {nullptr};
|
|
228
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
229
|
-
std::string refId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
230
|
-
double ratio = 1;
|
|
231
|
-
if (argc > 1) { napi_get_value_double(env, argv[1], &ratio); }
|
|
232
|
-
GCanvasEngine::Instance().SetDevicePixelRatio(refId, ratio);
|
|
233
|
-
return nullptr;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
napi_value ResetGlViewport(napi_env env, napi_callback_info info) {
|
|
237
|
-
size_t argc = 1;
|
|
238
|
-
napi_value argv[1] = {nullptr};
|
|
239
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
240
|
-
GCanvasEngine::Instance().ResetGlViewport(NapiToString(env, argv[0]));
|
|
241
|
-
return nullptr;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
napi_value ToDataURL(napi_env env, napi_callback_info info) {
|
|
245
|
-
size_t argc = 3;
|
|
246
|
-
napi_value argv[3] = {nullptr};
|
|
247
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
248
|
-
std::string refId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
249
|
-
std::string mime = NapiToString(env, argc > 1 ? argv[1] : nullptr);
|
|
250
|
-
double quality = 1;
|
|
251
|
-
if (argc > 2) { napi_get_value_double(env, argv[2], &quality); }
|
|
252
|
-
std::string result = GCanvasEngine::Instance().ToDataURL(refId, mime, quality);
|
|
253
|
-
return MakeString(env, result);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
napi_value DrawCanvas2Canvas(napi_env env, napi_callback_info info) {
|
|
257
|
-
size_t argc = 1;
|
|
258
|
-
napi_value argv[1] = {nullptr};
|
|
259
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
260
|
-
GCanvasEngine::Instance().DrawCanvas2Canvas(ParseDrawMap(env, argc > 0 ? argv[0] : nullptr));
|
|
261
|
-
return nullptr;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
napi_value BindImageTexture(napi_env env, napi_callback_info info) {
|
|
265
|
-
size_t argc = 5;
|
|
266
|
-
napi_value argv[5] = {nullptr};
|
|
267
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
268
|
-
std::string refId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
269
|
-
int32_t imageId = 0;
|
|
270
|
-
if (argc > 1) { napi_get_value_int32(env, argv[1], &imageId); }
|
|
271
|
-
size_t length = 0;
|
|
272
|
-
void *pixels = GetArrayBuffer(env, argc > 2 ? argv[2] : nullptr, &length);
|
|
273
|
-
int32_t width = 0, height = 0;
|
|
274
|
-
if (argc > 3) { napi_get_value_int32(env, argv[3], &width); }
|
|
275
|
-
if (argc > 4) { napi_get_value_int32(env, argv[4], &height); }
|
|
276
|
-
if (HasRgbaBytes(length, width, height)) {
|
|
277
|
-
GCanvasEngine::Instance().BindImageTexture(refId, imageId, pixels, width, height);
|
|
278
|
-
}
|
|
279
|
-
return nullptr;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
napi_value BindCachedImageTexture(napi_env env, napi_callback_info info) {
|
|
283
|
-
size_t argc = 2;
|
|
284
|
-
napi_value argv[2] = {nullptr};
|
|
285
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
286
|
-
const std::string refId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
287
|
-
int32_t imageId = 0;
|
|
288
|
-
if (argc > 1) { napi_get_value_int32(env, argv[1], &imageId); }
|
|
289
|
-
napi_value result = nullptr;
|
|
290
|
-
napi_get_boolean(env, GCanvasEngine::Instance().BindCachedImageTexture(refId, imageId), &result);
|
|
291
|
-
return result;
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
napi_value CacheImage(napi_env env, napi_callback_info info) {
|
|
295
|
-
size_t argc = 4;
|
|
296
|
-
napi_value argv[4] = {nullptr};
|
|
297
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
298
|
-
int32_t id = 0;
|
|
299
|
-
if (argc > 0) { napi_get_value_int32(env, argv[0], &id); }
|
|
300
|
-
size_t length = 0;
|
|
301
|
-
void *pixels = GetArrayBuffer(env, argc > 1 ? argv[1] : nullptr, &length);
|
|
302
|
-
int32_t width = 0, height = 0;
|
|
303
|
-
if (argc > 2) { napi_get_value_int32(env, argv[2], &width); }
|
|
304
|
-
if (argc > 3) { napi_get_value_int32(env, argv[3], &height); }
|
|
305
|
-
if (HasRgbaBytes(length, width, height)) {
|
|
306
|
-
GCanvasEngine::Instance().CacheImage(id, pixels, width, height);
|
|
307
|
-
}
|
|
308
|
-
return nullptr;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
napi_value GetDeviceInfo(napi_env env, napi_callback_info info) {
|
|
312
|
-
size_t argc = 1;
|
|
313
|
-
napi_value argv[1] = {nullptr};
|
|
314
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
315
|
-
std::string args = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
316
|
-
return MakeString(env, GCanvasEngine::Instance().GetDeviceInfo(args));
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
napi_value AddFontFamily(napi_env env, napi_callback_info info) {
|
|
320
|
-
size_t argc = 2;
|
|
321
|
-
napi_value argv[2] = {nullptr};
|
|
322
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
323
|
-
auto names = NapiToStringArray(env, argc > 0 ? argv[0] : nullptr);
|
|
324
|
-
auto files = NapiToStringArray(env, argc > 1 ? argv[1] : nullptr);
|
|
325
|
-
GCanvasEngine::Instance().AddFontFamily(names, files);
|
|
326
|
-
return nullptr;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
napi_value GetFontNames(napi_env env, napi_callback_info info) {
|
|
330
|
-
(void)info;
|
|
331
|
-
auto names = GCanvasEngine::Instance().GetFontNames();
|
|
332
|
-
napi_value result = nullptr;
|
|
333
|
-
napi_create_array_with_length(env, names.size(), &result);
|
|
334
|
-
for (size_t i = 0; i < names.size(); ++i) {
|
|
335
|
-
napi_set_element(env, result, static_cast<uint32_t>(i), MakeString(env, names[i]));
|
|
336
|
-
}
|
|
337
|
-
return result;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
napi_value SetExtraFontLocation(napi_env env, napi_callback_info info) {
|
|
341
|
-
size_t argc = 1;
|
|
342
|
-
napi_value argv[1] = {nullptr};
|
|
343
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
344
|
-
GCanvasEngine::Instance().SetExtraFontLocation(NapiToString(env, argv[0]));
|
|
345
|
-
return nullptr;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
napi_value SetLogLevel(napi_env env, napi_callback_info info) {
|
|
349
|
-
size_t argc = 1;
|
|
350
|
-
napi_value argv[1] = {nullptr};
|
|
351
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
352
|
-
int32_t level = 0;
|
|
353
|
-
if (argc > 0) { napi_get_value_int32(env, argv[0], &level); }
|
|
354
|
-
GCanvasEngine::Instance().SetLogLevel(level);
|
|
355
|
-
return nullptr;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
napi_value ResetComponent(napi_env env, napi_callback_info info) {
|
|
359
|
-
size_t argc = 1;
|
|
360
|
-
napi_value argv[1] = {nullptr};
|
|
361
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
362
|
-
GCanvasEngine::Instance().ResetComponent(NapiToString(env, argv[0]));
|
|
363
|
-
return nullptr;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
napi_value SurfaceChanged(napi_env env, napi_callback_info info) {
|
|
367
|
-
size_t argc = 3;
|
|
368
|
-
napi_value argv[3] = {nullptr};
|
|
369
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
370
|
-
const std::string componentId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
371
|
-
double width = 0;
|
|
372
|
-
double height = 0;
|
|
373
|
-
if (argc > 1) { napi_get_value_double(env, argv[1], &width); }
|
|
374
|
-
if (argc > 2) { napi_get_value_double(env, argv[2], &height); }
|
|
375
|
-
if (!componentId.empty() && width > 0 && height > 0) {
|
|
376
|
-
GCanvasEngine::Instance().OnSurfaceChanged(componentId, nullptr,
|
|
377
|
-
static_cast<uint64_t>(width),
|
|
378
|
-
static_cast<uint64_t>(height));
|
|
379
|
-
}
|
|
380
|
-
return nullptr;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
napi_value SurfaceDestroyed(napi_env env, napi_callback_info info) {
|
|
384
|
-
size_t argc = 1;
|
|
385
|
-
napi_value argv[1] = {nullptr};
|
|
386
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
387
|
-
const std::string componentId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
388
|
-
if (!componentId.empty()) {
|
|
389
|
-
GCanvasEngine::Instance().OnSurfaceDestroyed(componentId);
|
|
390
|
-
}
|
|
391
|
-
return nullptr;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
napi_value ConfigureView(napi_env env, napi_callback_info info) {
|
|
395
|
-
size_t argc = 2;
|
|
396
|
-
napi_value argv[2] = {nullptr};
|
|
397
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
398
|
-
const std::string refId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
399
|
-
bool enableFboMsaa = false;
|
|
400
|
-
if (argc > 1) { napi_get_value_bool(env, argv[1], &enableFboMsaa); }
|
|
401
|
-
GCanvasEngine::Instance().ConfigureView(refId, enableFboMsaa);
|
|
402
|
-
return nullptr;
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
napi_value TexImage2D(napi_env env, napi_callback_info info) {
|
|
406
|
-
size_t argc = 9;
|
|
407
|
-
napi_value argv[9] = {nullptr};
|
|
408
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
409
|
-
std::string refId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
410
|
-
int32_t target = 0, level = 0, internalformat = 0, format = 0, type = 0, width = 0, height = 0;
|
|
411
|
-
if (argc > 1) { napi_get_value_int32(env, argv[1], &target); }
|
|
412
|
-
if (argc > 2) { napi_get_value_int32(env, argv[2], &level); }
|
|
413
|
-
if (argc > 3) { napi_get_value_int32(env, argv[3], &internalformat); }
|
|
414
|
-
if (argc > 4) { napi_get_value_int32(env, argv[4], &format); }
|
|
415
|
-
if (argc > 5) { napi_get_value_int32(env, argv[5], &type); }
|
|
416
|
-
size_t length = 0;
|
|
417
|
-
void *pixels = GetArrayBuffer(env, argc > 6 ? argv[6] : nullptr, &length);
|
|
418
|
-
if (argc > 7) { napi_get_value_int32(env, argv[7], &width); }
|
|
419
|
-
if (argc > 8) { napi_get_value_int32(env, argv[8], &height); }
|
|
420
|
-
if (HasRgbaBytes(length, width, height)) {
|
|
421
|
-
GCanvasEngine::Instance().TexImage2D(refId, target, level, internalformat, format, type,
|
|
422
|
-
pixels, width, height);
|
|
423
|
-
}
|
|
424
|
-
return nullptr;
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
napi_value TexSubImage2D(napi_env env, napi_callback_info info) {
|
|
428
|
-
size_t argc = 10;
|
|
429
|
-
napi_value argv[10] = {nullptr};
|
|
430
|
-
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
431
|
-
std::string refId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
432
|
-
int32_t target = 0, level = 0, xoffset = 0, yoffset = 0, format = 0, type = 0, width = 0, height = 0;
|
|
433
|
-
if (argc > 1) { napi_get_value_int32(env, argv[1], &target); }
|
|
434
|
-
if (argc > 2) { napi_get_value_int32(env, argv[2], &level); }
|
|
435
|
-
if (argc > 3) { napi_get_value_int32(env, argv[3], &xoffset); }
|
|
436
|
-
if (argc > 4) { napi_get_value_int32(env, argv[4], &yoffset); }
|
|
437
|
-
if (argc > 5) { napi_get_value_int32(env, argv[5], &format); }
|
|
438
|
-
if (argc > 6) { napi_get_value_int32(env, argv[6], &type); }
|
|
439
|
-
size_t length = 0;
|
|
440
|
-
void *pixels = GetArrayBuffer(env, argc > 7 ? argv[7] : nullptr, &length);
|
|
441
|
-
if (argc > 8) { napi_get_value_int32(env, argv[8], &width); }
|
|
442
|
-
if (argc > 9) { napi_get_value_int32(env, argv[9], &height); }
|
|
443
|
-
if (HasRgbaBytes(length, width, height)) {
|
|
444
|
-
GCanvasEngine::Instance().TexSubImage2D(refId, target, level, xoffset, yoffset, format, type,
|
|
445
|
-
pixels, width, height);
|
|
446
|
-
}
|
|
447
|
-
return nullptr;
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
napi_value InitExports(napi_env env, napi_value exports) {
|
|
451
|
-
NAPI_EXPORT("bindSurface", CreateFunction(env, BindSurface));
|
|
452
|
-
NAPI_EXPORT("surfaceChanged", CreateFunction(env, SurfaceChanged));
|
|
453
|
-
NAPI_EXPORT("surfaceDestroyed", CreateFunction(env, SurfaceDestroyed));
|
|
454
|
-
NAPI_EXPORT("configureView", CreateFunction(env, ConfigureView));
|
|
455
|
-
NAPI_EXPORT("enable", CreateFunction(env, Enable));
|
|
456
|
-
NAPI_EXPORT("disable", CreateFunction(env, Disable));
|
|
457
|
-
NAPI_EXPORT("render", CreateFunction(env, Render));
|
|
458
|
-
NAPI_EXPORT("extendCallNative", CreateFunction(env, ExtendCallNative));
|
|
459
|
-
NAPI_EXPORT("setContextType", CreateFunction(env, SetContextType));
|
|
460
|
-
NAPI_EXPORT("setDevicePixelRatio", CreateFunction(env, SetDevicePixelRatio));
|
|
461
|
-
NAPI_EXPORT("resetGlViewport", CreateFunction(env, ResetGlViewport));
|
|
462
|
-
NAPI_EXPORT("toDataURL", CreateFunction(env, ToDataURL));
|
|
463
|
-
NAPI_EXPORT("drawCanvas2Canvas", CreateFunction(env, DrawCanvas2Canvas));
|
|
464
|
-
NAPI_EXPORT("bindImageTexture", CreateFunction(env, BindImageTexture));
|
|
465
|
-
NAPI_EXPORT("bindCachedImageTexture", CreateFunction(env, BindCachedImageTexture));
|
|
466
|
-
NAPI_EXPORT("cacheImage", CreateFunction(env, CacheImage));
|
|
467
|
-
NAPI_EXPORT("getDeviceInfo", CreateFunction(env, GetDeviceInfo));
|
|
468
|
-
NAPI_EXPORT("addFontFamily", CreateFunction(env, AddFontFamily));
|
|
469
|
-
NAPI_EXPORT("getFontNames", CreateFunction(env, GetFontNames));
|
|
470
|
-
NAPI_EXPORT("setExtraFontLocation", CreateFunction(env, SetExtraFontLocation));
|
|
471
|
-
NAPI_EXPORT("setLogLevel", CreateFunction(env, SetLogLevel));
|
|
472
|
-
NAPI_EXPORT("resetComponent", CreateFunction(env, ResetComponent));
|
|
473
|
-
NAPI_EXPORT("texImage2D", CreateFunction(env, TexImage2D));
|
|
474
|
-
NAPI_EXPORT("texSubImage2D", CreateFunction(env, TexSubImage2D));
|
|
475
|
-
return exports;
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
} // namespace
|
|
479
|
-
|
|
480
|
-
// 由 GCanvasXComponent.cpp 的 Init() 调用,统一在 'gcanvas' napi_module 的 exports 上注册
|
|
481
|
-
// 全部 ArkTS 可调函数。XComponent 回调注册与 NAPI 函数导出共用同一 .so / 同一模块。
|
|
482
|
-
extern "C" napi_value GCanvasNapi_Init(napi_env env, napi_value exports) {
|
|
483
|
-
GC_LOGI("GCanvasNapi_Init registered enable/render/extendCallNative");
|
|
484
|
-
return InitExports(env, exports);
|
|
485
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* GCanvasNapi — 把 C++ GCanvasEngine 以 NAPI 模块 'libgcanvas.so' 暴露给 ArkTS。
|
|
3
|
+
*
|
|
4
|
+
* ArkTS 侧 `import nativeModule from 'libgcanvas.so'`(GCanvasNativeEngine.ts)调用本模块
|
|
5
|
+
* 导出的函数。模块名 gcanvas 与 XComponent libraryname 一致,故本 .so 同时承担:
|
|
6
|
+
* 1. XComponent native window 回调(GCanvasXComponent.cpp 的 RegisterGCanvasModule);
|
|
7
|
+
* 2. ArkTS 可调用的命令/字体/纹理 NAPI 函数(本文件)。
|
|
8
|
+
*
|
|
9
|
+
* 注意:ArkTS NAPI 互操作中,对象字面量(如 enable 的 args: {componentId, config})经
|
|
10
|
+
* napi_value 传入,此处逐一取出字段。ArrayBuffer(像素缓冲)经 napi_get_arraybuffer_info 取指针。
|
|
11
|
+
*/
|
|
12
|
+
#include "GCanvasEngine.h"
|
|
13
|
+
|
|
14
|
+
#include <hilog/log.h>
|
|
15
|
+
#include <napi/native_api.h>
|
|
16
|
+
|
|
17
|
+
#include <cstdint>
|
|
18
|
+
#include <limits>
|
|
19
|
+
#include <string>
|
|
20
|
+
#include <vector>
|
|
21
|
+
|
|
22
|
+
#define GC_LOGI(...) OH_LOG_INFO(LOG_APP, __VA_ARGS__)
|
|
23
|
+
#define GC_LOGE(...) OH_LOG_ERROR(LOG_APP, __VA_ARGS__)
|
|
24
|
+
|
|
25
|
+
namespace {
|
|
26
|
+
|
|
27
|
+
using namespace gcanvas;
|
|
28
|
+
|
|
29
|
+
std::string NapiToString(napi_env env, napi_value value) {
|
|
30
|
+
if (value == nullptr) {
|
|
31
|
+
return "";
|
|
32
|
+
}
|
|
33
|
+
size_t len = 0;
|
|
34
|
+
if (napi_get_value_string_utf8(env, value, nullptr, 0, &len) != napi_ok) {
|
|
35
|
+
return "";
|
|
36
|
+
}
|
|
37
|
+
std::vector<char> buffer(len + 1U, '\0');
|
|
38
|
+
if (napi_get_value_string_utf8(env, value, buffer.data(), buffer.size(), &len) != napi_ok) {
|
|
39
|
+
return "";
|
|
40
|
+
}
|
|
41
|
+
return std::string(buffer.data(), len);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
std::vector<double> NapiToDoubleArray(napi_env env, napi_value configValue) {
|
|
45
|
+
std::vector<double> config;
|
|
46
|
+
if (configValue == nullptr) {
|
|
47
|
+
return config;
|
|
48
|
+
}
|
|
49
|
+
uint32_t length = 0;
|
|
50
|
+
if (napi_get_array_length(env, configValue, &length) != napi_ok) {
|
|
51
|
+
return config;
|
|
52
|
+
}
|
|
53
|
+
config.reserve(length);
|
|
54
|
+
for (uint32_t i = 0; i < length; ++i) {
|
|
55
|
+
napi_value elem = nullptr;
|
|
56
|
+
napi_get_element(env, configValue, i, &elem);
|
|
57
|
+
double v = 0;
|
|
58
|
+
if (napi_get_value_double(env, elem, &v) == napi_ok) {
|
|
59
|
+
config.push_back(v);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return config;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
int32_t GetNamedInt32(napi_env env, napi_value object, const char *name) {
|
|
66
|
+
napi_value value = nullptr;
|
|
67
|
+
int32_t result = 0;
|
|
68
|
+
if (object != nullptr && napi_get_named_property(env, object, name, &value) == napi_ok) {
|
|
69
|
+
napi_get_value_int32(env, value, &result);
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
std::string GetNamedString(napi_env env, napi_value object, const char *name) {
|
|
75
|
+
napi_value value = nullptr;
|
|
76
|
+
if (object == nullptr || napi_get_named_property(env, object, name, &value) != napi_ok) {
|
|
77
|
+
return "";
|
|
78
|
+
}
|
|
79
|
+
return NapiToString(env, value);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
DrawCanvas2CanvasArgs ParseDrawMap(napi_env env, napi_value mapValue) {
|
|
83
|
+
DrawCanvas2CanvasArgs result;
|
|
84
|
+
result.srcComponentId = GetNamedString(env, mapValue, "srcComponentId");
|
|
85
|
+
result.dstComponentId = GetNamedString(env, mapValue, "dstComponentId");
|
|
86
|
+
result.tw = GetNamedInt32(env, mapValue, "tw");
|
|
87
|
+
result.th = GetNamedInt32(env, mapValue, "th");
|
|
88
|
+
result.sx = GetNamedInt32(env, mapValue, "sx");
|
|
89
|
+
result.sy = GetNamedInt32(env, mapValue, "sy");
|
|
90
|
+
result.sw = GetNamedInt32(env, mapValue, "sw");
|
|
91
|
+
result.sh = GetNamedInt32(env, mapValue, "sh");
|
|
92
|
+
result.dx = GetNamedInt32(env, mapValue, "dx");
|
|
93
|
+
result.dy = GetNamedInt32(env, mapValue, "dy");
|
|
94
|
+
result.dw = GetNamedInt32(env, mapValue, "dw");
|
|
95
|
+
result.dh = GetNamedInt32(env, mapValue, "dh");
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
std::vector<std::string> NapiToStringArray(napi_env env, napi_value value) {
|
|
100
|
+
std::vector<std::string> result;
|
|
101
|
+
if (value == nullptr) {
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
uint32_t length = 0;
|
|
105
|
+
napi_get_array_length(env, value, &length);
|
|
106
|
+
for (uint32_t i = 0; i < length; ++i) {
|
|
107
|
+
napi_value elem = nullptr;
|
|
108
|
+
napi_get_element(env, value, i, &elem);
|
|
109
|
+
result.push_back(NapiToString(env, elem));
|
|
110
|
+
}
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
napi_value MakeString(napi_env env, const std::string &str) {
|
|
115
|
+
napi_value result = nullptr;
|
|
116
|
+
napi_create_string_utf8(env, str.c_str(), str.length(), &result);
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
using NapiCb = napi_value (*)(napi_env, napi_callback_info);
|
|
121
|
+
|
|
122
|
+
napi_value CreateFunction(napi_env env, NapiCb cb) {
|
|
123
|
+
napi_value fn = nullptr;
|
|
124
|
+
napi_create_function(env, "fn", NAPI_AUTO_LENGTH, cb, nullptr, &fn);
|
|
125
|
+
return fn;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
void *GetArrayBuffer(napi_env env, napi_value value, size_t *length) {
|
|
129
|
+
void *data = nullptr;
|
|
130
|
+
*length = 0;
|
|
131
|
+
bool isArrayBuffer = false;
|
|
132
|
+
napi_is_arraybuffer(env, value, &isArrayBuffer);
|
|
133
|
+
if (!isArrayBuffer) {
|
|
134
|
+
return nullptr;
|
|
135
|
+
}
|
|
136
|
+
napi_get_arraybuffer_info(env, value, &data, length);
|
|
137
|
+
return data;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
bool HasRgbaBytes(size_t actualLength, int32_t width, int32_t height) {
|
|
141
|
+
if (width <= 0 || height <= 0) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
const size_t w = static_cast<size_t>(width);
|
|
145
|
+
const size_t h = static_cast<size_t>(height);
|
|
146
|
+
return w <= std::numeric_limits<size_t>::max() / h &&
|
|
147
|
+
w * h <= std::numeric_limits<size_t>::max() / 4U && actualLength >= w * h * 4U;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
#define NAPI_EXPORT(name, fn) napi_set_named_property(env, exports, name, fn)
|
|
151
|
+
|
|
152
|
+
napi_value BindSurface(napi_env env, napi_callback_info info) {
|
|
153
|
+
size_t argc = 4;
|
|
154
|
+
napi_value args[4] = {nullptr};
|
|
155
|
+
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
|
|
156
|
+
std::string componentId = NapiToString(env, argc > 0 ? args[0] : nullptr);
|
|
157
|
+
int64_t window = 0;
|
|
158
|
+
if (argc > 1) {
|
|
159
|
+
napi_get_value_int64(env, args[1], &window);
|
|
160
|
+
}
|
|
161
|
+
double w = 0, h = 0;
|
|
162
|
+
if (argc > 2) { napi_get_value_double(env, args[2], &w); }
|
|
163
|
+
if (argc > 3) { napi_get_value_double(env, args[3], &h); }
|
|
164
|
+
if (!componentId.empty() && window != 0 && w > 0 && h > 0) {
|
|
165
|
+
GCanvasEngine::Instance().OnSurfaceCreated(
|
|
166
|
+
componentId, reinterpret_cast<void *>(static_cast<uintptr_t>(window)),
|
|
167
|
+
static_cast<uint64_t>(w), static_cast<uint64_t>(h));
|
|
168
|
+
}
|
|
169
|
+
return nullptr;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
napi_value Enable(napi_env env, napi_callback_info info) {
|
|
173
|
+
size_t argc = 2;
|
|
174
|
+
napi_value args[2] = {nullptr};
|
|
175
|
+
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
|
|
176
|
+
const std::string componentId = NapiToString(env, argc > 0 ? args[0] : nullptr);
|
|
177
|
+
const std::vector<double> config = NapiToDoubleArray(env, argc > 1 ? args[1] : nullptr);
|
|
178
|
+
GCanvasEngine::Instance().Enable(componentId, config);
|
|
179
|
+
return nullptr;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
napi_value Disable(napi_env env, napi_callback_info info) {
|
|
183
|
+
size_t argc = 1;
|
|
184
|
+
napi_value argv[1] = {nullptr};
|
|
185
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
186
|
+
GCanvasEngine::Instance().Disable(NapiToString(env, argv[0]));
|
|
187
|
+
return nullptr;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
napi_value Render(napi_env env, napi_callback_info info) {
|
|
191
|
+
size_t argc = 3;
|
|
192
|
+
napi_value argv[3] = {nullptr};
|
|
193
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
194
|
+
std::string canvasId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
195
|
+
std::string cmd = NapiToString(env, argc > 1 ? argv[1] : nullptr);
|
|
196
|
+
int32_t type = 0;
|
|
197
|
+
if (argc > 2) { napi_get_value_int32(env, argv[2], &type); }
|
|
198
|
+
GCanvasEngine::Instance().Render(canvasId, cmd, type);
|
|
199
|
+
return nullptr;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
napi_value ExtendCallNative(napi_env env, napi_callback_info info) {
|
|
203
|
+
size_t argc = 3;
|
|
204
|
+
napi_value argv[3] = {nullptr};
|
|
205
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
206
|
+
const std::string contextId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
207
|
+
const std::string args = NapiToString(env, argc > 1 ? argv[1] : nullptr);
|
|
208
|
+
int32_t type = 0;
|
|
209
|
+
if (argc > 2) { napi_get_value_int32(env, argv[2], &type); }
|
|
210
|
+
std::string result = GCanvasEngine::Instance().ExtendCallNative(contextId, args, type);
|
|
211
|
+
return MakeString(env, result);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
napi_value SetContextType(napi_env env, napi_callback_info info) {
|
|
215
|
+
size_t argc = 2;
|
|
216
|
+
napi_value argv[2] = {nullptr};
|
|
217
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
218
|
+
int32_t contextType = 0;
|
|
219
|
+
if (argc > 0) { napi_get_value_int32(env, argv[0], &contextType); }
|
|
220
|
+
std::string refId = NapiToString(env, argc > 1 ? argv[1] : nullptr);
|
|
221
|
+
GCanvasEngine::Instance().SetContextType(contextType, refId);
|
|
222
|
+
return nullptr;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
napi_value SetDevicePixelRatio(napi_env env, napi_callback_info info) {
|
|
226
|
+
size_t argc = 2;
|
|
227
|
+
napi_value argv[2] = {nullptr};
|
|
228
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
229
|
+
std::string refId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
230
|
+
double ratio = 1;
|
|
231
|
+
if (argc > 1) { napi_get_value_double(env, argv[1], &ratio); }
|
|
232
|
+
GCanvasEngine::Instance().SetDevicePixelRatio(refId, ratio);
|
|
233
|
+
return nullptr;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
napi_value ResetGlViewport(napi_env env, napi_callback_info info) {
|
|
237
|
+
size_t argc = 1;
|
|
238
|
+
napi_value argv[1] = {nullptr};
|
|
239
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
240
|
+
GCanvasEngine::Instance().ResetGlViewport(NapiToString(env, argv[0]));
|
|
241
|
+
return nullptr;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
napi_value ToDataURL(napi_env env, napi_callback_info info) {
|
|
245
|
+
size_t argc = 3;
|
|
246
|
+
napi_value argv[3] = {nullptr};
|
|
247
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
248
|
+
std::string refId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
249
|
+
std::string mime = NapiToString(env, argc > 1 ? argv[1] : nullptr);
|
|
250
|
+
double quality = 1;
|
|
251
|
+
if (argc > 2) { napi_get_value_double(env, argv[2], &quality); }
|
|
252
|
+
std::string result = GCanvasEngine::Instance().ToDataURL(refId, mime, quality);
|
|
253
|
+
return MakeString(env, result);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
napi_value DrawCanvas2Canvas(napi_env env, napi_callback_info info) {
|
|
257
|
+
size_t argc = 1;
|
|
258
|
+
napi_value argv[1] = {nullptr};
|
|
259
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
260
|
+
GCanvasEngine::Instance().DrawCanvas2Canvas(ParseDrawMap(env, argc > 0 ? argv[0] : nullptr));
|
|
261
|
+
return nullptr;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
napi_value BindImageTexture(napi_env env, napi_callback_info info) {
|
|
265
|
+
size_t argc = 5;
|
|
266
|
+
napi_value argv[5] = {nullptr};
|
|
267
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
268
|
+
std::string refId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
269
|
+
int32_t imageId = 0;
|
|
270
|
+
if (argc > 1) { napi_get_value_int32(env, argv[1], &imageId); }
|
|
271
|
+
size_t length = 0;
|
|
272
|
+
void *pixels = GetArrayBuffer(env, argc > 2 ? argv[2] : nullptr, &length);
|
|
273
|
+
int32_t width = 0, height = 0;
|
|
274
|
+
if (argc > 3) { napi_get_value_int32(env, argv[3], &width); }
|
|
275
|
+
if (argc > 4) { napi_get_value_int32(env, argv[4], &height); }
|
|
276
|
+
if (HasRgbaBytes(length, width, height)) {
|
|
277
|
+
GCanvasEngine::Instance().BindImageTexture(refId, imageId, pixels, width, height);
|
|
278
|
+
}
|
|
279
|
+
return nullptr;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
napi_value BindCachedImageTexture(napi_env env, napi_callback_info info) {
|
|
283
|
+
size_t argc = 2;
|
|
284
|
+
napi_value argv[2] = {nullptr};
|
|
285
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
286
|
+
const std::string refId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
287
|
+
int32_t imageId = 0;
|
|
288
|
+
if (argc > 1) { napi_get_value_int32(env, argv[1], &imageId); }
|
|
289
|
+
napi_value result = nullptr;
|
|
290
|
+
napi_get_boolean(env, GCanvasEngine::Instance().BindCachedImageTexture(refId, imageId), &result);
|
|
291
|
+
return result;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
napi_value CacheImage(napi_env env, napi_callback_info info) {
|
|
295
|
+
size_t argc = 4;
|
|
296
|
+
napi_value argv[4] = {nullptr};
|
|
297
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
298
|
+
int32_t id = 0;
|
|
299
|
+
if (argc > 0) { napi_get_value_int32(env, argv[0], &id); }
|
|
300
|
+
size_t length = 0;
|
|
301
|
+
void *pixels = GetArrayBuffer(env, argc > 1 ? argv[1] : nullptr, &length);
|
|
302
|
+
int32_t width = 0, height = 0;
|
|
303
|
+
if (argc > 2) { napi_get_value_int32(env, argv[2], &width); }
|
|
304
|
+
if (argc > 3) { napi_get_value_int32(env, argv[3], &height); }
|
|
305
|
+
if (HasRgbaBytes(length, width, height)) {
|
|
306
|
+
GCanvasEngine::Instance().CacheImage(id, pixels, width, height);
|
|
307
|
+
}
|
|
308
|
+
return nullptr;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
napi_value GetDeviceInfo(napi_env env, napi_callback_info info) {
|
|
312
|
+
size_t argc = 1;
|
|
313
|
+
napi_value argv[1] = {nullptr};
|
|
314
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
315
|
+
std::string args = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
316
|
+
return MakeString(env, GCanvasEngine::Instance().GetDeviceInfo(args));
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
napi_value AddFontFamily(napi_env env, napi_callback_info info) {
|
|
320
|
+
size_t argc = 2;
|
|
321
|
+
napi_value argv[2] = {nullptr};
|
|
322
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
323
|
+
auto names = NapiToStringArray(env, argc > 0 ? argv[0] : nullptr);
|
|
324
|
+
auto files = NapiToStringArray(env, argc > 1 ? argv[1] : nullptr);
|
|
325
|
+
GCanvasEngine::Instance().AddFontFamily(names, files);
|
|
326
|
+
return nullptr;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
napi_value GetFontNames(napi_env env, napi_callback_info info) {
|
|
330
|
+
(void)info;
|
|
331
|
+
auto names = GCanvasEngine::Instance().GetFontNames();
|
|
332
|
+
napi_value result = nullptr;
|
|
333
|
+
napi_create_array_with_length(env, names.size(), &result);
|
|
334
|
+
for (size_t i = 0; i < names.size(); ++i) {
|
|
335
|
+
napi_set_element(env, result, static_cast<uint32_t>(i), MakeString(env, names[i]));
|
|
336
|
+
}
|
|
337
|
+
return result;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
napi_value SetExtraFontLocation(napi_env env, napi_callback_info info) {
|
|
341
|
+
size_t argc = 1;
|
|
342
|
+
napi_value argv[1] = {nullptr};
|
|
343
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
344
|
+
GCanvasEngine::Instance().SetExtraFontLocation(NapiToString(env, argv[0]));
|
|
345
|
+
return nullptr;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
napi_value SetLogLevel(napi_env env, napi_callback_info info) {
|
|
349
|
+
size_t argc = 1;
|
|
350
|
+
napi_value argv[1] = {nullptr};
|
|
351
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
352
|
+
int32_t level = 0;
|
|
353
|
+
if (argc > 0) { napi_get_value_int32(env, argv[0], &level); }
|
|
354
|
+
GCanvasEngine::Instance().SetLogLevel(level);
|
|
355
|
+
return nullptr;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
napi_value ResetComponent(napi_env env, napi_callback_info info) {
|
|
359
|
+
size_t argc = 1;
|
|
360
|
+
napi_value argv[1] = {nullptr};
|
|
361
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
362
|
+
GCanvasEngine::Instance().ResetComponent(NapiToString(env, argv[0]));
|
|
363
|
+
return nullptr;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
napi_value SurfaceChanged(napi_env env, napi_callback_info info) {
|
|
367
|
+
size_t argc = 3;
|
|
368
|
+
napi_value argv[3] = {nullptr};
|
|
369
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
370
|
+
const std::string componentId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
371
|
+
double width = 0;
|
|
372
|
+
double height = 0;
|
|
373
|
+
if (argc > 1) { napi_get_value_double(env, argv[1], &width); }
|
|
374
|
+
if (argc > 2) { napi_get_value_double(env, argv[2], &height); }
|
|
375
|
+
if (!componentId.empty() && width > 0 && height > 0) {
|
|
376
|
+
GCanvasEngine::Instance().OnSurfaceChanged(componentId, nullptr,
|
|
377
|
+
static_cast<uint64_t>(width),
|
|
378
|
+
static_cast<uint64_t>(height));
|
|
379
|
+
}
|
|
380
|
+
return nullptr;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
napi_value SurfaceDestroyed(napi_env env, napi_callback_info info) {
|
|
384
|
+
size_t argc = 1;
|
|
385
|
+
napi_value argv[1] = {nullptr};
|
|
386
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
387
|
+
const std::string componentId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
388
|
+
if (!componentId.empty()) {
|
|
389
|
+
GCanvasEngine::Instance().OnSurfaceDestroyed(componentId);
|
|
390
|
+
}
|
|
391
|
+
return nullptr;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
napi_value ConfigureView(napi_env env, napi_callback_info info) {
|
|
395
|
+
size_t argc = 2;
|
|
396
|
+
napi_value argv[2] = {nullptr};
|
|
397
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
398
|
+
const std::string refId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
399
|
+
bool enableFboMsaa = false;
|
|
400
|
+
if (argc > 1) { napi_get_value_bool(env, argv[1], &enableFboMsaa); }
|
|
401
|
+
GCanvasEngine::Instance().ConfigureView(refId, enableFboMsaa);
|
|
402
|
+
return nullptr;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
napi_value TexImage2D(napi_env env, napi_callback_info info) {
|
|
406
|
+
size_t argc = 9;
|
|
407
|
+
napi_value argv[9] = {nullptr};
|
|
408
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
409
|
+
std::string refId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
410
|
+
int32_t target = 0, level = 0, internalformat = 0, format = 0, type = 0, width = 0, height = 0;
|
|
411
|
+
if (argc > 1) { napi_get_value_int32(env, argv[1], &target); }
|
|
412
|
+
if (argc > 2) { napi_get_value_int32(env, argv[2], &level); }
|
|
413
|
+
if (argc > 3) { napi_get_value_int32(env, argv[3], &internalformat); }
|
|
414
|
+
if (argc > 4) { napi_get_value_int32(env, argv[4], &format); }
|
|
415
|
+
if (argc > 5) { napi_get_value_int32(env, argv[5], &type); }
|
|
416
|
+
size_t length = 0;
|
|
417
|
+
void *pixels = GetArrayBuffer(env, argc > 6 ? argv[6] : nullptr, &length);
|
|
418
|
+
if (argc > 7) { napi_get_value_int32(env, argv[7], &width); }
|
|
419
|
+
if (argc > 8) { napi_get_value_int32(env, argv[8], &height); }
|
|
420
|
+
if (HasRgbaBytes(length, width, height)) {
|
|
421
|
+
GCanvasEngine::Instance().TexImage2D(refId, target, level, internalformat, format, type,
|
|
422
|
+
pixels, width, height);
|
|
423
|
+
}
|
|
424
|
+
return nullptr;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
napi_value TexSubImage2D(napi_env env, napi_callback_info info) {
|
|
428
|
+
size_t argc = 10;
|
|
429
|
+
napi_value argv[10] = {nullptr};
|
|
430
|
+
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
|
|
431
|
+
std::string refId = NapiToString(env, argc > 0 ? argv[0] : nullptr);
|
|
432
|
+
int32_t target = 0, level = 0, xoffset = 0, yoffset = 0, format = 0, type = 0, width = 0, height = 0;
|
|
433
|
+
if (argc > 1) { napi_get_value_int32(env, argv[1], &target); }
|
|
434
|
+
if (argc > 2) { napi_get_value_int32(env, argv[2], &level); }
|
|
435
|
+
if (argc > 3) { napi_get_value_int32(env, argv[3], &xoffset); }
|
|
436
|
+
if (argc > 4) { napi_get_value_int32(env, argv[4], &yoffset); }
|
|
437
|
+
if (argc > 5) { napi_get_value_int32(env, argv[5], &format); }
|
|
438
|
+
if (argc > 6) { napi_get_value_int32(env, argv[6], &type); }
|
|
439
|
+
size_t length = 0;
|
|
440
|
+
void *pixels = GetArrayBuffer(env, argc > 7 ? argv[7] : nullptr, &length);
|
|
441
|
+
if (argc > 8) { napi_get_value_int32(env, argv[8], &width); }
|
|
442
|
+
if (argc > 9) { napi_get_value_int32(env, argv[9], &height); }
|
|
443
|
+
if (HasRgbaBytes(length, width, height)) {
|
|
444
|
+
GCanvasEngine::Instance().TexSubImage2D(refId, target, level, xoffset, yoffset, format, type,
|
|
445
|
+
pixels, width, height);
|
|
446
|
+
}
|
|
447
|
+
return nullptr;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
napi_value InitExports(napi_env env, napi_value exports) {
|
|
451
|
+
NAPI_EXPORT("bindSurface", CreateFunction(env, BindSurface));
|
|
452
|
+
NAPI_EXPORT("surfaceChanged", CreateFunction(env, SurfaceChanged));
|
|
453
|
+
NAPI_EXPORT("surfaceDestroyed", CreateFunction(env, SurfaceDestroyed));
|
|
454
|
+
NAPI_EXPORT("configureView", CreateFunction(env, ConfigureView));
|
|
455
|
+
NAPI_EXPORT("enable", CreateFunction(env, Enable));
|
|
456
|
+
NAPI_EXPORT("disable", CreateFunction(env, Disable));
|
|
457
|
+
NAPI_EXPORT("render", CreateFunction(env, Render));
|
|
458
|
+
NAPI_EXPORT("extendCallNative", CreateFunction(env, ExtendCallNative));
|
|
459
|
+
NAPI_EXPORT("setContextType", CreateFunction(env, SetContextType));
|
|
460
|
+
NAPI_EXPORT("setDevicePixelRatio", CreateFunction(env, SetDevicePixelRatio));
|
|
461
|
+
NAPI_EXPORT("resetGlViewport", CreateFunction(env, ResetGlViewport));
|
|
462
|
+
NAPI_EXPORT("toDataURL", CreateFunction(env, ToDataURL));
|
|
463
|
+
NAPI_EXPORT("drawCanvas2Canvas", CreateFunction(env, DrawCanvas2Canvas));
|
|
464
|
+
NAPI_EXPORT("bindImageTexture", CreateFunction(env, BindImageTexture));
|
|
465
|
+
NAPI_EXPORT("bindCachedImageTexture", CreateFunction(env, BindCachedImageTexture));
|
|
466
|
+
NAPI_EXPORT("cacheImage", CreateFunction(env, CacheImage));
|
|
467
|
+
NAPI_EXPORT("getDeviceInfo", CreateFunction(env, GetDeviceInfo));
|
|
468
|
+
NAPI_EXPORT("addFontFamily", CreateFunction(env, AddFontFamily));
|
|
469
|
+
NAPI_EXPORT("getFontNames", CreateFunction(env, GetFontNames));
|
|
470
|
+
NAPI_EXPORT("setExtraFontLocation", CreateFunction(env, SetExtraFontLocation));
|
|
471
|
+
NAPI_EXPORT("setLogLevel", CreateFunction(env, SetLogLevel));
|
|
472
|
+
NAPI_EXPORT("resetComponent", CreateFunction(env, ResetComponent));
|
|
473
|
+
NAPI_EXPORT("texImage2D", CreateFunction(env, TexImage2D));
|
|
474
|
+
NAPI_EXPORT("texSubImage2D", CreateFunction(env, TexSubImage2D));
|
|
475
|
+
return exports;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
} // namespace
|
|
479
|
+
|
|
480
|
+
// 由 GCanvasXComponent.cpp 的 Init() 调用,统一在 'gcanvas' napi_module 的 exports 上注册
|
|
481
|
+
// 全部 ArkTS 可调函数。XComponent 回调注册与 NAPI 函数导出共用同一 .so / 同一模块。
|
|
482
|
+
extern "C" napi_value GCanvasNapi_Init(napi_env env, napi_value exports) {
|
|
483
|
+
GC_LOGI("GCanvasNapi_Init registered enable/render/extendCallNative");
|
|
484
|
+
return InitExports(env, exports);
|
|
485
|
+
}
|