1/* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16// 17// Created on 2024/8/6. 18// 19// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found, 20// please include "napi/native_api.h". 21#include "napi/native_api.h" 22#include <IPCKit/ipc_cparcel.h> 23#include <bits/alltypes.h> 24#include <GLES2/gl2.h> 25#include <multimedia/player_framework/native_avcodec_base.h> 26#include <native_image/native_image.h> 27#include <native_window/external_window.h> 28#include <native_buffer/native_buffer.h> 29 30 31#define SUCCESS 0 32#define FAIL (-1) 33 34#define CONSTANT_0 0 35#define CONSTANT_1 1 36#define CONSTANT_2 2 37#define CONSTANT_3 3 38#define CONSTANT_4 4 39#define CONSTANT_5 5 40#define CONSTANT_6 6 41#define CONSTANT_7 7 42#define CONSTANT_8 8 43 44#define CONSTANT_500 500 45#define CONSTANT_1000 1000 46#define CONSTANT_10000 10000 47 48#define CONSTANT_40001000 40001000 49#define CONSTANT_41207000 41207000 50#define CONSTANT_41208000 41208000 51#define CONSTANT_41210000 41210000 52 53#define CONSTANT_50002000 50002000 54#define CONSTANT_50102000 50102000 55 56#define CONSTANT_999999999 999999999 57#define CONSTANT_9999999999999999999 9999999999999999999 58 59struct result { 60 OH_NativeImage *image; 61 OHNativeWindow *nativeWindow; 62 int32_t width_; 63 int32_t height_; 64}; 65 66static result InitNativeWindow() 67{ 68 struct result result1; 69 GLuint textureId; 70 glGenTextures(1, &textureId); 71 auto _image = OH_NativeImage_Create(textureId, GL_TEXTURE_2D); 72 result1.image = _image; 73 OHNativeWindow *_nativeWindow = OH_NativeImage_AcquireNativeWindow(_image); 74 result1.nativeWindow = _nativeWindow; 75 int code = SET_BUFFER_GEOMETRY; 76 result1.width_ = 0x100; 77 result1.height_ = 0x100; 78 int32_t ret = OH_NativeWindow_NativeWindowHandleOpt(_nativeWindow, code, result1.width_, result1.height_); 79 code = SET_USAGE; 80 int32_t usage = NATIVEBUFFER_USAGE_CPU_READ | NATIVEBUFFER_USAGE_CPU_WRITE | NATIVEBUFFER_USAGE_MEM_DMA; 81 ret = OH_NativeWindow_NativeWindowHandleOpt(_nativeWindow, code, usage); 82 return result1; 83} 84 85static void DestroyNativeWindowImage(OH_NativeImage *image, OHNativeWindow *window) 86{ 87 OH_NativeImage_Destroy(&image); 88 OH_NativeWindow_DestroyNativeWindow(window); 89} 90 91napi_value testNativeWindowCreateNativeWindowNullptr(napi_env env, napi_callback_info info) 92{ 93 napi_value result = nullptr; 94 auto p = OH_NativeWindow_CreateNativeWindow(nullptr); 95 if (p == nullptr) { 96 napi_create_int32(env, SUCCESS, &result); 97 } else { 98 napi_create_int32(env, FAIL, &result); 99 } 100 return result; 101} 102 103napi_value testNativeWindowDestroyNativeWindowNullptr(napi_env env, napi_callback_info info) 104{ 105 napi_value result = nullptr; 106 OH_NativeWindow_DestroyNativeWindow(nullptr); 107 napi_create_int32(env, SUCCESS, &result); 108 return result; 109} 110 111napi_value testNativeWindowGetSurfaceIdNullptr(napi_env env, napi_callback_info info) 112{ 113 napi_value result = nullptr; 114 auto r = OH_NativeWindow_GetSurfaceId(nullptr, 0); 115 if (CONSTANT_40001000 == r) { 116 napi_create_int32(env, SUCCESS, &result); 117 } else { 118 napi_create_int32(env, FAIL, &result); 119 } 120 return result; 121} 122 123 124napi_value testNativeWindowCreateNativeWindowFromSurfaceIdNullptr(napi_env env, napi_callback_info info) 125{ 126 napi_value result = nullptr; 127 128 // 设置OH_NativeWindow_CreateNativeWindowFromSurfaceId()的surfaceId=nullptr,其他参数正常调用该接口 129 OHNativeWindow *nativeWindow = nullptr; 130 auto flag = OH_NativeWindow_CreateNativeWindowFromSurfaceId(0, &nativeWindow); 131 if (flag != CONSTANT_40001000) { 132 napi_create_int32(env, 1, &result); 133 return result; 134 } 135 136 GLuint textureId; 137 glGenTextures(1, &textureId); 138 auto _image = OH_NativeImage_Create(textureId, GL_TEXTURE_2D); 139 auto _nativeWindow = OH_NativeImage_AcquireNativeWindow(_image); 140 uint64_t surfaceId; 141 OH_NativeWindow_GetSurfaceId(_nativeWindow, &surfaceId); 142 // 设置OH_NativeWindow_CreateNativeWindowFromSurfaceId()的window=nullptr,,其他参数正常调用该接口 143 flag = OH_NativeWindow_CreateNativeWindowFromSurfaceId(surfaceId, nullptr); 144 if (flag != CONSTANT_40001000) { 145 napi_create_int32(env, CONSTANT_2, &result); 146 return result; 147 } 148 OH_NativeImage_Destroy(&_image); 149 OH_NativeWindow_DestroyNativeWindow(_nativeWindow); 150 napi_create_int32(env, SUCCESS, &result); 151 return result; 152} 153 154 155napi_value testNativeWindowCreateNativeWindowFromSurfaceIdNormal(napi_env env, napi_callback_info info) 156{ 157 napi_value result = nullptr; 158 159 // 创建surface实例 获取id 160 GLuint textureId; 161 glGenTextures(1, &textureId); 162 auto _image = OH_NativeImage_Create(textureId, GL_TEXTURE_2D); 163 auto _nativeWindow = OH_NativeImage_AcquireNativeWindow(_image); 164 uint64_t surfaceId; 165 OH_NativeWindow_GetSurfaceId(_nativeWindow, &surfaceId); 166 167 // 声明nativeWindow空指针为window 168 OHNativeWindow *nativeWindow = nullptr; 169 auto flag = OH_NativeWindow_CreateNativeWindowFromSurfaceId(surfaceId, &nativeWindow); 170 // 接口执行成功,返回错误码0 | 声明的window指针指向NativeWindow实例 171 if (flag != 0 || nativeWindow == nullptr) { 172 napi_create_int32(env, 1, &result); 173 return result; 174 } 175 176 // 声明一个surfaceId2 177 uint64_t surfaceId2; 178 flag = OH_NativeWindow_GetSurfaceId(nativeWindow, &surfaceId2); 179 // 接口调用成功,返回错误码0 | get获取surfaceId2与surfaceId一致 180 if (flag != 0 || surfaceId2 != surfaceId) { 181 napi_create_int32(env, CONSTANT_2, &result); 182 return result; 183 } 184 185 OH_NativeImage_Destroy(&_image); 186 OH_NativeWindow_DestroyNativeWindow(nativeWindow); 187 188 napi_create_int32(env, SUCCESS, &result); 189 return result; 190} 191 192 193napi_value testNativeWindowCreateNativeWindowFromSurfaceIdSurfaceId(napi_env env, napi_callback_info info) 194{ 195 napi_value result = nullptr; 196 197 // 创建surface实例 获取一个正常的id 198 GLuint textureId; 199 glGenTextures(1, &textureId); 200 auto _image = OH_NativeImage_Create(textureId, GL_TEXTURE_2D); 201 auto _nativeWindow = OH_NativeImage_AcquireNativeWindow(_image); 202 uint64_t surfaceId; 203 OH_NativeWindow_GetSurfaceId(_nativeWindow, &surfaceId); 204 205 // 调用该接口,查看执行结果 206 uint64_t ids[] = {0, 1, surfaceId, 0xFFFFFFFF}; 207 for (int i = 0; i < sizeof(ids) / sizeof(uint64_t); i += 1) { 208 uint64_t tmpId = ids[i]; 209 OHNativeWindow *nativeWindow = nullptr; 210 auto flag = OH_NativeWindow_CreateNativeWindowFromSurfaceId(tmpId, &nativeWindow); 211 // 只有样例3成功 212 if (i == CONSTANT_2) { 213 if (flag != SUCCESS) { 214 napi_create_int32(env, i + 1, &result); 215 return result; 216 } 217 } else { 218 OH_NativeWindow_DestroyNativeWindow(nativeWindow); 219 if (flag == SUCCESS) { 220 napi_create_int32(env, 1 + 1, &result); 221 return result; 222 } 223 } 224 } 225 OH_NativeImage_Destroy(&_image); 226 OH_NativeWindow_DestroyNativeWindow(_nativeWindow); 227 napi_create_int32(env, SUCCESS, &result); 228 return result; 229} 230 231 232napi_value testNativeWindowCreateNativeWindowBufferFromNativeBufferNullptr(napi_env env, napi_callback_info info) 233{ 234 napi_value result = nullptr; 235 auto buffer = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(nullptr); 236 if (buffer == nullptr) { 237 napi_create_int32(env, SUCCESS, &result); 238 } else { 239 napi_create_int32(env, FAIL, &result); 240 } 241 return result; 242} 243 244 245napi_value testNativeWindowCreateNativeWindowBufferFromSurfaceBufferNullptr(napi_env env, napi_callback_info info) 246{ 247 napi_value result = nullptr; 248 auto buffer = OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(nullptr); 249 if (buffer == nullptr) { 250 napi_create_int32(env, SUCCESS, &result); 251 } else { 252 napi_create_int32(env, FAIL, &result); 253 } 254 return result; 255} 256 257 258napi_value testNativeWindowDestroyNativeWindowBufferNullptr(napi_env env, napi_callback_info info) 259{ 260 napi_value result = nullptr; 261 OH_NativeWindow_DestroyNativeWindowBuffer(nullptr); 262 napi_create_int32(env, SUCCESS, &result); 263 return result; 264} 265 266napi_value testNativeWindowGetBufferHandleFromNativeNullptr(napi_env env, napi_callback_info info) 267{ 268 napi_value result = nullptr; 269 auto ptr = OH_NativeWindow_GetBufferHandleFromNative(nullptr); 270 if (ptr == nullptr) { 271 napi_create_int32(env, SUCCESS, &result); 272 } else { 273 napi_create_int32(env, FAIL, &result); 274 } 275 napi_create_int32(env, SUCCESS, &result); 276 return result; 277} 278 279 280napi_value testNativeWindowCreateNativeWindowBufferFromNativeBufferNormal(napi_env env, napi_callback_info info) 281{ 282 napi_value result = nullptr; 283 284 // 0. 创建 native buffer 实例 285 OH_NativeBuffer_Config config{ 286 .width = 0x100, 287 .height = 0x100, 288 .format = NATIVEBUFFER_PIXEL_FMT_RGBA_8888, 289 .usage = NATIVEBUFFER_USAGE_CPU_READ | NATIVEBUFFER_USAGE_CPU_WRITE | NATIVEBUFFER_USAGE_MEM_DMA, 290 }; 291 OH_NativeBuffer *buffer = OH_NativeBuffer_Alloc(&config); 292 if (buffer == nullptr) { 293 napi_create_int32(env, -1, &result); 294 return result; 295 } 296 297 // 1. 298 auto nativeWindowBuffer = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(buffer); 299 // 接口执行成功,返回非空指针 300 if (nativeWindowBuffer == nullptr) { 301 napi_create_int32(env, CONSTANT_1, &result); 302 return result; 303 } 304 305 // 2. 306 auto bufferHandle = OH_NativeWindow_GetBufferHandleFromNative(nativeWindowBuffer); 307 if (bufferHandle == nullptr) { 308 napi_create_int32(env, CONSTANT_2, &result); 309 return result; 310 } 311 312 // 3. 313 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 314 315 // 4. 316 bufferHandle = OH_NativeWindow_GetBufferHandleFromNative(nativeWindowBuffer); 317 if (bufferHandle != nullptr) { 318 napi_create_int32(env, CONSTANT_4, &result); 319 return result; 320 } 321 322 napi_create_int32(env, SUCCESS, &result); 323 return result; 324} 325 326 327napi_value testNativeWindowCreateNativeWindowBufferFromNativeBufferMuch(napi_env env, napi_callback_info info) 328{ 329 napi_value result = nullptr; 330 331 // 0. 创建 native buffer 实例 332 OH_NativeBuffer_Config config{ 333 .width = 0x100, 334 .height = 0x100, 335 .format = NATIVEBUFFER_PIXEL_FMT_RGBA_8888, 336 .usage = NATIVEBUFFER_USAGE_CPU_READ | NATIVEBUFFER_USAGE_CPU_WRITE | NATIVEBUFFER_USAGE_MEM_DMA, 337 }; 338 OH_NativeBuffer *buffer = OH_NativeBuffer_Alloc(&config); 339 if (buffer == nullptr) { 340 napi_create_int32(env, -1, &result); 341 return result; 342 } 343 344 for (int i = 0; i < CONSTANT_500; i += 1) { 345 auto ptr = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(buffer); 346 if (ptr == nullptr) { 347 napi_create_int32(env, i + 1, &result); 348 return result; 349 } 350 } 351 352 napi_create_int32(env, SUCCESS, &result); 353 return result; 354} 355 356 357napi_value testNativeWindowNativeWindowRequestBufferNullptr(napi_env env, napi_callback_info info) 358{ 359 napi_value result = nullptr; 360 361 OHNativeWindowBuffer *oHNativeWindowBuffer; 362 int fenceFd; 363 364 auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nullptr, &oHNativeWindowBuffer, &fenceFd); 365 if (flag != CONSTANT_40001000) { 366 napi_create_int32(env, FAIL, &result); 367 return result; 368 } 369 370 napi_create_int32(env, SUCCESS, &result); 371 return result; 372} 373 374 375napi_value testNativeWindowNativeWindowAbortBufferNullptr(napi_env env, napi_callback_info info) 376{ 377 napi_value result = nullptr; 378 379 // 0. 创建 native window 实例 380 struct result result1 = InitNativeWindow(); 381 OH_NativeImage *image = result1.image; 382 OHNativeWindow *nativeWindow = result1.nativeWindow; 383 OHNativeWindowBuffer *oHNativeWindowBuffer; 384 385 // 1. window 为空指针 386 auto flag = OH_NativeWindow_NativeWindowAbortBuffer(nullptr, oHNativeWindowBuffer); 387 if (flag != CONSTANT_40001000) { 388 napi_create_int32(env, 1, &result); 389 return result; 390 } 391 392 // 2. buffer 为空指针 393 flag = OH_NativeWindow_NativeWindowAbortBuffer(nativeWindow, nullptr); 394 if (flag != CONSTANT_40001000) { 395 napi_create_int32(env, CONSTANT_2, &result); 396 return result; 397 } 398 DestroyNativeWindowImage(image, nativeWindow); 399 napi_create_int32(env, SUCCESS, &result); 400 return result; 401} 402 403napi_value testNativeWindowNativeWindowRequestAbortBufferNormal(napi_env env, napi_callback_info info) 404{ 405 napi_value result = nullptr; 406 407 // 0. 创建 native window 实例 408 struct result result1 = InitNativeWindow(); 409 OH_NativeImage *image = result1.image; 410 OHNativeWindow *nativeWindow = result1.nativeWindow; 411 412 // 0. 新建 native window buffer 指针 413 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 414 415 // 1. 416 int fenceFd = -1; 417 auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 418 if (flag != 0 || nativeWindowBuffer == nullptr) { 419 napi_create_int32(env, 1, &result); 420 return result; 421 } 422 423 // 2. 424 flag = OH_NativeWindow_NativeWindowAbortBuffer(nativeWindow, nativeWindowBuffer); 425 if (flag != 0) { 426 napi_create_int32(env, CONSTANT_2, &result); 427 return result; 428 } 429 DestroyNativeWindowImage(image, nativeWindow); 430 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 431 napi_create_int32(env, SUCCESS, &result); 432 return result; 433} 434 435napi_value testNativeWindowNativeWindowRequestAbortBufferAbnormal(napi_env env, napi_callback_info info) 436{ 437 napi_value result = nullptr; 438 439 // 0. 创建 native window 实例 440 struct result result1 = InitNativeWindow(); 441 OH_NativeImage *image = result1.image; 442 OHNativeWindow *nativeWindow = result1.nativeWindow; 443 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 444 445 // 1. 446 int fenceFd = 0; 447 auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 448 if (flag != 0 || nativeWindowBuffer == nullptr) { 449 napi_create_int32(env, 1, &result); 450 return result; 451 } 452 453 // 2. 454 flag = OH_NativeWindow_NativeWindowAbortBuffer(nativeWindow, nativeWindowBuffer); 455 if (flag != 0) { 456 napi_create_int32(env, CONSTANT_2, &result); 457 return result; 458 } 459 460 // 3. 461 flag = OH_NativeWindow_NativeWindowAbortBuffer(nativeWindow, nativeWindowBuffer); 462 if (flag == 0) { 463 napi_create_int32(env, CONSTANT_3, &result); 464 } 465 DestroyNativeWindowImage(image, nativeWindow); 466 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 467 napi_create_int32(env, SUCCESS, &result); 468 return result; 469} 470 471 472napi_value testNativeWindowNativeWindowRequestBufferFenceFdNormal(napi_env env, napi_callback_info info) 473{ 474 napi_value result = nullptr; 475 476 // 0. 创建 native window 实例 477 struct result result1 = InitNativeWindow(); 478 OH_NativeImage *image = result1.image; 479 OHNativeWindow *nativeWindow = result1.nativeWindow; 480 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 481 482 int32_t ls[] = {-CONSTANT_5, -CONSTANT_1, CONSTANT_0, CONSTANT_1, CONSTANT_10000, CONSTANT_999999999}; 483 for (int i = 0; i < sizeof(ls) / sizeof(int); i += 1) { 484 int fenceFd = ls[i]; 485 auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 486 if (flag != 0) { 487 napi_create_int32(env, 1, &result); 488 return result; 489 } 490 flag = OH_NativeWindow_NativeWindowAbortBuffer(nativeWindow, nativeWindowBuffer); 491 if (flag != 0) { 492 napi_create_int32(env, CONSTANT_2, &result); 493 return result; 494 } 495 } 496 DestroyNativeWindowImage(image, nativeWindow); 497 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 498 napi_create_int32(env, SUCCESS, &result); 499 return result; 500} 501 502 503napi_value testNativeWindowNativeWindowRequestBufferFenceFdAbnormal(napi_env env, napi_callback_info info) 504{ 505 napi_value result = nullptr; 506 507 // 0. 创建 native window 实例 508 struct result result1 = InitNativeWindow(); 509 OH_NativeImage *image = result1.image; 510 OHNativeWindow *nativeWindow = result1.nativeWindow; 511 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 512 513 int32_t *fenceFd1 = NULL; 514 auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, fenceFd1); 515 if (flag == 0) { 516 napi_create_int32(env, 1, &result); 517 return result; 518 } 519 520 int32_t *fenceFd2 = nullptr; 521 flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, fenceFd2); 522 if (flag == 0) { 523 napi_create_int32(env, 1, &result); 524 return result; 525 } 526 DestroyNativeWindowImage(image, nativeWindow); 527 napi_create_int32(env, SUCCESS, &result); 528 return result; 529} 530 531 532napi_value testNativeWindowNativeWindowRequestAbortBufferMax(napi_env env, napi_callback_info info) 533{ 534 napi_value result = nullptr; 535 536 // 0. 创建 native window 实例 537 struct result result1 = InitNativeWindow(); 538 OH_NativeImage *image = result1.image; 539 OHNativeWindow *nativeWindow = result1.nativeWindow; 540 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 541 542 for (int i = 0; i < CONSTANT_4; ++i) { 543 int fenceFd = -1; 544 auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 545 if (i >= CONSTANT_3) { 546 if (flag == 0) { 547 napi_create_int32(env, FAIL, &result); 548 return result; 549 } 550 } else { 551 if (flag != 0) { 552 napi_create_int32(env, i + 1, &result); 553 return result; 554 } 555 } 556 } 557 DestroyNativeWindowImage(image, nativeWindow); 558 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 559 napi_create_int32(env, SUCCESS, &result); 560 return result; 561} 562 563 564napi_value testNativeWindowNativeWindowRequestAbortBufferErrorCode(napi_env env, napi_callback_info info) 565{ 566 napi_value result = nullptr; 567 struct result result1 = InitNativeWindow(); 568 OH_NativeImage *image = result1.image; 569 OHNativeWindow *nativeWindow = result1.nativeWindow; 570 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 571 int requestFenceFd; 572 auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &requestFenceFd); 573 if (flag != 0) { 574 napi_create_int32(env, 1, &result); 575 return result; 576 } 577 if (nativeWindowBuffer == nullptr || requestFenceFd != -1) { 578 napi_create_int32(env, CONSTANT_2, &result); 579 return result; 580 } 581 Region::Rect rect{ 582 .x = 0x100, 583 .y = 0x100, 584 .w = 0x100, 585 .h = 0x100, 586 }; 587 Region region{.rects = &rect}; 588 flag = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, requestFenceFd, region); 589 if (flag != 0) { 590 napi_create_int32(env, CONSTANT_3, &result); 591 return result; 592 } 593 flag = OH_NativeWindow_NativeWindowAbortBuffer(nativeWindow, nativeWindowBuffer); 594 if (flag == 0) { 595 napi_create_int32(env, CONSTANT_4, &result); 596 } 597 598 DestroyNativeWindowImage(image, nativeWindow); 599 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 600 napi_create_int32(env, SUCCESS, &result); 601 return result; 602} 603 604 605napi_value testNativeWindowWriteToParcelErrptr(napi_env env, napi_callback_info info) 606{ 607 napi_value result = nullptr; 608 609 // 0. 创建 native window 实例 610 struct result result1 = InitNativeWindow(); 611 OH_NativeImage *image = result1.image; 612 OHNativeWindow *nativeWindow = result1.nativeWindow; 613 // 0. 已存在OHIPCParcel 614 OHIPCParcel *parcel = OH_IPCParcel_Create(); 615 616 // 1. 617 auto flag = OH_NativeWindow_WriteToParcel(nullptr, parcel); 618 if (flag != CONSTANT_40001000) { 619 napi_create_int32(env, 1, &result); 620 return result; 621 } 622 623 // 2. 624 flag = OH_NativeWindow_WriteToParcel(nativeWindow, nullptr); 625 if (flag != CONSTANT_40001000) { 626 napi_create_int32(env, CONSTANT_2, &result); 627 return result; 628 } 629 DestroyNativeWindowImage(image, nativeWindow); 630 napi_create_int32(env, SUCCESS, &result); 631 return result; 632} 633 634 635napi_value testNativeWindowReadFromParcelErrptr(napi_env env, napi_callback_info info) 636{ 637 napi_value result = nullptr; 638 639 OHNativeWindow *nativeWindow = nullptr; 640 // 0. 已存在OHIPCParcel 641 OHIPCParcel *parcel = OH_IPCParcel_Create(); 642 643 // 1. 644 auto flag = OH_NativeWindow_ReadFromParcel(parcel, nullptr); 645 if (flag != CONSTANT_40001000) { 646 napi_create_int32(env, 1, &result); 647 return result; 648 } 649 650 // 2. 651 flag = OH_NativeWindow_ReadFromParcel(nullptr, &nativeWindow); 652 if (flag != CONSTANT_40001000) { 653 napi_create_int32(env, CONSTANT_2, &result); 654 return result; 655 } 656 657 napi_create_int32(env, SUCCESS, &result); 658 return result; 659} 660 661napi_value testNativeWindowWRParcelNormal(napi_env env, napi_callback_info info) 662{ 663 napi_value result = nullptr; 664 665 // 0. 创建 native window 实例 666 GLuint textureId; 667 glGenTextures(1, &textureId); 668 auto _image = OH_NativeImage_Create(textureId, GL_TEXTURE_2D); 669 auto nativeWindow1 = OH_NativeImage_AcquireNativeWindow(_image); 670 // 0. 已存在OHIPCParcel 671 OHIPCParcel *parcel1 = OH_IPCParcel_Create(); 672 673 auto flag = OH_NativeWindow_WriteToParcel(nativeWindow1, parcel1); 674 if (flag != 0) { 675 napi_create_int32(env, CONSTANT_1, &result); 676 return result; 677 } 678 OHNativeWindow *nativeWindow2; 679 flag = OH_NativeWindow_ReadFromParcel(parcel1, &nativeWindow2); 680 if (flag != 0) { 681 napi_create_int32(env, CONSTANT_2, &result); 682 return result; 683 } 684 if (nativeWindow1 != nativeWindow2) { 685 napi_create_int32(env, CONSTANT_3, &result); 686 return result; 687 } 688 689 OH_NativeImage_Destroy(&_image); 690 OH_NativeWindow_DestroyNativeWindow(nativeWindow1); 691 OH_NativeWindow_DestroyNativeWindow(nativeWindow2); 692 napi_create_int32(env, SUCCESS, &result); 693 return result; 694} 695 696 697napi_value testNativeWindowWriteToParcelAbNormal(napi_env env, napi_callback_info info) 698{ 699 napi_value result = nullptr; 700 701 // 0. 702 GLuint textureId; 703 glGenTextures(1, &textureId); 704 auto _image = OH_NativeImage_Create(textureId, GL_TEXTURE_2D); 705 OHNativeWindow *window1 = nullptr; 706 OHIPCParcel *parcel1 = OH_IPCParcel_Create(); 707 708 // 1. 709 auto flag = OH_NativeWindow_ReadFromParcel(parcel1, &window1); 710 if (window1 != nullptr) { 711 napi_create_int32(env, CONSTANT_1, &result); 712 return result; 713 } 714 OH_NativeImage_Destroy(&_image); 715 OH_NativeWindow_DestroyNativeWindow(window1); 716 napi_create_int32(env, SUCCESS, &result); 717 return result; 718} 719 720napi_value testNativeWindowReadFromParcelAbNormal(napi_env env, napi_callback_info info) 721{ 722 napi_value result = nullptr; 723 724 // 0. 725 struct result result1 = InitNativeWindow(); 726 OH_NativeImage *image = result1.image; 727 OHNativeWindow *window1 = result1.nativeWindow; 728 OHIPCParcel *parcel1 = OH_IPCParcel_Create(); 729 730 // 1. 731 auto flag = OH_NativeWindow_WriteToParcel(window1, parcel1); 732 if (flag != 0) { 733 napi_create_int32(env, CONSTANT_1, &result); 734 return result; 735 } 736 737 // 2. 738 flag = OH_NativeWindow_WriteToParcel(window1, parcel1); 739 if (flag != 0) { 740 napi_create_int32(env, CONSTANT_2, &result); 741 return result; 742 } 743 DestroyNativeWindowImage(image, window1); 744 napi_create_int32(env, SUCCESS, &result); 745 return result; 746} 747 748napi_value testNativeWindowWRParcelDifferent(napi_env env, napi_callback_info info) 749{ 750 napi_value result = nullptr; 751 struct result result1, result2; 752 result1 = InitNativeWindow(); 753 result2 = InitNativeWindow(); 754 OH_NativeImage *image1 = result1.image; 755 OHNativeWindow *window1 = result1.nativeWindow; 756 OH_NativeImage *image2 = result2.image; 757 OHNativeWindow *window2 = result2.nativeWindow; 758 OHIPCParcel *parcel1 = OH_IPCParcel_Create(); 759 OHIPCParcel *parcel2 = OH_IPCParcel_Create(); 760 761 // 1. 762 auto flag = OH_NativeWindow_WriteToParcel(window1, parcel1); 763 if (flag != 0) { 764 napi_create_int32(env, CONSTANT_1, &result); 765 return result; 766 } 767 // 2. 768 flag = OH_NativeWindow_WriteToParcel(window1, parcel2); 769 if (flag != 0) { 770 napi_create_int32(env, CONSTANT_2, &result); 771 return result; 772 } 773 // 3. 774 flag = OH_NativeWindow_WriteToParcel(window2, parcel1); 775 if (flag != 0) { 776 napi_create_int32(env, CONSTANT_3, &result); 777 return result; 778 } 779 DestroyNativeWindowImage(image1, window1); 780 DestroyNativeWindowImage(image2, window2); 781 napi_create_int32(env, SUCCESS, &result); 782 return result; 783} 784 785 786napi_value testNativeWindowNativeWindowFlushBufferNullptr(napi_env env, napi_callback_info info) 787{ 788 napi_value result = nullptr; 789 790 // 0. 791 struct result result1 = InitNativeWindow(); 792 OH_NativeImage *image = result1.image; 793 OHNativeWindow *nativeWindow = result1.nativeWindow; 794 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 795 int fenceFd = -1; 796 Region::Rect rect{ 797 .x = 0x100, 798 .y = 0x100, 799 .w = 0x100, 800 .h = 0x100, 801 }; 802 Region region{.rects = &rect}; 803 OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 804 805 // 1. 806 auto flag = OH_NativeWindow_NativeWindowFlushBuffer(nullptr, nativeWindowBuffer, fenceFd, region); 807 if (flag != CONSTANT_40001000) { 808 napi_create_int32(env, 1, &result); 809 return result; 810 } 811 // 2. 812 flag = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nullptr, fenceFd, region); 813 if (flag != CONSTANT_40001000) { 814 napi_create_int32(env, CONSTANT_2, &result); 815 return result; 816 } 817 DestroyNativeWindowImage(image, nativeWindow); 818 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 819 napi_create_int32(env, SUCCESS, &result); 820 return result; 821} 822 823 824napi_value testNativeWindowNativeWindowFlushBufferNormal(napi_env env, napi_callback_info info) 825{ 826 napi_value result = nullptr; 827 828 // 0. 829 struct result result1 = InitNativeWindow(); 830 OH_NativeImage *image = result1.image; 831 OHNativeWindow *nativeWindow = result1.nativeWindow; 832 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 833 int fenceFd = -1; 834 Region::Rect rect{ 835 .x = 0x100, 836 .y = 0x100, 837 .w = 0x100, 838 .h = 0x100, 839 }; 840 Region region{.rects = &rect}; 841 OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 842 843 // 1. 844 auto flag = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, region); 845 if (flag != 0) { 846 napi_create_int32(env, CONSTANT_1, &result); 847 return result; 848 } 849 850 // 2. 851 flag = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, region); 852 if (flag != CONSTANT_41207000) { 853 napi_create_int32(env, CONSTANT_2, &result); 854 return result; 855 } 856 857 DestroyNativeWindowImage(image, nativeWindow); 858 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 859 napi_create_int32(env, SUCCESS, &result); 860 return result; 861} 862 863napi_value testNativeWindowNativeWindowFlushBufferAbnormal(napi_env env, napi_callback_info info) 864{ 865 napi_value result = nullptr; 866 // 1. 867 int fenceFdList[] = {-CONSTANT_999999999, -CONSTANT_1000, -CONSTANT_1, CONSTANT_0, 868 CONSTANT_1, CONSTANT_1000, CONSTANT_999999999}; 869 for (int i = 0; i < sizeof(fenceFdList) / sizeof(int); ++i) { 870 struct result result1 = InitNativeWindow(); 871 OH_NativeImage *image = result1.image; 872 OHNativeWindow *nativeWindow = result1.nativeWindow; 873 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 874 int fenceFd = -1; 875 auto ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 876 Region::Rect rect{ 877 .x = 0x100, 878 .y = 0x100, 879 .w = 0x100, 880 .h = 0x100, 881 }; 882 Region region{.rects = &rect}; 883 auto flag = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFdList[i], region); 884 if (flag != 0) { 885 napi_create_int32(env, i + 1, &result); 886 return result; 887 } 888 889 DestroyNativeWindowImage(image, nativeWindow); 890 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 891 napi_create_int32(env, SUCCESS, &result); 892 } 893 return result; 894} 895 896napi_value testNativeWindowNativeWindowFlushBufferErrorCode(napi_env env, napi_callback_info info) 897{ 898 napi_value result = nullptr; 899 struct result result1 = InitNativeWindow(); 900 OH_NativeImage *image = result1.image; 901 OHNativeWindow *nativeWindow = result1.nativeWindow; 902 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 903 int fenceFd = -1; 904 Region::Rect rect{ 905 .x = 0x100, 906 .y = 0x100, 907 .w = 0x100, 908 .h = 0x100, 909 }; 910 Region region{.rects = &rect}; 911 OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 912 913 OH_NativeBuffer_Config config{ 914 .width = 0x100, 915 .height = 0x100, 916 .format = NATIVEBUFFER_PIXEL_FMT_RGBA_8888, 917 .usage = NATIVEBUFFER_USAGE_CPU_READ | NATIVEBUFFER_USAGE_CPU_WRITE | NATIVEBUFFER_USAGE_MEM_DMA, 918 }; 919 OH_NativeBuffer *newBuffer = OH_NativeBuffer_Alloc(&config); 920 nativeWindowBuffer = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(newBuffer); 921 922 // 1. 923 auto flag = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, -1, region); 924 if (flag != CONSTANT_41210000) { 925 napi_create_int32(env, FAIL, &result); 926 return result; 927 } 928 DestroyNativeWindowImage(image, nativeWindow); 929 OH_NativeBuffer_Unreference(newBuffer); 930 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 931 napi_create_int32(env, SUCCESS, &result); 932 return result; 933} 934 935 936napi_value testNativeWindowGetLastFlushedBufferV2Nullptr(napi_env env, napi_callback_info info) 937{ 938 napi_value result = nullptr; 939 struct result result1 = InitNativeWindow(); 940 OH_NativeImage *image = result1.image; 941 OHNativeWindow *nativeWindow = result1.nativeWindow; 942 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 943 int fenceFd; 944 float matrix[16]; 945 946 // 1. 947 auto flag = OH_NativeWindow_GetLastFlushedBufferV2(nullptr, &nativeWindowBuffer, &fenceFd, matrix); 948 if (flag != CONSTANT_40001000) { 949 napi_create_int32(env, CONSTANT_1, &result); 950 return result; 951 } 952 // 2. 953 flag = OH_NativeWindow_GetLastFlushedBufferV2(nativeWindow, nullptr, &fenceFd, matrix); 954 if (flag != CONSTANT_40001000) { 955 napi_create_int32(env, CONSTANT_2, &result); 956 return result; 957 } 958 DestroyNativeWindowImage(image, nativeWindow); 959 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 960 napi_create_int32(env, SUCCESS, &result); 961 return result; 962} 963 964 965napi_value testNativeWindowGetLastFlushedBufferNullptr(napi_env env, napi_callback_info info) 966{ 967 napi_value result = nullptr; 968 struct result result1 = InitNativeWindow(); 969 OH_NativeImage *image = result1.image; 970 OHNativeWindow *nativeWindow = result1.nativeWindow; 971 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 972 int fenceFd; 973 float matrix[16]; 974 975 // 1. 976 auto flag = OH_NativeWindow_GetLastFlushedBuffer(nullptr, &nativeWindowBuffer, &fenceFd, matrix); 977 if (flag != CONSTANT_40001000) { 978 napi_create_int32(env, 1, &result); 979 return result; 980 } 981 // 2. 982 flag = OH_NativeWindow_GetLastFlushedBuffer(nativeWindow, nullptr, &fenceFd, matrix); 983 if (flag != CONSTANT_40001000) { 984 napi_create_int32(env, CONSTANT_2, &result); 985 return result; 986 } 987 DestroyNativeWindowImage(image, nativeWindow); 988 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 989 napi_create_int32(env, SUCCESS, &result); 990 return result; 991} 992 993napi_value testNativeWindowGetLastFlushedBufferV2Normal(napi_env env, napi_callback_info info) 994{ 995 napi_value result = nullptr; 996 struct result result1 = InitNativeWindow(); 997 OH_NativeImage *image = result1.image; 998 OHNativeWindow *nativeWindow = result1.nativeWindow; 999 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 1000 int fenceFd; 1001 float matrix[16]; 1002 Region::Rect rect{ 1003 .x = 0x100, 1004 .y = 0x100, 1005 .w = 0x100, 1006 .h = 0x100, 1007 }; 1008 Region region{.rects = &rect}; 1009 auto ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 1010 ret = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, region); 1011 auto flag = OH_NativeWindow_GetLastFlushedBufferV2(nativeWindow, &nativeWindowBuffer, &fenceFd, matrix); 1012 if (flag != 0) { 1013 napi_create_int32(env, 1, &result); 1014 return result; 1015 } 1016 DestroyNativeWindowImage(image, nativeWindow); 1017 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 1018 napi_create_int32(env, SUCCESS, &result); 1019 return result; 1020} 1021 1022napi_value testNativeWindowGetLastFlushedBufferNormal(napi_env env, napi_callback_info info) 1023{ 1024 napi_value result = nullptr; 1025 struct result result1 = InitNativeWindow(); 1026 OH_NativeImage *image = result1.image; 1027 OHNativeWindow *nativeWindow = result1.nativeWindow; 1028 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 1029 int fenceFd; 1030 float matrix[16]; 1031 Region::Rect rect{ 1032 .x = 0x100, 1033 .y = 0x100, 1034 .w = 0x100, 1035 .h = 0x100, 1036 }; 1037 Region region{.rects = &rect}; 1038 auto ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 1039 ret = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, region); 1040 auto flag = OH_NativeWindow_GetLastFlushedBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd, matrix); 1041 if (flag != 0) { 1042 napi_create_int32(env, 1, &result); 1043 return result; 1044 } 1045 DestroyNativeWindowImage(image, nativeWindow); 1046 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 1047 napi_create_int32(env, SUCCESS, &result); 1048 return result; 1049} 1050 1051 1052napi_value testNativeWindowSetBufferHold(napi_env env, napi_callback_info info) 1053{ 1054 napi_value result = nullptr; 1055 struct result result1 = InitNativeWindow(); 1056 OH_NativeImage *image = result1.image; 1057 OHNativeWindow *nativeWindow = result1.nativeWindow; 1058 1059 OH_NativeWindow_SetBufferHold(nullptr); 1060 OH_NativeWindow_SetBufferHold(nativeWindow); 1061 1062 DestroyNativeWindowImage(image, nativeWindow); 1063 napi_create_int32(env, SUCCESS, &result); 1064 return result; 1065} 1066 1067napi_value testNativeWindowGetNativeObjectMagicNullptr(napi_env env, napi_callback_info info) 1068{ 1069 napi_value result = nullptr; 1070 auto flag = OH_NativeWindow_GetNativeObjectMagic(nullptr); 1071 if (flag != -1) { 1072 napi_create_int32(env, FAIL, &result); 1073 return result; 1074 } 1075 napi_create_int32(env, SUCCESS, &result); 1076 return result; 1077} 1078 1079napi_value testNativeWindowGetNativeObjectMagicNormal(napi_env env, napi_callback_info info) 1080{ 1081 napi_value result = nullptr; 1082 1083 struct result result1 = InitNativeWindow(); 1084 OH_NativeImage *image = result1.image; 1085 OHNativeWindow *nativeWindow = result1.nativeWindow; 1086 OHNativeWindowBuffer *nativeWindowBuffer; 1087 int fenceFd = -1; 1088 OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 1089 1090 auto magicId = OH_NativeWindow_GetNativeObjectMagic(nativeWindow); 1091 if (magicId == -1) { 1092 napi_create_int32(env, CONSTANT_1, &result); 1093 return result; 1094 } 1095 auto magicId2 = OH_NativeWindow_GetNativeObjectMagic(nativeWindow); 1096 if (magicId2 == -1) { 1097 napi_create_int32(env, CONSTANT_1, &result); 1098 return result; 1099 } 1100 if (magicId != magicId2) { 1101 napi_create_int32(env, CONSTANT_3, &result); 1102 return result; 1103 } 1104 auto magicId3 = OH_NativeWindow_GetNativeObjectMagic(nativeWindowBuffer); 1105 if (magicId3 == -1) { 1106 napi_create_int32(env, CONSTANT_2, &result); 1107 return result; 1108 } 1109 auto magicId4 = OH_NativeWindow_GetNativeObjectMagic(nativeWindowBuffer); 1110 if (magicId4 == -1) { 1111 napi_create_int32(env, CONSTANT_2, &result); 1112 return result; 1113 } 1114 1115 if (magicId3 != magicId4) { 1116 napi_create_int32(env, CONSTANT_3, &result); 1117 return result; 1118 } 1119 DestroyNativeWindowImage(image, nativeWindow); 1120 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 1121 napi_create_int32(env, SUCCESS, &result); 1122 return result; 1123} 1124 1125napi_value testNativeWindowNativeObjectReferenceNullptr(napi_env env, napi_callback_info info) 1126{ 1127 napi_value result = nullptr; 1128 1129 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 1130 1131 auto magicId = OH_NativeWindow_NativeObjectReference(nullptr); 1132 if (magicId != CONSTANT_40001000) { 1133 napi_create_int32(env, CONSTANT_1, &result); 1134 return result; 1135 } 1136 1137 magicId = OH_NativeWindow_NativeObjectReference(nativeWindowBuffer); 1138 if (magicId != CONSTANT_40001000) { 1139 napi_create_int32(env, CONSTANT_2, &result); 1140 return result; 1141 } 1142 1143 napi_create_int32(env, SUCCESS, &result); 1144 return result; 1145} 1146 1147 1148napi_value testNativeWindowNativeObjectReferenceNormal(napi_env env, napi_callback_info info) 1149{ 1150 napi_value result = nullptr; 1151 1152 struct result result1 = InitNativeWindow(); 1153 OH_NativeImage *image = result1.image; 1154 OHNativeWindow *nativeWindow = result1.nativeWindow; 1155 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 1156 int fenceFd = -1; 1157 OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 1158 1159 auto magicId = OH_NativeWindow_NativeObjectReference(nativeWindow); 1160 if (magicId != 0) { 1161 napi_create_int32(env, CONSTANT_1, &result); 1162 return result; 1163 } 1164 1165 magicId = OH_NativeWindow_NativeObjectReference(nativeWindowBuffer); 1166 if (magicId != 0) { 1167 napi_create_int32(env, CONSTANT_2, &result); 1168 return result; 1169 } 1170 DestroyNativeWindowImage(image, nativeWindow); 1171 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 1172 napi_create_int32(env, SUCCESS, &result); 1173 return result; 1174} 1175 1176napi_value testNativeWindowNativeObjectUnreferenceNullptr(napi_env env, napi_callback_info info) 1177{ 1178 napi_value result = nullptr; 1179 1180 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 1181 1182 auto magicId = OH_NativeWindow_NativeObjectUnreference(nullptr); 1183 if (magicId != CONSTANT_40001000) { 1184 napi_create_int32(env, CONSTANT_1, &result); 1185 return result; 1186 } 1187 1188 magicId = OH_NativeWindow_NativeObjectUnreference(nativeWindowBuffer); 1189 if (magicId != CONSTANT_40001000) { 1190 napi_create_int32(env, CONSTANT_2, &result); 1191 return result; 1192 } 1193 1194 napi_create_int32(env, SUCCESS, &result); 1195 return result; 1196} 1197 1198napi_value testNativeWindowNativeObjectUnreferenceNormal(napi_env env, napi_callback_info info) 1199{ 1200 napi_value result = nullptr; 1201 1202 struct result result1 = InitNativeWindow(); 1203 OH_NativeImage *image = result1.image; 1204 OHNativeWindow *nativeWindow = result1.nativeWindow; 1205 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 1206 int fenceFd = -1; 1207 OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 1208 1209 auto magicId = OH_NativeWindow_NativeObjectUnreference(nativeWindow); 1210 if (magicId != 0) { 1211 napi_create_int32(env, CONSTANT_1, &result); 1212 return result; 1213 } 1214 1215 magicId = OH_NativeWindow_NativeObjectUnreference(nativeWindowBuffer); 1216 if (magicId != 0) { 1217 napi_create_int32(env, CONSTANT_2, &result); 1218 return result; 1219 } 1220 DestroyNativeWindowImage(image, nativeWindow); 1221 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 1222 napi_create_int32(env, SUCCESS, &result); 1223 return result; 1224} 1225 1226 1227napi_value testNativeWindowNativeWindowAttachBufferNullptr(napi_env env, napi_callback_info info) 1228{ 1229 napi_value result = nullptr; 1230 1231 struct result result1 = InitNativeWindow(); 1232 OH_NativeImage *image = result1.image; 1233 OHNativeWindow *nativeWindow = result1.nativeWindow; 1234 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 1235 int fenceFd = -1; 1236 OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 1237 1238 auto flag = OH_NativeWindow_NativeWindowAttachBuffer(nullptr, nativeWindowBuffer); 1239 if (flag != CONSTANT_40001000) { 1240 napi_create_int32(env, CONSTANT_1, &result); 1241 return result; 1242 } 1243 1244 flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nullptr); 1245 if (flag != CONSTANT_40001000) { 1246 napi_create_int32(env, CONSTANT_1, &result); 1247 return result; 1248 } 1249 DestroyNativeWindowImage(image, nativeWindow); 1250 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 1251 napi_create_int32(env, SUCCESS, &result); 1252 return result; 1253} 1254 1255napi_value testNativeWindowNativeWindowDetachBufferNullptr(napi_env env, napi_callback_info info) 1256{ 1257 napi_value result = nullptr; 1258 1259 struct result result1 = InitNativeWindow(); 1260 OH_NativeImage *image = result1.image; 1261 OHNativeWindow *nativeWindow = result1.nativeWindow; 1262 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 1263 int fenceFd = -1; 1264 OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 1265 1266 auto flag = OH_NativeWindow_NativeWindowDetachBuffer(nullptr, nativeWindowBuffer); 1267 if (flag != CONSTANT_40001000) { 1268 napi_create_int32(env, CONSTANT_1, &result); 1269 return result; 1270 } 1271 1272 flag = OH_NativeWindow_NativeWindowDetachBuffer(nativeWindow, nullptr); 1273 if (flag != CONSTANT_40001000) { 1274 napi_create_int32(env, CONSTANT_2, &result); 1275 return result; 1276 } 1277 DestroyNativeWindowImage(image, nativeWindow); 1278 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 1279 napi_create_int32(env, SUCCESS, &result); 1280 return result; 1281} 1282 1283 1284napi_value testNativeWindowNativeWindowDetachBufferNormal(napi_env env, napi_callback_info info) 1285{ 1286 napi_value result = nullptr; 1287 1288 struct result result1 = InitNativeWindow(); 1289 OH_NativeImage *image = result1.image; 1290 OHNativeWindow *nativeWindow = result1.nativeWindow; 1291 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 1292 int fenceFd = -1; 1293 auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 1294 if (flag != 0) { 1295 napi_create_int32(env, FAIL, &result); 1296 return result; 1297 } 1298 1299 flag = OH_NativeWindow_NativeWindowDetachBuffer(nativeWindow, nativeWindowBuffer); 1300 if (flag != 0) { 1301 napi_create_int32(env, 1, &result); 1302 return result; 1303 } 1304 1305 flag = OH_NativeWindow_NativeWindowDetachBuffer(nativeWindow, nativeWindowBuffer); 1306 if (flag != CONSTANT_41210000) { 1307 napi_create_int32(env, CONSTANT_2, &result); 1308 return result; 1309 } 1310 1311 DestroyNativeWindowImage(image, nativeWindow); 1312 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 1313 1314 napi_create_int32(env, SUCCESS, &result); 1315 return result; 1316} 1317 1318 1319napi_value testNativeWindowNativeWindowAttachBufferErrorCode(napi_env env, napi_callback_info info) 1320{ 1321 napi_value result = nullptr; 1322 1323 struct result result1 = InitNativeWindow(); 1324 OH_NativeImage *image = result1.image; 1325 OHNativeWindow *nativeWindow = result1.nativeWindow; 1326 OHNativeWindowBuffer *nwb1, *nwb2, *nwb3, *nwb4; 1327 int fenceFd = -1; 1328 OH_NativeBuffer_Config config{ 1329 .width = 0x100, 1330 .height = 0x100, 1331 .format = NATIVEBUFFER_PIXEL_FMT_RGBA_8888, 1332 .usage = NATIVEBUFFER_USAGE_CPU_READ | NATIVEBUFFER_USAGE_CPU_WRITE | NATIVEBUFFER_USAGE_MEM_DMA, 1333 }; 1334 OH_NativeBuffer *nativeBuffer = OH_NativeBuffer_Alloc(&config); 1335 OHNativeWindowBuffer **arr[] = {&nwb1, &nwb2, &nwb3, &nwb4}; 1336 nwb1 = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(nativeBuffer); 1337 nwb2 = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(nativeBuffer); 1338 nwb3 = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(nativeBuffer); 1339 nwb4 = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(nativeBuffer); 1340 1341 auto flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nwb1); 1342 flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nwb2); 1343 flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nwb3); 1344 flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nwb4); 1345 DestroyNativeWindowImage(image, nativeWindow); 1346 OH_NativeBuffer_Unreference(nativeBuffer); 1347 napi_create_int32(env, SUCCESS, &result); 1348 return result; 1349} 1350 1351 1352napi_value testNativeWindowNativeWindowAttachBufferNormal(napi_env env, napi_callback_info info) 1353{ 1354 napi_value result = nullptr; 1355 1356 struct result result1 = InitNativeWindow(); 1357 OH_NativeImage *image = result1.image; 1358 OHNativeWindow *nativeWindow = result1.nativeWindow; 1359 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 1360 int fenceFd = -1; 1361 auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 1362 if (flag != 0) { 1363 napi_create_int32(env, FAIL, &result); 1364 return result; 1365 } 1366 1367 flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nativeWindowBuffer); 1368 if (flag != CONSTANT_41208000) { 1369 napi_create_int32(env, CONSTANT_1, &result); 1370 return result; 1371 } 1372 1373 flag = OH_NativeWindow_NativeWindowDetachBuffer(nativeWindow, nativeWindowBuffer); 1374 if (flag != 0) { 1375 napi_create_int32(env, CONSTANT_2, &result); 1376 return result; 1377 } 1378 1379 flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nativeWindowBuffer); 1380 if (flag != 0) { 1381 napi_create_int32(env, CONSTANT_3, &result); 1382 return result; 1383 } 1384 1385 DestroyNativeWindowImage(image, nativeWindow); 1386 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 1387 1388 napi_create_int32(env, SUCCESS, &result); 1389 return result; 1390} 1391 1392 1393napi_value testNativeWindowNativeWindowDetachBufferErrorCode(napi_env env, napi_callback_info info) 1394{ 1395 napi_value result = nullptr; 1396 1397 struct result result1 = InitNativeWindow(); 1398 OH_NativeImage *image = result1.image; 1399 OHNativeWindow *nativeWindow = result1.nativeWindow; 1400 OHNativeWindowBuffer *nativeWindowBuffer = nullptr; 1401 int fenceFd; 1402 Region::Rect rect{ 1403 .x = 0x100, 1404 .y = 0x100, 1405 .w = 0x100, 1406 .h = 0x100, 1407 }; 1408 Region region{.rects = &rect}; 1409 auto ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd); 1410 ret = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, region); 1411 if (ret != 0) { 1412 napi_create_int32(env, FAIL, &result); 1413 return result; 1414 } 1415 // 3. 1416 auto flag = OH_NativeWindow_NativeWindowDetachBuffer(nativeWindow, nativeWindowBuffer); 1417 if (flag != CONSTANT_41207000) { 1418 napi_create_int32(env, FAIL, &result); 1419 return result; 1420 } 1421 1422 DestroyNativeWindowImage(image, nativeWindow); 1423 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer); 1424 1425 napi_create_int32(env, SUCCESS, &result); 1426 return result; 1427} 1428 1429 1430napi_value testNativeWindowNativeWindowAtDetachDifferentBufferNormal(napi_env env, napi_callback_info info) 1431{ 1432 napi_value result = nullptr; 1433 1434 struct result result1 = InitNativeWindow(); 1435 OH_NativeImage *image = result1.image; 1436 OHNativeWindow *nativeWindow = result1.nativeWindow; 1437 OHNativeWindowBuffer *nativeWindowBuffer1, *nativeWindowBuffer2, *nativeWindowBuffer3; 1438 int fenceFd = -1; 1439 OHNativeWindowBuffer **nativeWindowBuffers[] = {&nativeWindowBuffer1, &nativeWindowBuffer2, &nativeWindowBuffer3}; 1440 for (int i = 0; i < CONSTANT_3; ++i) { 1441 auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, nativeWindowBuffers[i], &fenceFd); 1442 if (flag != 0) { 1443 napi_create_int32(env, CONSTANT_1000 + i + 1, &result); 1444 return result; 1445 } 1446 } 1447 1448 for (int i = 0; i < CONSTANT_3; ++i) { 1449 auto flag = OH_NativeWindow_NativeWindowDetachBuffer(nativeWindow, *nativeWindowBuffers[i]); 1450 if (flag != 0) { 1451 napi_create_int32(env, CONSTANT_2 * CONSTANT_1000 + i + 1, &result); 1452 return result; 1453 } 1454 } 1455 1456 for (int i = 0; i < CONSTANT_3; ++i) { 1457 auto flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, *nativeWindowBuffers[i]); 1458 if (flag != 0) { 1459 napi_create_int32(env, CONSTANT_3 * CONSTANT_1000 + i + 1, &result); 1460 return result; 1461 } 1462 } 1463 1464 DestroyNativeWindowImage(image, nativeWindow); 1465 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer1); 1466 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer2); 1467 OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer3); 1468 1469 napi_create_int32(env, SUCCESS, &result); 1470 return result; 1471} 1472 1473struct Paramater { 1474 OHNativeWindow *nativeWindow1 = nullptr; 1475 OHNativeWindow *nativeWindow2 = nullptr; 1476 OHNativeWindowBuffer *nativeWindowBuffer1 = nullptr; 1477 OHNativeWindowBuffer *nativeWindowBuffer2 = nullptr; 1478 OH_NativeBuffer *nativeBuffer1 = nullptr; 1479 OH_NativeBuffer *nativeBuffer2 = nullptr; 1480}; 1481 1482napi_value testNativeWindowNativeWindowAtDetachDifferentBufferAbnormal1( 1483 napi_env env, napi_callback_info info, Paramater paramater) 1484{ 1485 napi_value result = nullptr; 1486 int32_t flag = OH_NativeWindow_NativeWindowAttachBuffer(paramater.nativeWindow1, paramater.nativeWindowBuffer1); 1487 if (flag != 0) { 1488 napi_create_int32(env, CONSTANT_2 * CONSTANT_1000 + CONSTANT_1, &result); 1489 return result; 1490 } 1491 flag = OH_NativeWindow_NativeWindowAttachBuffer(paramater.nativeWindow2, paramater.nativeWindowBuffer2); 1492 if (flag != 0) { 1493 napi_create_int32(env, CONSTANT_2 * CONSTANT_1000 + CONSTANT_2, &result); 1494 return result; 1495 } 1496 return result; 1497} 1498 1499 1500napi_value testNativeWindowNativeWindowAtDetachDifferentBufferAbnormal2(napi_env env, napi_callback_info info, 1501 Paramater paramater) 1502{ 1503 napi_value result = nullptr; 1504 auto flag = OH_NativeWindow_NativeWindowAttachBuffer(paramater.nativeWindow2, paramater.nativeWindowBuffer1); 1505 if (flag != 0) { 1506 napi_create_int32(env, CONSTANT_3 * CONSTANT_1000 + CONSTANT_1, &result); 1507 return result; 1508 } 1509 flag = OH_NativeWindow_NativeWindowAttachBuffer(paramater.nativeWindow1, paramater.nativeWindowBuffer2); 1510 if (flag != 0) { 1511 napi_create_int32(env, CONSTANT_3 * CONSTANT_1000 + CONSTANT_2, &result); 1512 return result; 1513 } 1514 // 4. 1515 flag = OH_NativeWindow_NativeWindowDetachBuffer(paramater.nativeWindow1, paramater.nativeWindowBuffer1); 1516 if (flag != 0) { 1517 napi_create_int32(env, CONSTANT_4 * CONSTANT_1000 + CONSTANT_1, &result); 1518 return result; 1519 } 1520 flag = OH_NativeWindow_NativeWindowDetachBuffer(paramater.nativeWindow2, paramater.nativeWindowBuffer2); 1521 if (flag != 0) { 1522 napi_create_int32(env, CONSTANT_4 * CONSTANT_1000 + CONSTANT_2, &result); 1523 return result; 1524 } 1525 // 5. 1526 flag = OH_NativeWindow_NativeWindowAttachBuffer(paramater.nativeWindow2, paramater.nativeWindowBuffer1); 1527 if (flag == 0) { 1528 napi_create_int32(env, CONSTANT_5 * CONSTANT_1000 + CONSTANT_1, &result); 1529 return result; 1530 } 1531 flag = OH_NativeWindow_NativeWindowAttachBuffer(paramater.nativeWindow1, paramater.nativeWindowBuffer2); 1532 if (flag == 0) { 1533 napi_create_int32(env, CONSTANT_5 * CONSTANT_1000 + CONSTANT_2, &result); 1534 return result; 1535 } 1536 return result; 1537} 1538 1539napi_value testNativeWindowNativeWindowAtDetachDifferentBufferAbnormal(napi_env env, napi_callback_info info) 1540{ 1541 napi_value result = nullptr; 1542 struct Paramater paramater; 1543 struct result result1 = InitNativeWindow(); 1544 struct result result2 = InitNativeWindow(); 1545 OH_NativeImage *image1 = result1.image; 1546 paramater.nativeWindow1 = result1.nativeWindow; 1547 OH_NativeImage *image2 = result2.image; 1548 paramater.nativeWindow2 = result2.nativeWindow; 1549 OH_NativeBuffer_Config config{ 1550 .width = 0x100, 1551 .height = 0x100, 1552 .format = NATIVEBUFFER_PIXEL_FMT_RGBA_8888, 1553 .usage = NATIVEBUFFER_USAGE_CPU_READ | NATIVEBUFFER_USAGE_CPU_WRITE | NATIVEBUFFER_USAGE_MEM_DMA, 1554 }; 1555 paramater.nativeBuffer1 = OH_NativeBuffer_Alloc(&config); 1556 paramater.nativeBuffer2 = OH_NativeBuffer_Alloc(&config); 1557 paramater.nativeWindowBuffer1 = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(paramater.nativeBuffer1); 1558 if (paramater.nativeWindowBuffer1 == nullptr) { 1559 napi_create_int32(env, CONSTANT_1000 + CONSTANT_1, &result); 1560 return result; 1561 } 1562 paramater.nativeWindowBuffer2 = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(paramater.nativeBuffer2); 1563 if (paramater.nativeWindowBuffer2 == nullptr) { 1564 napi_create_int32(env, CONSTANT_1000 + CONSTANT_2, &result); 1565 return result; 1566 } 1567 result = testNativeWindowNativeWindowAtDetachDifferentBufferAbnormal1(env, info, paramater); 1568 if (result != nullptr) { 1569 return result; 1570 } 1571 result = testNativeWindowNativeWindowAtDetachDifferentBufferAbnormal2(env, info, paramater); 1572 if (result != nullptr) { 1573 return result; 1574 } 1575 DestroyNativeWindowImage(image1, paramater.nativeWindow1); 1576 DestroyNativeWindowImage(image2, paramater.nativeWindow2); 1577 OH_NativeWindow_DestroyNativeWindowBuffer(paramater.nativeWindowBuffer1); 1578 OH_NativeWindow_DestroyNativeWindowBuffer(paramater.nativeWindowBuffer2); 1579 OH_NativeBuffer_Unreference(paramater.nativeBuffer1); 1580 OH_NativeBuffer_Unreference(paramater.nativeBuffer2); 1581 napi_create_int32(env, SUCCESS, &result); 1582 return result; 1583} 1584 1585napi_value testNativeWindowNativeWindowHandleOptNullptr(napi_env env, napi_callback_info info) 1586{ 1587 napi_value result = nullptr; 1588 1589 int code = SET_BUFFER_GEOMETRY; 1590 auto flag = OH_NativeWindow_NativeWindowHandleOpt(nullptr, code, 100, 100); 1591 if (flag != CONSTANT_40001000) { 1592 napi_create_int32(env, FAIL, &result); 1593 return result; 1594 } 1595 1596 napi_create_int32(env, SUCCESS, &result); 1597 return result; 1598} 1599 1600 1601napi_value testNativeWindowNativeWindowHandleOptSetGetBufferGeometryNormal(napi_env env, napi_callback_info info) 1602{ 1603 napi_value result = nullptr; 1604 1605 struct result result1 = InitNativeWindow(); 1606 OH_NativeImage *image = result1.image; 1607 OHNativeWindow *nativeWindow = result1.nativeWindow; 1608 1609 int arr[][2] = {{0, 0}, {2147483647, 2147483647}, {100, 100}, {-1000, -1000}, {-1000, 1000}, 1610 {1000, -1000}, {-2147483647, -2147483647}, {-1, -1}}; 1611 int width1, height1; 1612 auto ret = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, GET_BUFFER_GEOMETRY, &width1, &height1); 1613 if (ret != 0) { 1614 napi_create_int32(env, CONSTANT_1, &result); 1615 return result; 1616 } 1617 1618 for (int i = 0; i < sizeof(arr) / sizeof(int[2]); ++i) { 1619 int width = arr[i][0]; 1620 int height = arr[i][1]; 1621 auto flag = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, SET_BUFFER_GEOMETRY, width, height); 1622 if (flag != 0) { 1623 napi_create_int32(env, (i + 1) * CONSTANT_1000 + CONSTANT_1, &result); 1624 return result; 1625 } 1626 int width2, height2; 1627 flag = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, GET_BUFFER_GEOMETRY, &height2, &width2); 1628 if (flag != 0) { 1629 napi_create_int32(env, (i + 1) * CONSTANT_1000 + CONSTANT_2, &result); 1630 return result; 1631 } 1632 if (width != width2 || height != height2) { 1633 napi_create_int32(env, (i + 1) * CONSTANT_1000 + CONSTANT_3, &result); 1634 return result; 1635 } 1636 } 1637 1638 DestroyNativeWindowImage(image, nativeWindow); 1639 napi_create_int32(env, SUCCESS, &result); 1640 return result; 1641} 1642 1643napi_value testNativeWindowNativeWindowHandleOptSetGetBufferGeometryAbnormal(napi_env env, napi_callback_info info) 1644{ 1645 napi_value result = nullptr; 1646 OH_NativeImage *image1 = InitNativeWindow().image; 1647 OHNativeWindow *nativeWindow = InitNativeWindow().nativeWindow; 1648 1649 int32_t width, height; 1650 1651 // 1. 1652 auto flag = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, SET_BUFFER_GEOMETRY, NULL, NULL); 1653 if (flag != 0) { // 应为 非0 1654 napi_create_int32(env, CONSTANT_1000 + CONSTANT_1, &result); 1655 return result; 1656 } 1657 flag = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, GET_BUFFER_GEOMETRY, &height, &width); 1658 if (flag != 0) { // 应为 成功 1659 napi_create_int32(env, CONSTANT_1000 + CONSTANT_2, &result); 1660 return result; 1661 } 1662 if (width != 0 || height != 0) { 1663 napi_create_int32(env, CONSTANT_1000 + CONSTANT_3, &result); 1664 return result; 1665 } 1666 // 2.2147483648 1667 flag = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, SET_BUFFER_GEOMETRY, CONSTANT_9999999999999999999, 1668 CONSTANT_9999999999999999999); 1669 if (flag != 0) { // 应为 非0 1670 napi_create_int32(env, CONSTANT_2 * CONSTANT_1000 + CONSTANT_1, &result); 1671 return result; 1672 } 1673 flag = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, GET_BUFFER_GEOMETRY, &height, &width); 1674 if (flag != 0) { // 应为 成功 1675 napi_create_int32(env, CONSTANT_2 * CONSTANT_1000 + CONSTANT_2, &result); 1676 return result; 1677 } 1678 // 3. 1679 flag = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, SET_BUFFER_GEOMETRY, "abc", "abc"); 1680 if (flag != 0) { // 应为 失败 1681 napi_create_int32(env, CONSTANT_2 * CONSTANT_1000 + CONSTANT_3, &result); 1682 return result; 1683 } 1684 1685 DestroyNativeWindowImage(image1, nativeWindow); 1686 napi_create_int32(env, SUCCESS, &result); 1687 return result; 1688} 1689