From 4a117f44362b71f49309978ff09ab2b59329249b Mon Sep 17 00:00:00 2001 From: ge-yafang Date: Wed, 18 May 2022 17:22:17 +0800 Subject: [PATCH] update docs Signed-off-by: ge-yafang --- en/application-dev/napi/napi-guidelines.md | 637 +++++ zh-cn/application-dev/Readme-CN.md | 13 +- .../ability/figures/contextIntroduction.png | Bin 56717 -> 0 bytes .../page-ability-lifecycle-callbacks.png | Bin 50304 -> 0 bytes zh-cn/application-dev/ability/wantagent.md | 2 +- zh-cn/application-dev/napi/Readme-CN.md | 5 + .../napi/drawing-guidelines.md | 208 ++ zh-cn/application-dev/napi/napi-guidelines.md | 639 +++++ .../napi/rawfile-guidelines.md | 174 ++ .../application-dev/quick-start/Readme-CN.md | 2 +- zh-cn/application-dev/reference/Readme-CN.md | 8 +- .../reference/native-apis/Readme-CN.md | 33 + .../reference/native-apis/_drawing.md | 2107 +++++++++++++++++ .../reference/native-apis/_hi_log.md | 327 +++ .../reference/native-apis/_native___bundle.md | 61 + .../reference/native-apis/_native_window.md | 339 +++ .../_o_h___drawing___bitmap_format.md | 61 + .../native-apis/_o_h___native_x_component.md | 575 +++++ .../_o_h___native_x_component___callback.md | 29 + ..._o_h___native_x_component___touch_event.md | 29 + ..._o_h___native_x_component___touch_point.md | 27 + .../native-apis/_raw_file_descriptor.md | 76 + .../reference/native-apis/annotated.md | 13 + .../native-apis/drawing__bitmap_8h.md | 38 + .../native-apis/drawing__brush_8h.md | 31 + .../native-apis/drawing__canvas_8h.md | 37 + .../native-apis/drawing__color_8h.md | 26 + .../drawing__font__collection_8h.md | 27 + .../reference/native-apis/drawing__path_8h.md | 34 + .../reference/native-apis/drawing__pen_8h.md | 47 + .../drawing__text__declaration_8h.md | 30 + .../drawing__text__typography_8h.md | 63 + .../native-apis/drawing__types_8h.md | 38 + .../native-apis/external__window_8h.md | 37 + .../reference/native-apis/files.md | 35 + .../reference/native-apis/index.md | 15 + .../reference/native-apis/log_8h.md | 48 + .../native__interface__bundle_8h.md | 26 + .../native__interface__xcomponent_8h.md | 62 + .../public_sys-resources/icon-caution.gif | Bin 0 -> 580 bytes .../public_sys-resources/icon-danger.gif | Bin 0 -> 580 bytes .../public_sys-resources/icon-note.gif | Bin 0 -> 394 bytes .../public_sys-resources/icon-notice.gif | Bin 0 -> 406 bytes .../public_sys-resources/icon-tip.gif | Bin 0 -> 253 bytes .../public_sys-resources/icon-warning.gif | Bin 0 -> 580 bytes .../reference/native-apis/raw__dir_8h.md | 37 + .../reference/native-apis/raw__file_8h.md | 48 + .../reference/native-apis/rawfile.md | 461 ++++ .../reference/native-apis/total.md | 7 + zh-cn/application-dev/website.md | 31 +- 50 files changed, 6535 insertions(+), 8 deletions(-) create mode 100644 en/application-dev/napi/napi-guidelines.md delete mode 100644 zh-cn/application-dev/ability/figures/contextIntroduction.png delete mode 100644 zh-cn/application-dev/ability/figures/page-ability-lifecycle-callbacks.png create mode 100644 zh-cn/application-dev/napi/Readme-CN.md create mode 100644 zh-cn/application-dev/napi/drawing-guidelines.md create mode 100644 zh-cn/application-dev/napi/napi-guidelines.md create mode 100644 zh-cn/application-dev/napi/rawfile-guidelines.md create mode 100644 zh-cn/application-dev/reference/native-apis/Readme-CN.md create mode 100644 zh-cn/application-dev/reference/native-apis/_drawing.md create mode 100644 zh-cn/application-dev/reference/native-apis/_hi_log.md create mode 100644 zh-cn/application-dev/reference/native-apis/_native___bundle.md create mode 100644 zh-cn/application-dev/reference/native-apis/_native_window.md create mode 100644 zh-cn/application-dev/reference/native-apis/_o_h___drawing___bitmap_format.md create mode 100644 zh-cn/application-dev/reference/native-apis/_o_h___native_x_component.md create mode 100644 zh-cn/application-dev/reference/native-apis/_o_h___native_x_component___callback.md create mode 100644 zh-cn/application-dev/reference/native-apis/_o_h___native_x_component___touch_event.md create mode 100644 zh-cn/application-dev/reference/native-apis/_o_h___native_x_component___touch_point.md create mode 100644 zh-cn/application-dev/reference/native-apis/_raw_file_descriptor.md create mode 100644 zh-cn/application-dev/reference/native-apis/annotated.md create mode 100644 zh-cn/application-dev/reference/native-apis/drawing__bitmap_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/drawing__brush_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/drawing__canvas_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/drawing__color_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/drawing__font__collection_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/drawing__path_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/drawing__pen_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/drawing__text__declaration_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/drawing__text__typography_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/drawing__types_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/external__window_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/files.md create mode 100644 zh-cn/application-dev/reference/native-apis/index.md create mode 100644 zh-cn/application-dev/reference/native-apis/log_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/native__interface__bundle_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/native__interface__xcomponent_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/public_sys-resources/icon-caution.gif create mode 100644 zh-cn/application-dev/reference/native-apis/public_sys-resources/icon-danger.gif create mode 100644 zh-cn/application-dev/reference/native-apis/public_sys-resources/icon-note.gif create mode 100644 zh-cn/application-dev/reference/native-apis/public_sys-resources/icon-notice.gif create mode 100644 zh-cn/application-dev/reference/native-apis/public_sys-resources/icon-tip.gif create mode 100644 zh-cn/application-dev/reference/native-apis/public_sys-resources/icon-warning.gif create mode 100644 zh-cn/application-dev/reference/native-apis/raw__dir_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/raw__file_8h.md create mode 100644 zh-cn/application-dev/reference/native-apis/rawfile.md create mode 100644 zh-cn/application-dev/reference/native-apis/total.md diff --git a/en/application-dev/napi/napi-guidelines.md b/en/application-dev/napi/napi-guidelines.md new file mode 100644 index 0000000000..f2b6fe0e20 --- /dev/null +++ b/en/application-dev/napi/napi-guidelines.md @@ -0,0 +1,637 @@ +# Using Native APIs in Application Projects + +OpenHarmony applications use JavaScript (JS) when calling native APIs. The native APIs (NAPIs) provided by the **arkui_napi** repository are used to implement the interaction with JS. Currently, the **arkui_napi** repository supports some third-party **Node.js** interfaces. The names of the NAPIs are the same as those in the third-party **Node.js**. For details about the interfaces supported, see `libnapi.ndk.json` in this repository. + +## How to Develop + +The IDE has a default project that uses NAPIs. You can choose `File` > `New` > `Create Project` to create a `Native C++` project. The **cpp** directory is generated in the **main** directory. You can use the NAPIs provided by the **arkui_napi** repository for development. + +You can `import` the native .so that contains the JS processing logic. For example, `import hello from 'libhello.so'` to use the **libhello.so** capability. Then, the JS object created using the NAPI can be passed to the `hello` object of the application to call the native capability. + +## Development Guidelines + +### Registration + +* Add **static** to the **nm_register_func** function to prevent symbol conflicts with other .so files. +* The name of the module registration entry, that is, the function decorated by **\_\_attribute\_\_((constructor))**, must be unique. +### .so Naming Rules + +Each module has a .so file. For example, if the module name is `hello`, name the .so file **libhello.so**. The `nm_modname` field in `napi_module` must be `hello`, which is the same as the module name. The sample code for importing the .so file is `import hello from 'libhello.so'`. + +### JS Objects and Threads + +The Ark engine prevents NAPIs from being called to operate JS objects in non-JS threads. Otherwise, the application will crash. + +* The NAPIs can be used only in JS threads. +* **env** is bound to a thread and cannot be used across threads. The JS object created by a NAPI can be used only in the thread, in which the object is created, that is, the JS object is bound to the **env** of the thread. + +### napi_create_async_work + +**napi_create_async_work** has two callbacks: + +* **execute**: processes service logic asynchronously. This callback is not executed by a JS thread; therefore, it cannot call any NAPI. The return value of **execute** is processed by the **complete** callback. + +* **complete**: calls the NAPI to encapsulate the return value of **execute** into a JS object and return it for processing. This callback is executed by a JS thread. + +```c++ +napi_status napi_create_async_work(napi_env env, + napi_value async_resource, + napi_value async_resource_name, + napi_async_execute_callback execute, + napi_async_complete_callback complete, + void* data, + napi_async_work* result) +``` + + + +## Example 1: Encapsulating Synchronous and Asynchronous APIs for the Storage Module + +### Overview + +This example shows how to encapsulate the synchronous and asynchronous APIs of the storage module. The storage module implements the functions of storing, obtaining, deleting, and clearing data. + +### API Declaration + +```typescript +import { AsyncCallback } from './basic'; +declare namespace storage { + function get(key: string, callback: AsyncCallback): void; + function get(key: string, defaultValue: string, callback: AsyncCallback): void; + function get(key: string, defaultValue?: string): Promise; + function set(key: string, value: string, callback: AsyncCallback): void; + function remove(key: string, callback: AsyncCallback): void; + function clear(callback: AsyncCallback): void; + function getSync(key: string, defaultValue?: string): string; + function setSync(key: string, value: string): void; + function removeSync(key: string): void; + function clearClear(): void; +} +export default storage; +``` + + + +### Implementation + +You can obtain the complete code from `sample/native_module_storage/` in the **arkui_napi** repository. + +#### Registering the Module + +Register four synchronous APIs (`getSync`, `setSync`, `removeSync`, and`clearSync`) and four asynchronous APIs (`get`, `set`, `remove`, and `clear`). + +```c++ +/*********************************************** + * Module export and register + ***********************************************/ +static napi_value StorgeExport(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + DECLARE_NAPI_FUNCTION("get", JSStorageGet), + DECLARE_NAPI_FUNCTION("set", JSStorageSet), + DECLARE_NAPI_FUNCTION("remove", JSStorageDelete), + DECLARE_NAPI_FUNCTION("clear", JSStorageClear), + + DECLARE_NAPI_FUNCTION("getSync", JSStorageGetSync), + DECLARE_NAPI_FUNCTION("setSync", JSStorageSetSync), + DECLARE_NAPI_FUNCTION("deleteSync", JSStorageDeleteSync), + DECLARE_NAPI_FUNCTION("clearSync", JSStorageClearSync), + }; + NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); + return exports; +} + +// Storage module +static napi_module storage_module = {.nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = StorgeExport, + .nm_modname = "storage", + .nm_priv = ((void*)0), + .reserved = {0}}; + +// Register the storage module +extern "C" __attribute__((constructor)) void StorageRegister() +{ + napi_module_register(&storage_module); +} +``` + +#### Implementing getSync + +The **getSync** function registered for the storage module is **JSStorageGetSync**. Obtain data from `gKeyValueStorage`, create a string object, and return it. + +```c +static napi_value JSStorageGetSync(napi_env env, napi_callback_info info) +{ + GET_PARAMS(env, info, 2); + NAPI_ASSERT(env, argc >= 1, "requires 1 parameter"); + char key[32] = {0}; + size_t keyLen = 0; + char value[128] = {0}; + size_t valueLen = 0; + + // Parse parameters. + for (size_t i = 0; i < argc; i++) { + napi_valuetype valueType; + napi_typeof(env, argv[i], &valueType); + + if (i == 0 && valueType == napi_string) { + napi_get_value_string_utf8(env, argv[i], key, 31, &keyLen); + } else if (i == 1 && valueType == napi_string) { + napi_get_value_string_utf8(env, argv[i], value, 127, &valueLen); + break; + } else { + NAPI_ASSERT(env, false, "type mismatch"); + } + } + + // Service logic for obtaining data. This example simply obtains data from a global variable. + auto itr = gKeyValueStorage.find(key); + napi_value result = nullptr; + if (itr != gKeyValueStorage.end()) { + // Use the data obtained to create a JS object of the string type. + napi_create_string_utf8(env, itr->second.c_str(), itr->second.length(), &result); + } else if (valueLen > 0) { + // If no data is obtained, use the default value to create a JS object. + napi_create_string_utf8(env, value, valueLen, &result); + } else { + NAPI_ASSERT(env, false, "key does not exist"); + } + // Return the result. + return result; +} +``` + +#### Implementing get + +The `get` function registered for the storage module is `JSStorageGet`. + +```c +static napi_value JSStorageGet(napi_env env, napi_callback_info info) +{ + GET_PARAMS(env, info, 3); + NAPI_ASSERT(env, argc >= 1, "requires 1 parameter"); + + // StorageAsyncContext is a custom class used to store data during execution. + StorageAsyncContext* asyncContext = new StorageAsyncContext(); + + asyncContext->env = env; + + // Obtain parameters. + for (size_t i = 0; i < argc; i++) { + napi_valuetype valueType; + napi_typeof(env, argv[i], &valueType); + + if (i == 0 && valueType == napi_string) { + napi_get_value_string_utf8(env, argv[i], asyncContext->key, 31, &asyncContext->keyLen); + } else if (i == 1 && valueType == napi_string) { + napi_get_value_string_utf8(env, argv[i], asyncContext->value, 127, &asyncContext->valueLen); + } else if (i == 1 && valueType == napi_function) { + napi_create_reference(env, argv[i], 1, &asyncContext->callbackRef); + break; + } else if (i == 2 && valueType == napi_function) { + napi_create_reference(env, argv[i], 1, &asyncContext->callbackRef); + } else { + NAPI_ASSERT(env, false, "type mismatch"); + } + } + + napi_value result = nullptr; + + // Determine whether promise or callback is used based on the parameters. + if (asyncContext->callbackRef == nullptr) { + // Create a promise. + napi_create_promise(env, &asyncContext->deferred, &result); + } else { + napi_get_undefined(env, &result); + } + + napi_value resource = nullptr; + napi_create_string_utf8(env, "JSStorageGet", NAPI_AUTO_LENGTH, &resource); + + napi_create_async_work( + env, nullptr, resource, + // Callback 1: This callback contains the service logic to be asynchronously executed and is asynchronously executed by the NAPI. Do not operate JS objects using theNAPI because the execution is asynchronous. + [](napi_env env, void* data) { + StorageAsyncContext* asyncContext = (StorageAsyncContext*)data; + auto itr = gKeyValueStorage.find(asyncContext->key); + if (itr != gKeyValueStorage.end()) { + strncpy_s(asyncContext->value, 127, itr->second.c_str(), itr->second.length()); + asyncContext->status = 0; + } else { + asyncContext->status = 1; + } + }, + // Callback 2: This callback is invoked after callback 1 is complete. The JS thread invokes the callback passed in. + [](napi_env env, napi_status status, void* data) { + StorageAsyncContext* asyncContext = (StorageAsyncContext*)data; + napi_value result[2] = {0}; + if (!asyncContext->status) { + napi_get_undefined(env, &result[0]); + napi_create_string_utf8(env, asyncContext->value, strlen(asyncContext->value), &result[1]); + } else { + napi_value message = nullptr; + napi_create_string_utf8(env, "key does not exist", NAPI_AUTO_LENGTH, &message); + napi_create_error(env, nullptr, message, &result[0]); + napi_get_undefined(env, &result[1]); + } + if (asyncContext->deferred) { + // If a promise is used, check the result of callback 1. + if (!asyncContext->status) { + // Triggered when callback 1 is successful (status is 1), that is, to invoke the callback passed in then in the promise. + napi_resolve_deferred(env, asyncContext->deferred, result[1]); + } else { + // Triggered when callback 1 fails (status is 0), that is, to invoke the callback passed in catch in the promise. + napi_reject_deferred(env, asyncContext->deferred, result[0]); + } + } else { + // If a callback is used, use napi_call_function to invoke the callback to return the result. + napi_value callback = nullptr; + napi_value returnVal; + napi_get_reference_value(env, asyncContext->callbackRef, &callback); + napi_call_function(env, nullptr, callback, 2, result, &returnVal); + napi_delete_reference(env, asyncContext->callbackRef); + } + napi_delete_async_work(env, asyncContext->work); + delete asyncContext; + }, + (void*)asyncContext, &asyncContext->work); + napi_queue_async_work(env, asyncContext->work); + + return result; +} +``` + +### JS Sample Code + +```js +import storage from 'libstorage.so'; + +export default { + testGetSync() { + const name = storage.getSync('name'); + console.log('name is ' + name); + }, + testGet() { + storage.get('name') + .then(date => { + console.log('name is ' + data); + }) + .catch(error => { + console.log('error: ' + error); + }); + } +} +``` + + + +## Example 2: Binding Native and JS Objects for the NetServer Module + +### Overview + +This example shows how to implement the `on/off/once` method and bind C++ and JS objects using the **wrap** API. The NetServer module implements the network service. + +### API Declaration + +```typescript +export class NetServer { + function start(port: number): void; + function stop(): void; + function on('start' | 'stop', callback: Function): void; + function once('start' | 'stop', callback: Function): void; + function off('start' | 'stop', callback: Function): void; +} +``` + +### Implementation + +You can obtain the complete code from `sample/native_module_netserver/` in the **arkui_napi** repository. + +#### Registering the Module + +```c +static napi_value NetServer::Export(napi_env env, napi_value exports) +{ + const char className[] = "NetServer"; + napi_property_descriptor properties[] = { + DECLARE_NAPI_FUNCTION("start", JS_Start), + DECLARE_NAPI_FUNCTION("stop", JS_Stop), + DECLARE_NAPI_FUNCTION("on", JS_On), + DECLARE_NAPI_FUNCTION("once", JS_Once), + DECLARE_NAPI_FUNCTION("off", JS_Off), + }; + napi_value netServerClass = nullptr; + + napi_define_class(env, className, sizeof(className), JS_Constructor, nullptr, countof(properties), properties, + &netServerClass); + + napi_set_named_property(env, exports, "NetServer", netServerClass); + + return exports; +} +``` + +#### Binding C++ and JS Objects in a Constructor + +```c +napi_value NetServer::JS_Constructor(napi_env env, napi_callback_info cbinfo) +{ + napi_value thisVar = nullptr; + void* data = nullptr; + napi_get_cb_info(env, cbinfo, nullptr, nullptr, &thisVar, &data); + + // C++ native object to be mapped to the JS object. + NetServer* netServer = new NetServer(env, thisVar); + + // Use napi_wrap to bind netServer and thisVar (JS object created). + napi_wrap( + env, thisVar, netServer, + // The JS object is automatically released by the engine. When the JS object is released, the callback is triggered to release netServer. + [](napi_env env, void* data, void* hint) { + printf("NetServer::Destructor\n"); + NetServer* netServer = (NetServer*)data; + delete netServer; + }, + nullptr, nullptr); + + return thisVar; +} +``` + +#### Obtaining the C++ Object from the JS Object + +```c +napi_value NetServer::JS_Start(napi_env env, napi_callback_info cbinfo) +{ + size_t argc = 1; + napi_value argv[1] = {0}; + napi_value thisVar = nullptr; + void* data = nullptr; + napi_get_cb_info(env, cbinfo, &argc, argv, &thisVar, &data); + + NetServer* netServer = nullptr; + // Obtain the C++ object from thisVar using napi_unwrap. + napi_unwrap(env, thisVar, (void**)&netServer); + + NAPI_ASSERT(env, argc >= 1, "requires 1 parameter"); + + napi_valuetype valueType; + napi_typeof(env, argv[0], &valueType); + NAPI_ASSERT(env, valueType == napi_number, "type mismatch for parameter 1"); + + int32_t port = 0; + napi_get_value_int32(env, argv[0], &port); + + // Start the netServer service. + netServer->Start(port); + + napi_value result = nullptr; + napi_get_undefined(env, &result); + return result; +} +``` + +After `netServer->Start` is executed, call back the `start` event registered by `on`. + +```c +int NetServer::Start(int port) +{ + printf("NetServer::Start thread_id: %ld \n", uv_thread_self()); + + struct sockaddr_in addr; + int r; + + uv_ip4_addr("0.0.0.0", port, &addr); + + r = uv_tcp_init(loop_, &tcpServer_); + if (r) { + fprintf(stderr, "Socket creation error\n"); + return 1; + } + + r = uv_tcp_bind(&tcpServer_, (const struct sockaddr*)&addr, 0); + if (r) { + fprintf(stderr, "Bind error\n"); + return 1; + } + + r = uv_listen((uv_stream_t*)&tcpServer_, SOMAXCONN, OnConnection); + if (r) { + fprintf(stderr, "Listen error %s\n", uv_err_name(r)); + return 1; + } + + // Trigger the start event after the service is started. + Emit("start", nullptr); + + return 0; +} +``` + +#### Registering Events (on) + +```c +napi_value NetServer::JS_On(napi_env env, napi_callback_info cbinfo) +{ + size_t argc = 2; + napi_value argv[2] = {0}; + napi_value thisVar = 0; + void* data = nullptr; + napi_get_cb_info(env, cbinfo, &argc, argv, &thisVar, &data); + + NetServer* netServer = nullptr; + // Obtain the NetServer pointer using napi_unwrap. + napi_unwrap(env, thisVar, (void**)&netServer); + + NAPI_ASSERT(env, argc >= 2, "requires 2 parameter"); + + // Verify the parameter type. + napi_valuetype eventValueType; + napi_typeof(env, argv[0], &eventValueType); + NAPI_ASSERT(env, eventValueType == napi_string, "type mismatch for parameter 1"); + + napi_valuetype eventHandleType; + napi_typeof(env, argv[1], &eventHandleType); + NAPI_ASSERT(env, eventHandleType == napi_function, "type mismatch for parameter 2"); + + char type[64] = {0}; + size_t typeLen = 0; + + napi_get_value_string_utf8(env, argv[0], type, 63, &typeLen); + + // Register the event handler. + netServer->On((const char*)type, argv[1]); + + napi_value result = nullptr; + napi_get_undefined(env, &result); + return result; +} +``` + +### JS Sample Code + +```javascript +import { NetServer } from 'libnetserver.so'; + +export default { + testNetServer() { + var netServer = new NetServer(); + netServer.on('start', (event) => {}); + netServer.start(1000); // The port number is 1000. After start is executed, invoke the start callback registered. + } +} +``` + + + +## Example 3: Calling Back a JS API in a Non-JS Thread + +### Overview + +This example describes how to invoke a JS callback in a non-JS thread. For example, a sensor listener is registered for a JS application. The sensor data is reported by an SA. When the SA invokes the client through Inter-Process Communication (IPC), the execution thread is an IPC thread, which is different from the JS thread of the SA. In this case, the JS callback must be thrown to the JS thread to execute. Otherwise, the application will crash. + +### Implementation + +You can obtain the complete code from `sample/native_module_callback/` in the **arkui_napi** repository. + +#### Registering the Module + +Register the `test` API to pass in a parameter. + +```c++ +/*********************************************** + * Module export and register + ***********************************************/ +static napi_value CallbackExport(napi_env env, napi_value exports) +{ + static napi_property_descriptor desc[] = { + DECLARE_NAPI_FUNCTION("test", JSTest) + }; + NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); + return exports; +} + +// Define the callback. +static napi_module callbackModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = CallbackExport, + .nm_modname = "callback", + .nm_priv = ((void*)0), + .reserved = { 0 }, +}; + +// Register the callback. +extern "C" __attribute__((constructor)) void CallbackTestRegister() +{ + napi_module_register(&callbackModule); +} +``` + +#### Obtaining the Loop in env and Throwing the Task to the JS Thread + +```c++ +#include + +#include "napi/native_api.h" +#include "napi/native_node_api.h" + +#include "uv.h" + +struct CallbackContext { + napi_env env = nullptr; + napi_ref callbackRef = nullptr; + int retData = 0; +}; + +void callbackTest(CallbackContext* context) +{ + uv_loop_s* loop = nullptr; + // Save the env when the JS callback is registered. Obtain the loop of the JS thread from env. + napi_get_uv_event_loop(context->env, &loop); + + // Create uv_work_t to transfer private data (int type 1 in this example). Note that memory must be released after the callback is complete. The logic for generating the returned data is omitted here. + uv_work_t* work = new uv_work_t; + context->retData = 1; + work->data = (void*)context; + + // Call the libuv API to throw the JS task to the loop for execution. + uv_queue_work( + loop, + work, + // This callback is executed in another common thread to process tasks asynchronously. After the callback is complete, execute the next callback. In this scenario, the callback does not need to execute any task. + [](uv_work_t* work) {}, + // This callback is executed in the JS thread bound to env. + [](uv_work_t* work, int status) { + CallbackContext* context = (CallbackContext*)work->data; + napi_handle_scope scope = nullptr; + // Open the handle scope to manage the lifecycle of napi_value. Otherwise, memory leakage occurs. + napi_open_handle_scope(context->env, &scope); + if (scope == nullptr) { + return; + } + + // Call the NAPIs. + napi_value callback = nullptr; + napi_get_reference_value(context->env, context->callbackRef, &callback); + napi_value retArg; + napi_create_int32(context->env, context->retData, &retArg); + napi_value ret; + napi_call_function(context->env, nullptr, callback, 1, &retArg, &ret); + napi_delete_reference(context->env, context->callbackRef); + + // Close the handle scope to release napi_value. + napi_close_handle_scope(context->env, scope); + + // Release the work pointer. + if (work != nullptr) { + delete work; + } + + delete context; + } + ); +} + +static napi_value JSTest(napi_env env, napi_callback_info info) +{ + size_t argc = 1; + napi_value argv[1] = { 0 }; + napi_value thisVar = nullptr; + void* data = nullptr; + napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); + + // Obtain the first input parameter, that is, the callback to be invoked subsequently. + napi_valuetype valueType = napi_undefined; + napi_typeof(env, argv[0], &valueType); + if (valueType != napi_function) { + return nullptr; + } + // Save the env and callback for subsequent transfer. + auto asyncContext = new CallbackContext(); + asyncContext->env = env; + napi_create_reference(env, argv[0], 1, &asyncContext->callbackRef); + // Simulate the logic for throwing a task to a non-JS thread. + std::thread testThread(callbackTest, asyncContext); + testThread.detach(); + + return nullptr; +} +``` + +### JS Sample Code + +```js +import callback from 'libcallback.so'; + +export default { + testcallback() { + callback.test((data) => { + console.error('test result = ' + data) + }) + } +} +``` diff --git a/zh-cn/application-dev/Readme-CN.md b/zh-cn/application-dev/Readme-CN.md index 8ae0fa0f45..e18560851a 100644 --- a/zh-cn/application-dev/Readme-CN.md +++ b/zh-cn/application-dev/Readme-CN.md @@ -7,13 +7,14 @@ - [版本说明](../release-notes/Readme.md) - 快速开始 - 快速入门 - - [前言](quick-start/start-overview.md) + - [开发准备](quick-start/start-overview.md) - [使用eTS语言开发(传统代码方式)](quick-start/start-with-ets.md) - [使用eTS语言开发(低代码方式)](quick-start/start-with-ets-low-code.md) - [使用JS语言开发(传统代码方式)](quick-start/start-with-js.md) - [使用JS语言开发(低代码方式)](quick-start/start-with-js-low-code.md) - 开发基础知识 - - [应用包结构说明](quick-start/package-structure.md) + - [应用包结构说明(FA模型)](quick-start/package-structure.md) + - [应用包结构说明(Stage模型)](quick-start/stage-structure.md) - [资源文件的分类](quick-start/basic-resource-file-categories.md) - [SysCap说明](quick-start/syscap.md) - 开发 @@ -34,6 +35,7 @@ - [设备使用信息统计](device-usage-statistics/Readme-CN.md) - [DFX](dfx/Readme-CN.md) - [国际化](internationalization/Readme-CN.md) + - [Native API的相关指导](napi/Readme-CN.md) - 工具 - [DevEco Studio(OpenHarmony)使用指南](quick-start/deveco-studio-user-guide-for-openharmony.md) - 示例教程 @@ -42,6 +44,11 @@ - API参考 - [组件参考(基于JS扩展的类Web开发范式)](reference/arkui-js/Readme-CN.md) - [组件参考(基于TS扩展的声明式开发范式)](reference/arkui-ts/Readme-CN.md) - - [接口参考](reference/apis/Readme-CN.md) + - 接口 + - [JS(含eTS) API参考](reference/apis/Readme-CN.md) + - Native API + - [OpenHarmony Native API](reference/native-apis/Readme-CN.md) + - [标准库](reference/native-lib/third_party_libc/musl.md) + - [Node_API](reference/native-lib/third_party_napi/napi.md) - 贡献 - [参与贡献](../contribute/贡献文档.md) diff --git a/zh-cn/application-dev/ability/figures/contextIntroduction.png b/zh-cn/application-dev/ability/figures/contextIntroduction.png deleted file mode 100644 index a0f1f79d715377e990c4d3c3ea48bdd62aa139bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56717 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�N|#b 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 diff --git a/zh-cn/application-dev/ability/figures/page-ability-lifecycle-callbacks.png b/zh-cn/application-dev/ability/figures/page-ability-lifecycle-callbacks.png deleted file mode 100644 index 4c94556b5c2516ad2978a9a31d833cfb2cf3dd01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50304 zcmeFZXIzup)-MV%3W!1|q97%75fB@_Md=`*^bU%GbOQ#Ej*1lNRk})(7CMBE7(_)t zr9{Ahh9(I`qzMR|8PK)%yUx4UyUy?4d+wM0ZIy@TnPto|{$EMgcnGDNpgS2PWo%l4Jd0)Q#NG~B`Hxe((7kr3zV3g{pNlD~H zp6Ki<=6t^Vsg(PM=>l;VoTZpkrbNwKe|q4|tI zNOdh&b_g|r6GspD#!$*X_z_G2onrX-RyHGtnY59XRbv1N3?>Vl_`sj@iys>BY+?j7P1=&Sjqjw58)IZ&$ zfEINrr9{w9r--(O35)T;9_dmbGkYV?!DHEjL+QCr`p*c;mZ}$u=IJlAZmo_GdopET zNBKe?v^}9NA2+MLz41er3cGT-D#6D?AP6&+VYzW2_(9O9Lox_WjRjlHIHDxeeO#>zzc@UgAQ}TG9|vN z_vj99U2}53~D-TaYkeLW6px|c6@kw@U-ICBhY zM*dC&rgkaV7iOZlJ0)CRRoD{u>1+yuOg5`M0xrGxh=8OEjnuWhe^!;dKqG1n33I9~ z%(I2vq~Q}q8}~lzo>I5O6ihBYp`fdF+S1ToVk5({ zRoj2WLzOt{-2Xnr_gDCJI3>NJA=@>BHn4@Y+a1F?MI7!u|$6}7= zx*BIE-}2~wRP~XoYL`PidNQQb1iHhV;+O6}=02T-h$C!#(OBUMLdUl3Jl)p4V9x1O zkBTvGP;%&LUD~J^Zt_-2?TkTL^jhnAt+IT1@p?w$W$;HBuCOX<9R3b0xjDzJgyzFxI(;JiK zeZy}ixI0kKTz#oLIcV_w&unjmInk6cFTaKpWC%^cdu_1p#586qMGX&qa z@xfLNLDlPUN*6s`x!~11S8W-K+1{Ft83^=P7hWmb-cl?KT=%k8liHx6fo#+838A~A z3)eqlJ<1esdWmMUahJGtpP54!3K#I+{n5d{lHo5@(ah9PyhUsR3mS@FYCLn&a1QOd zks@H+Sng?VUdS1K?yfs_V5cef&YIk@8JN{mOD<4U<2}dwHO&)s@fS83ZFsXr zJYMF$Q!h6>RpUmpV3h1TeL}o}WX>`2QlYkswQniRNvMovxla(Rh@dv{E+QBDof+5X zgB$Q;P4KNp^Ja{QNu~**{kcm+hPLAKw~?j&t|K}oH&>2*P*iG)-Nutmp!UsrkDt7y3m7;frZX?_6jV?)^<$>UzbIwqI3 zx$q-9U&ell5nHzuTZ}*!7ps#kQ8lS|@yfh+Awsh$$yNcyGN%;zs%pFFJHLj%v^ax1spxaaj*{dNC)K4 zo(Nv8&5Y0%^7!o{611``;c@~zEp%4 zZB=kK=>l8^9QNBn+;Hk2g0VFii4lNr$DNJ9 zz_z-B$4`fh@u2rz!^M@nn`Bb3l{pcTj8SkoMa#K)Enm|@&C?>?!&lFt%aylc{>*^R z{OZVElJ_Uuq8(T{zqjFFpNDz7oY2p_*my_DElg^wd7gS4H8)7F|q3TM(g?W2FA0!bBwqqJKAPbkg+pc zNGt{c$M2jE%&9q|%~8f%n8Y5VXit3Rwwdx{F#8UQ&&znzu5)>1ehgWYS98s9;Hsym zc@N%=%Qc(+jn`D*iNw>o$t}sZ6rdK6uwt$Iov>H2h!2FcA38T?FUp83V8ve?eXtKz zcwchj^&F-rvFLNVJ$6M&L#FdagJ6B!TK)Yy?vGQB6^Vi~Vs`8MjE^)x38ba+u=2E% z#jD6LC+V`ITE1prjj)D{Z&N1|I%?KO(5v7_h+yc zmOOF~5D&mhumj2O{O5VmtSzV6pK0+oajRL_M-=kKpTn*omu~2;&=rpc&si6-`*oTS z#}IdDmL?ElXAI0wQ(|jAPxP(0Q^V0=B!x=H?0cBxC7+7wg56ihKO_Zx%!6lZT@$&Q zCE_po#g7^TK9)iq!yU^_i9Ld>;lG`|8Rqmr><|@EkH+m4xvqv+6FsyZ2~zolKN-FY z(%^o=}2v*dQeaPvMoX@g)ro692 zJyN%g1UvD2Xr!i=caB2<6;&?jF3@s+drrmmEJktLTg>6=+WA&|U%hm5;7&_}-?}?@ zRfy{;09trZT6yUEOJMq1)>>d%r$9F5Z?~nsuKszcSJBw5Y4HHzO*F~M_VdOHi8$4r z&f0UR;Wjk{thRmU5ozm_IR3W@N=+@7?f>{J&#lQfM^J0?_-5>lc{+~H=_;+wxw^5F z{)OuRg&s^3y^W$F&z2WWhCvgCcRjevxhSzHMc0h|!4uR!m-}>ypXxn`U1F`uRzr6( z&mX9+wrcXe;=i-C_BzT7Vg=B^zpU`uN#(A3u)-eQB3pOcC@4kYX3A*G#{A`Jmi7EE zex9oS^X{abPZ$)*sHSh@+m{!?aaeuWF+uXd_Oysw%5%4Dmtze~dJKhZG9WD0#$TGk z)YIDLM(T>iM&1VssO_XCdl)wqC6ish)+9;@`J!-qU<+b2f9PooFJBmIsa|#~&2hK*= z9Hbn*srv+b2KGobX#ISYevcY{yHjw$b-6xfN52Q3>jt2y4alN4pU+cKQe)MEB!?F# z?}vThZ}ZcX^lIVR889C+AZ%D${)o3Uw!T~l@Ydxp;d>Mi*oiC(x9W#n5Q=Z=LF*F? zc6SX^@ka7=%VLda8iBZ2ZkP}NrysB|7APDR4IX__k)QXI=5+S=-bFNL8s3N(J=-w< zRD~5_u~2};LRmU5Qb0@@KSy~cJLKsLGuSAULKW`X;lYz-vkj`T>=%O&2S6MiidR1h zrwG0Q_0DOI&!5K;U|Ev*+a%}QO|-Q4O138=E2rHzTRg@4dn^K9Drz_121X< zFXC`>4HJ=vye(LE_Y4bTz$snM)1giTghf<#XPFahxaOj2`c(?bK=7??lY9#%LYn(( z7zYFij>!01+A9|*Ae1!URAu4LX>YP9mV`E$b%}6-3=I<%_&?`BRy}8fJOPEr3W8Xi zPBr$ap#!s*`DE*K1Q{jDi`^Hz3=-eWbSx)=0zwO3K7wTF!qH4EHQkDQWomHbi;$zHR?YYtQHxjoIHvWK; zZAil*AO=ncD=Kb2+?aH0DQZd7XnkE9xU$rc!9|U*Q3MYKd~%niMRtqkEK@;9fDYn% zDH*_6gkj#BUV*dJ#c{@4a)86NZG)iN8k)Qr-i2At1>=u;uX33Uhip z#4SOct3iR(KIf)d>o7IZ9;r+0xqwA;n-5jXQM5Vbn^W%f>eBz8$~4a{N-j)zdfjQcpgJ%!12rc8+1i zci8)ssP6-c`anPj(7)iI0N(WBDRq?k4!#s2LhI|Yr zImyk3HW&u}9hT^@4!89;YM5LGc>lud(f5W}6cu{}$O+9L)_kvy^HJxj>`~L| zDd#uudC)@kz1Fi~#fr)OP)h24Fd9_|^dQ(fGS#MJl8-;dgO207HhCI`OJYJS0XzfF z&{e$|Ml!-7)7^%uyPcun%y33Ho2~Gm9VQ>%qx5ZE`6A68z(nZaQo zZyx~=At&pp>HbiRT~bf8>^;nUR5TM%aTq|HQXk8DfY2c$og>I@2h~peQLOm<&-)Q{ z$ipgWp76_b0Lf%n^!1Su2N<~7H(JDJG%q?hSZ$b{z~*p`nifI>mXAq?^NEtp$-R#i z^sq#m16*jSc{*l^0VnreT?`Im0&~lEhSBbxIv`u%_GzCgnggZGS3SZHf)qVFcbg4D z1!_GfvsjW6oDOm$f^>ML-7ZHWb8MG`U;BfDpPO8?k*Du>>UB%oK*@CyYsBQL#rZjV zJK?;@x0B3IZAx-u^Imj@VK}qSh$0@J2f^ULTF|P(ctXcQQLga*z>yDY*8MzAUACfi z^T;JH!BA5DFRtxE>O;y0YTy?|l14V@O~lUXO=xvmW!ja@l2bJdH>;-^3NM!dDSCw& zMggVMeS98S3LRj1S^923_HpSYI@)PJ2KFNRuhPC$5~Z2O*C)O$oljvoCR~5r-Bb~V zyYW-%I0W_;tk~uy?*ot_26Y{abPj!w)P;Xfk69~fn9LU5)~2x5p-2t48^MHeBumS_ z?bX44{go$y4(>IyPSHaLSJWdJl6ZNCnnl=4lp>SvJ<%?@h7~Wo%^(7e2azcdCvf+E z+gXT4xYNSfG1bd;vd>gaMzjKiS*yh;B?yi3_LmNk8l2CdyqtVdl7vsq6UJ!!#)sw| zgD+eB6?il_B4}7mC8)Gy(kt}zYCAV0Fws>{pb*$cP#zk%Bzx{6^q?OY0L!gzd{NXt z9z8n{|4}-BNWNzOaz$fK!^}d!U}M2lS3(KiV3Rh{2Ss1qir+7BSMK&D{lVhi45l^F zv+@0j*5W2F-xU4GabQPA2^@h!f}Ozu9LkN4M%ZK^&JtwEgmtqq-JcT0U%p3JN9Wj! zx@2&(pIj~KYq&_`c%M(5Mw#6e9E;I@b%qOVJiOye593c!zSK-nD~y5R^v>zFa^I2y zvH#_x-Z|(~?${=bC-#>5!O*O#8x_sgfdK=vEvvo7VuvNN-Q=$_PUme;jTUiV;YYYJY&hf-@SHpmY=VO$B}jITvPQEfICdDCMA6bWKP_ zz2dE*#Z|`fCmz1NG;_v{1xlTdOo(T(1GumGSs%glDsEiQ^oHS3n7)%x_dnG|Fx`#Y z8}=4;l|xJ_U(7>zyt}V$>l{)J$$tB6tn48CPTQXkWSnlN}XEwtm|WVn`JOKxuJ{4 zOdksO@Qu`)uVZp+Ev$=pzMbLnsojyFstVB^zMpPe!j~Zz^Mn`8c~$QS5IDiPWu=Cl z2tw!)io7mIc}oP^53scN+;~1BCJv;U;Sl_`|G??U$hht& zwQN@gT#lKdH*5e2lrAMob~=x{bw!G?2{`P;=Wg%2Z-=)#%G4j{GVg74D@Q-jRI zAP^D@|D29+C#1!`i=v&1{Y)o+w6&V3z{A^Of1_pPjM4Y*xr{7sw8u@P2&hmY0R4q9 zb|TiLkw9qbq8HvCMY(rpDepvC--_+BUEO@mKUA+Lm3bI7|Yu?+` zmp~2z87?MWEWJpPzSzsWd-A1IM^#|st5^L)FOiW)UIu|ZI!gzqpd15vb4M_f z_1e+eIaddk6tRU~O4jgO*VNb;ZTUZ7p>(v!!-q1a;Fl>tDh=Z6Qvo}^Nqd}NR;8rs z&GC2JM&^!slxly!1ACI{{!7d14PhA7_^_lGpgibMbSuG?z>FSf3h{;b9dm4f`2qKrcQaKW4qP|y6LK4FI1VMfh%z3kc_@%9vTm;E{ziiY+ zxX50Hf6-GPZ?0sa)e|t{g{`^qT%H=yMh`d{y_#b%f?N$jHHq?xusgy|NHdgKn?FQo zkd)E6PXSd0ljpVZW`jtB2m%#OynvO%%NmBmEHRyw!HP3G3>z>QJBmg7m`;7sE2S207Ot!QFNlw0C!fBk-12pW`Pk;o1Ynt z-}P>Q8~E?vg2z&VdU=oU!+!8MD|nIEc;^tT9B>_Hw#iX7i>_{Y`B30Zz|o;RTFn4- zpCzOBOGVV@DFNt)#xui}vEmfh(}ECJ!6LLX>Ue>AuK?b&mip}wbQMss;S>w2X^<-> z6Gjp617OsLOyLK>#|#0ru{xp{We><*qUpu8Svo?4pp*_kUaBCBa&Ddg;8T+uj9Txk zwxSZuMj_-ed*Jafr=QY17pZeq!M=#vVrc>36l^>0vY=jAZUY8%H^B|XfvmB)brfI| z5KJp~<21oSCz2ulVHVaZxU*ZAZ(s(3A4M_mxMd0e2Z8%nZlezB#H57OZ z2h?=#f!RBgDTldgnBWcYvBaurF;DCOmzLvQ3aBH1TfCJ2JGE>#zj2ER~uYh)!c7bsQghzQKph+o<*%yk*0&F!Me9Ww|~xx z5mQ>%HD@G0&X)yP{ZDMiW?-EGKt(emWpqrzx9B8^v`kU()Y~ zE`Ae%+JQOP^LBlQV#T|vKL}BmXxc2{-2Bh|=uY$b^5y6O{g*+UNk3N`cK-ps?|kcV);vyO1m3$A!$Stnak@R=&RHMeS^FIXYVaNvU~l z)R#D&9jN0J#56~QnlKsZUSOt#qp#!!!{M<Sn=`<68=A*=fJVCaqC_Gdhi~Q5PI7mat5px&^&K3A~&vsZMbe=$`yvO%e0cA3O1xx7DO+!Vt~2& zV}X{dsN?C1l%(m_H)R(IG7oc>*rjC#-J}OTPmEo;8fO*U^o&v)tJtD+EXuOLU&S@t z(xsi0M}1N6T|Y-8I#{1B%Nlyt{eC~nt;D(NirUe6n!x$a>Z{GQw~0+fJ+t2ULhFQ{ zXT>8JZT}Z%aPc46J*FIwm=DBQy4)trc$l2b((1+S)$_Kr(;@%5kHJzME9+WB9ar}| zueJ|`kuq^H15+KxOD9OSbl4neUH1B(UA z%WCPosHwN_pDi1$7*r0WjF|C7$;m$b*l+o;#<2DXP9HVg?>kjw=-O4IuP{u%nGpuE zd`{m(NGOHV-F><5Lc^S%gcpp!q~Mg;mDr1{Me|u0B8O4ch@+?e9EZtLMz;BAF8i$q zIwczmih(5o>*;0vBdwd`kJ|*e(Q0Z*VGWg10)A_!&bOOsOsO6|IDtM})hAosC#_= z+`9RnuTHiOyu7B;yXk2Wp5Hjq1w~Di1v&@uCnmaTzr5&;0Al<4Uik6|@@KUz{ zJeh16=R{M}(PsOzqWxPNH%$j5`SR`Tmxu$;yApH-!<~2w?xjfK^qj2Q%UHuzDOh_x&?a9LqC;tdTCcrAOYYw$-MTuyLP*+~h0qmov2}sGSTm z6ZLoTjcLW?W{o%}ik8(>n-S`gu6S7W(HFS#mg?<{xSJb|Y_3il;=Lz7CKg2xoh?&o zipLdk<LW`ZMd=EUc0?@rLT_}?ZWE0D%As> zAx6yDaDo}_e4A?-Q?{#HIhX2VCX9+jO3w%P9((N*g1APX2+aIbC7?Z*(^JL}%&a3E zX>F{N9lwy+`@(YK>KzCT_U7Hub_M>TE=ljipAxaQ&{7svUjKbt-ZJt6eYl4C2J}XK zu+N}Im_n+oxG8TXc%@s>K(L`f zUNcdiZ0_MIIi>kyHOj&FPI@=L7 zblWc5dDik{TCw=Hr$vnvj>kzEEm)Xj5bZw{za`qLbXNAtTfv9LLvuC5E`%zts3D{! z@SwRlASE<26U5j!&<~TVg@>I;X#3JJz*5%Z&#Pf+nqECFBM_ds(YRvdZW=yT&V2j~ zTCBU~6q5wRII}Snqj{$LL^kutiFBh#2Ha19Mq#w7iMDPZqw!KybIqX!f?1$Y-w!$0 zkc!3x**icdutq;5}!qG^?AHa~iG+PHI^v}#M} zaf7xyK7ym|B#^=&U-MtQk;sd_F_CI@5zYtpjW~HOi>YHk-~3+o3_HWS`4qmxG*ipH zK+UM=8@=2-=#gn_ew8btwC@1}E^diR`jLmgr|$y%6NwzITGn(Wft>+*%*IuuJGZN^ z9AD~g%j|u*I$1V4SG_GkdUd0*CQ>}!fmq9r%*PA{_N{=%8nYc2(>2|Vud6Uz#rxMw z^$a%JuS9b;SEztSe%u}i^W#vth~lBrYK4cxvjVQQW4D|%J{pBJ^lCR4m}HMwtd0ac zs6pF%nQytB8T>G~<<7hGvB3i4P`p(;=K9urk;%4b(z6PG#g)@du~pWxJoen21Q@o6B%D+^lRJ&V)2vdwlyJUgZoS~FxgCuiSc zP`IXzjXKnO#CWOxQ%;UciCw{mPZ1R(1okifo))&L-HV;i(_n$o7nQ>>4<27S4m zq?wxgAN&gSyr#>9uhx7+Wv7dveQOLKnu-Rl+E0jRxbUHqO+DU*`?Pwbg77cJM4Xvf zC3zgqKB`bns$4i8KC6g}%5EJu8%)HP)fGk*um8NskCye)9l_%?VZMRpHT97nw~fZ0 zWE$~CR)G!<4gDRh92tUR-B_dB9CNx9PXn-W(|!4~LNLjXRsymaa0*OWpzSW1;hPvb z>IdrjsnBWgc<$N3k(ODutFB(pwmN#!6K^D(#tyv?cT&D+hm9XG+72~=qq*%IIbF&H zCgM8tnh_Q$j1zvKA^=^ZK~MgN^gAmxS>n8 zP=ndoE<5?9>-q`-d4`?6>4`tAPr`8M``md;ci`y7-X#;B>)K)bOr)2=7<5iP#|+|Mw~=gJk*rT3_$>TK-S|Aq&ku$?qYtw)6$EspkIdU zq|qG}CiqCz_8$t?`;E0`1J@^020(uzbGwA~M;oJaN*1)l&^jgHOM1YMQuGxFiA~R_sUvN`U#_d5d!g-CI zAbN!#2>+jpoxU2hveC02Mq2}|EnEDgx55$hcYzUb&nCKs0V}@2%mDvo@rOCN_jv}i zWe0B8`;13P!i+sF0Imj&k;b6;Gehy4RE|0zL~#xaC^qCA_ZJ#K`FC3mR4k6_JT=g1 z{oSERXh%EMH=@S^HcLOGq$&EYiX=VJ$sk)L#ySYTZeCz-+&vACW!OW@=hEIaHhk~X zRV?(F?kN;&{mFRe#x&}~v3DPQ76~dVTWezrY-WiU9s^%u?(>ONN`jd)aYhPC2lN6m z$i1gs_T%Irgbuh3#u>0}{~U?*%C82>@Jd3;b4QdV9B@2CNK9YL0ye7T|;y zFk#oHlCwet+x!mp%DrS^z#Xf)cnPMS4s>tcKr$^J(5Y^j1UB}o6u{S)x<%z_b%WNK zv+hKS@}SSyg*<}CN`P4B3-n1@0i3&t(b&HWO`<*loRdbnG@;R(_OZ$hu*1N1K3`}e4#T1hf1alcCbR5) z4mDopQ5f(nMMMESmWKRnym|w}e()@_gNZ!#FVCV9n1pn>{lMD({sv8=5Xrjx_oI+; z;27Su!Hf4j1YJ@0!4%JF@ZrPm0$VoXdAyaaMiZ@ zP}Xvh+yj8#&_ov0%KSd0qkw=lILW0&3Ud-kh0{?_fOt6K{u&}e@$?vk6=sw5Z)bPW z%rs~}f>{Z^5At@2?AJf#Zu5%}I8uB7Fzkrzm)x=ZlvqP`VcK%CD|#IfbSLZIE$cyt z8*R}KXqqCVYwPMyax>;afcnn4L0HKE~T09z;`8IVoxQjs>YP5~Bu>dpa;T-x_Q z>rzRGFx+=x&)j?!PeC}Do3!7ALir5zEWAyw7ao3_n+*t1H}xtU;bEkr9}euG`v74P zQe8X|Q_>GwI1fNHbTR zp@$9vvVBn6W^aMP-vDaWFBZ6z^kHdaYoK>89JZ*-UFSPR>#AV5PiHj);pGZo>t0dr zZ5^NH=ee=13c*sJ7Si-OD1WPhZ4LE`jTt@479MW|{DTqf{llaJg7dm{G+D6H)`xj+K z9|Nd~WR7O1<8!bBPYSM5Uk8rs5xuUx9SCPSO_r|&veesS9#D|%{(2t&h*%`V2e)GE z=Kn&HMlegQJth=9ELU%GjuDH}-l#qtEC&wnMXTNL7QFC>Vg6(4xBf)#xEbsgO8l;P z0NJhBxeS9m0e=BO?uLs7?A`c}-wpLmECOc+a;W1g7**Je=pjf;`TbCe;8~!xT-5ya zevog6Q?@(zmxX9tS~+p|dWmw}gMoV>sq0cwBH*&*IMn;~;yr;ryf95Awj|v&7l{;v z;X0@bL7&bo@J2e=8aHh@=+zV2^Qy%=Qq%3;mZUpOb$j)P6}vs{2hBflbo;U0Sjd3x z)ro{hMW)c#4XG+@N4>!KB4ZB%8wH4~L<%HVB}JpMcLvYigZdfu4lmy}q}q-8sYPM- zWIk}-A}Rkfxc`SMcS6NtED)I^ksjqUze43Gc4hOMa`U$*ai5M8L%Lu3IA>Y=Y$BRh zn+lEVkR?`|*BmlK6|-^eeEB}i7tR_zRewRe0FFaJ5CuGzgPd}O$mf=Df?BRWxpusO z8o5P?_i^`2%LJtn;G@_!!COw#p+n&dxs%v?Msfnw4X1pb6_S%?Y z399`cq^An?YD|WEaVxmH4&jai_M404hm5leUG7&Id+|2bHW_ugZ4SO!wiVnSVy92d z$#=D)&3Q!BfIc_T;L)a{XGF?NU1JMEAjvs!66CIV$=JC0yK&jXC`^UsaMi)-pHOGbI;gzAaQW;s<65h_6 zXV|~$JFgRJPPaX@6wp3xbXH@c-4%|erF55p!ruXGu^M|j+lF%fyUBPQ3$CKq70sX< z=|VS$AyyO*&4{^vShHn%a>bOSZXxQc%IPA6SCA~PDvT*^z50={TcmjW(EllPV~ zg29-zl1%lxQ$e4D{j`VrYD4dU?2|!zqtf0kVsDA(eq76?k1T5bt>$h!NZuFSc`cci zqnZ{W$2=p>5gcEhteau7!Cz7gRqzSIY&=%y04gtV25TG+eX^(I3}XBtgf%?iiXAv& z57m2slJ15N8M{mA01^e@+wQKUeVPFyjjP6vrFz z;-%Mn84(wbHCjJ1$d)`6YSip1YyR3f`p%U=rb-l;Z{^6i%Z1VREhh#%8WYi>Dv zE;eZeRS+13md+5&>_%tAp>$;Q@RbZiAk4hzF78etv>jDnLq;7#+uW&{$FSPFL-iJ3 z>MX~(&sPo~F%=D3jV={Vc9C73zDMfqaWyz@D;mGm&^_%u(v?u`v2OHba$g$TQ!pD= zl+RtzT6923TM2gJ0T~mefg{WO7)a)H(q_nk${9a}e)W9+`i0NYBvMMh$Ev+aC>Hfu zE6pc6yhhnwIBy^u!^&dJ)w}%7%OZvTwj+R=B)h*t*n>i3 z6u19`szr)Yw3&t4{l3x3x6|9Phv?<&dM4W%rIySvew@jA`)uFQtF1EM}dYBTG6tQuIZ~n;-`%?UoX!G@Sq#lFCPTg)X2c* zt;t@H;U;4laNgJfKXh$NzsW*vZFVreX1v~$^`HLjBVcctc#B#n&}$V2SLkWxd#y1c z@!g?%fR2&Tkj+Z~G7esj#GDF^#N-P-bXuq!p8KaWQn7HM!A~pv!?6Glg3Gj~_e;&K zbvco|11~j&Qb+N+Sd=7}CNSyNLH-D4{S}=J>}LU?9cFCk^|zu;>3yN+Xj76HKZD;= zw(wed!VF9caI5afql!O*3^Y&gcE7)H`ttpbiRR(RB)zlEjoCn9P)G!QspRf-$T^T1 zF9%)2qNJ|_cVf5my@};ic4%IIn~4yAU*l#tW`0UZ2$-VCVu%oj#-e+6j1qt;i2wLAZC)p^jHuZsNX z{_!gA-W2#}TeN=kDAx)36hKZ8P|Ka}(@;@v2e?2Bmm|C}pxF=Bg|CE#hoD~Mn;eLrT)#P64;C;cTd;x=< z;c$pQ!h_bxk9y2aZpt-Or~mWdJkj3mgkX_@eXTWyl%)UdxgEYw?uT%CaxcjBe|+(C z?MGyGOv?$qjTfdI)Gm`sC_RMKmOw%2f^U*hljEcnM!vnGPb&- z(!BgZt7CgRMr`Z&%EO(xohuu)*XbG-Kzo5fFfgU74I11-)$l)zpnIpX1EKbb1P3ZGDe z?NrG%o#i8(MlS@lYLb3cP{|ekmAouU*cuvhHnseDsV}8b=fGHg4BDFB=#NL zN7e^p_-n7)k+7;i%B*$0y9&P9_b77m>=z&|dyV-QSoyCEOzw+gi-5N^m@21r=K^08y ziwTzgBSzfc5PVkNs=7!VN8SFC^-a)!zK~XJrDEd;aShx{_j1f#DUz|x;%b)9L0icK zX3mTHl2y16+0an>qW^|#x^0g|>9unet|ML}Ggw=q`nb{mj2Rl(-75(`3wLFP*$dCv zNB7%RDZzz@X1iQO&PHV*yIR^Gh`y!|3?Nz!%K z{>O;+J%AwcYBQRMKjn&=JMZ%uwXALpjPK7mMR{`3OF?3YV283Wkdini6>;RPt5k$2!$T-@zpA~4o zQ6#qMa-+L~1%=S7{EguL`=~!kY?I@t8Pdz+DJCm=?yJn=3~(?fZIjqOfW({{K< zIub9$$p9$|X!?$Q$1uGRIST%7`T#b57K(7PhHT1a6m;h`t)dG~l-LP+7Gcu5qB6Te zHWyRzrqi@fOT=yt3+pf~ys5J|+4K*>*4>>jJnP=@)cEzaX|1#e*K2)+7N5P+VKJ^6 zak4xmS4k_&SCunYCi2u{{G!Dk&c=)U9Te8lwjg!g?esb|BIa=LR^cuFM>X(t&pKZGbG=*ZU-f6OL9mp+^OU+kjwpVcWN68btLN8gLMhH91ivoUU?1VHk{CJ0?rR zWOfXKT9a^c-b~`@@cK_D{>I}2cY6E^KfK%$AgG?4j&RZ+d;dOe_)z$1@Uq8xN-X5c zp*~K~fukQX=uv`RLg1Kjz~_}%Y*N&J0H4!+>U9{Y2jAy;v?_k2C*}N1<Fu|lYD<|W@)!|(-S?-$r_dID1 zeN&@yrmBpbqX1F*yK1$^Wf}~wG2nK2kBOw#-x5`FGq$Bd%(JU(Kt^`Ra92Et?3RDA zOb_`&re7Zag?@q5+so?+E_R|k*a|+yT(t1$J-u}g;Y}vZ8UI3>$)?@pQW#r4gAG38 zrO;Xqkn+!6+S&afl9Q+H|COTwez`99^nnA|i~{7FtrJ-BwL^W1)c1G!^e@o{@M-IS z^&2Y_ubFBLtfX2kCR7C34L+kRug$ymi7pZBdSc5*H7 zi_TUiH+DI?2kvb9qt?Gq{-e72-y5tJ|EA{uOP${c_WR@JamQ>E(tLEDR5un-yqq@$ z+DMnq!3z0(LE#xH@YbVZ!0mQE!ya7#yxQhBuMU9k{N3&2fCJn$e?NQUz}T9gn+){; zFn!22pGbeuHF6=d(h0reF+NyoKA=Mam}cuR!to?ocwum0kqyU0gh>J6{}EY43i>^c zZSJua|Hh3Kd{P~HoU`<_65#@s~HL+pE7om&_P#$uD(zyDocJ4#ugWenp zNEV)*T(%M0l(!V&Re0acb{CZAwXb{mOTCDK(Gq;Rq-Q3sKbnmf& z+Y}9~f4K&JlJB>`kLRjnN$a*FEU-TxlFZd?N%KxVsHcyccXWN0(5+h2`7vg0Q#;f( z!=!T__gaJC=y9w|_xNoNbyQC|rYOH9x`|C8h4T^j!nHA>;tlhMPAg4?9`mKbSVJ7K#S3e!*h}ZExG2ZVXoF{FID!P1+LhC0_@H;m ztoYM!YPTIb&VZvLeppm>aYpv(RZql!N$RM16TzP#pp|6cIdNI*%PSp+j>n?K*FVa5 zU9!+N4{%k>t(mvUloS?FbkWo50bA?QGr!!zjqWo=@&U~v3hc+N-%x6o=;V!7M&@)Ryk5M zF|f_wGFt!h>2lk`aV};>jwK4Q#%{AuQL#=jxIm+uQV(RVU+ozoK1V`CHVL{Sax11bL?1ME z`#T!H)#;DQ*Bya%DmN|tJSB}c98}iRxF!0~?r4AX`)0S!rl>yoXFe8n@&Z|^w^WdG z;@8$@z@6BSN3-rDQUIv?%T?&&HnPo5_Uu;n)yF^1`ueEB={4)8!{uZadRcfAR=|$0oTfm%_FXZHq&CL2n z0f|5*{Ogqjpdyj`m&nG}Mv(IY_VB>bRE(Ky=E%+B>5Y_wjg|Pg<{o=9l(q!bW{bI< znG1%Ui{9#uQ#8?1&qBk>tFwKPezo&M!@dFd4?67xLEB>?$9 zPncV(S%@C{1T3H?a)d|zj&QwKHEq?_e&-Fcg^@~~Kkm4;a^PeXJZM~wXjF|4ubY>n zKY1z}X5U!rYZ*&E9P#a=y?*+JbFJm;^meOI@t>?Xy2YZ_9(xPl#>cMN!)!2I^8PhC ztsvA=xu1R^2U43~A4?N_o7`-J{#_8ZxQ!X}ye56_j`y3=j74ghXZB6YW$>W~lAf=o z&<|7?PN!*kcIUPCj3MVd2aZUC;BB41VA;A<+G!~3FY&;ou6ar;Aw#e;8t?9Of22hY zcjW7HF?;vnnTYjTPi=imnfbso2F8_h`-nX?LwoGyM1J+B6;DO43_Qadj?RwD=fwvLJ3HP9UNZq|&eVo<7&o{@ zwR@%UJNR9UgX`D-EQH|-lvNLBW@}gJCs;ud1~ti{@5Gt{!OV4jMjA>7ewpLQtKZHx zCH((>bxjoj<(%4^2gv+1*9ik~bhu#bH*Of{t2IbQ15Tk8?k`|}suxB$2h6wyc1Aho4^v2?*wWQWY^ zcPYIQMGalE6~936^G_nN2P_{1DT2cP*Pp%$Y5J2S938&jxNG$73wHGdKxyXhtoQ#T z2l3PWA<*Gk^Z5b-2h4x`a>TizH!$3FeYMZ9Fz~ayCvzYC!5iv73+&#k-cJu{m`?%} z>F;|F7707+v2Ki~{0_bI4+L;?tKw3<09G7a@t1`X$n@sUZ+erWv`var+MR~nLwTBf!Y43TtT)ZoWw4PVjz z=0UqnIRC}8St^G< zjD#i9v=rswMKeTlrhW#OFYD`jS_syO_p3E-oeW*tu)$VyDOu_Yzo^AXNWYIaa~T_q z!D~HTsjtPP)h1Sw*eE;uU?(C$obbt!_M3e573lz){H5LN>cH|KyMm@==|T^S6IwKD zXYq)Frk(Op2Ir2VKx|8;xQa!n8A+kee7R^_Mz7ev)^TL&-4L>L)8bAUZxg<@J4fOG zK5MSa*4YB-((6DvTjN0+`~jqycIsC?lq?&ZTEOIxWBS*HCzA4orApNe%8 z*9^b;o9n$68eQ#hhg7y)8}7*WK1}8nhP_#hBcx7-k1@xSTlc34V4J#e1$8eyO2@6N zsI_&^=6G=l0nQY{P$eHM>Z*jtmoruT<4ij-X18yA%+*vg4I9-I;t_$QL9&Xe;}GXbWM>DvrGbGCh9>=2iWxHSq;tjTJI^N_|R3c*58dc7fxWPwXZqQ{JxWNYCuH#^4XU=iR+I$Y0AY(`Y!#QDNk8tH3)n8?D(7e z#%<-I<FTqoiI+jy+jC&l8Kb<|X^4}UY2g4qc4B9M2zI1(EPH{ml zHmG?!`*@PVr6XEZPhro84T-NFj}bB!Xc<1+&Z0Ave2qOzjg1Ew;z5f!)gU4!`LCBV zxeLss-`R)aZ&-l8)u7A-DmeA+LH8Zbg#e=`Ap5lUwd4%s@aGhv9U5PovmRRlxV1-EGw7^o58)%|hN zU^j~DgsG9U3e2d_OsErg+7tp|o6}VRWpU{(n6Gft#yGNl87|;i?b#AWSgs;;TBf{t zJ>sg>pC%x7+M8`9Y6VzE943RL?_7rP2Ji4S$e?2G0GZ<)LWfj#^C|rf*-$Itk79)^ zu%0mCA%qRj$|buxJK>N08XT6s-=T^fk@0ffi0hdYOOnfyLeC4{cE%!YFNiyTl1{;y zP^tkXCyrk(D85HmWwTU2?zoaS@$Q;bU}N2S$1K8bUA0P)tuVDJIJ1z$tru<)%c5_{ z5f#6QI^y3-s!M9ys5sYjsEq$4A5pNZC}9(o@8!ypKdRtYQK8|ZRJZO_z*R{U5OZmL z?8oZ+2l-~b1d`}|)br!gA)oL+= zO#A9>NUZzzeBPl0a}-XvyYQwm4JwT_Bs^QCMYKJ@(s)xnm1TF^ zn>$PP;(5C1cw_>?yx?wy^|;ywPzD?VyN4h1k9lhX0Vn;93Es87+Vk`&OK+=N@H)Y; z^L@1`K;twP_iQYj@F8qgj}b09)v?2oIcM3jo4&pd&n3*IwATHTgoY6{T812QS(8=O zXBub+m(x(snfFiSU0e)aRl|RWihfwrw#+Qs%a(hy#gA>##S-rLEpWJ-0%C0tV(IMqF&U@z zwl#RAs=Mk!M?3U&p^o|-_SVH!a*gP!~GcB(m`E;f|Hf~+`*6BA3l;t6;GxW zIypOrFXZr9qtPM}xzww9!b!lhmNhPP}n<;Q~TmHU3zU#@S= zT6SWp(4&*1Bz(3vQ~(A`jdt@FW)i}zaQ))a$nuHr2QVj$ zu=#|Os14ckbUoE5g*hwk$Y`nxfg*oOWakR*bqh7SdzxC3&pG?6~ePQddt6$2U|t2FLq8TmXk3P_Ap90Pr^$+SGkj7 zCtgY#_a8u|r`&MFC)W)Iy3$2BTj0o!9{-vo>dbo;s8DB%SQ^kb2ataWw)J|37Y+xG zi|7)=oywQ;aT9$;<<<1@;?-NkWf4eTmXjf%c?f0+dr2;CjcEXH*ntbMZ39v+!&pN9 z$j)a_p(1N4zpS(`FgmOcO*|_)NjX8XMJi2bj7fWIC>#$M=HydA2J5uzeZcxG0Q_Q2 zUDh3NaOM&RZ(hFd`sMpR{^NaGG{4n0)W)IWTOx@?zdUr$Ke}tl_ICJaUzkYVaRo6a ziCElkIqs7$n;{i<&gaQquMBkLdQq;2nq&DR%6d@w(quOVlqI&^-=PePdoAT>DVE&X z<&)(z-D0=AMx30Q%Q<`%^^zk>o)jPS)JGVh_=lIv+VqOGt8*r#DouR?i_hnCeW!Y| zT1F~p0cQNJHX%WPyxK*eE`=N*A^`<3Uao=qA8W`U*W&T&f#)1ensW!OlfL3c^a7)} za7QjVW$l^kKswfZ;pHbfqY+k5#zU6mY$od$tU_U{>cShI1Z7$WW)?J~9=*-Bl6;Vg z^7%gk>Mf4}W@hP2u04&}p1*_c7$cByP6JavsPoivu&YCGn%HSp!*zl`0P+9)xo{+$ z&)3vM`?A!Z4wL$$-Br(J?eFIcK-m9<3l*USW)X(M3it#^stcy%6WiVj@9zBZx$2W6 zzKadWo=UyS7EmaCnH&RP4wuEee=A&Qy$iQ&Zv8jdfAW^+K$v#$L(})_uTJ9&<@Z8! znV)2=sT>SE3YmcGPPf&uMe+Y7VL{YRSS;%@gM&7R)$mB|D^ZoPGft^ zrdkW37vF*8?zk*00!ckqmYg9RmsR%+A%-)tJ;vPWs@|=KS&q5qHJyN4>Jphr%A_|9 zF*Yc~y5ZHNef7E6G=d!E?j-w){8>EU>%8LKz(aoQ*1ZxzOIXpC5Vx2FqzjcPx*0gE zN<~!l+I;MvGif=FM}6k|gy`OnVp)%6@*6a$-(b&GJlc9ty%B|*dyXd7+FftkKg&L5 z;D|j}PiN^aF~4NEdM39lPICa6D>?c$=6m&?=IORVxlpsnG%6qig|vF72tk( zh6WR z)_;w&?&XdC=fVx?Nz76lvwb)jVD^x`9|E$(qk!3&+}d!4q?x^Tjqna!s8nv(b;HwE zarhbvU9vDI|E}kbdQ15@-p1NpjN-~%-@0a-Zgp{XL7tu*n9qeTV574-8Rw+fW#+Y$ z_jCOcHyA^t28-CEQU6LmPHcz19ofAk&l~o%K&5$;y<&l8vtW7nH9p+=UzOMIy|Cad z7CD@{YMM-_Yobq?-AYzAkmHRNd-*SVTY0HA(q<+cnBvxLy$g^deW)|ny0zT*-#p+k z^S)pW7Q{CUEHbrk-}d!jUZDp(UQ1qy+jrmeq>dMG-vHO$&0Lgo_XX>Q$3{8qC4N94 zz--CH=y08c75+Rkl=TKcAPz*lwI+#**krQ#0;8R!?UkX`N?x7FX-hyxG!2Zfliz7HW)dV`;nF@R13#Ng%n*%z{e2EEe;crUTa%FmO9Nm5Q5n+ z7WphXawYrs@z*5be8xhCw!@oH%MTN>6d_(|EL8_XWLWh;eT}b2wl2eblGRcO1NPQs zea&QZEeLY$KK5&uS1Q=S&E zp;dNrgfKf6gqu2yMAOHz=m@<2%WoPbwOIB@_ND40`#K--yg$d!4!&&#_ia%H+l_pc)s5Kg&8)VWw&RG-RP z^otp<^RX5B+`y#i5lz}pnzcDqAQ7sGRR|lQ6hzeC=N_l*4Yc)v$U(7X<3c2ar&N?c z-pTmQf-4KQYTu5JXtM~pHb8i4`Q-4LU<6Vwj#wr@n*GwridN-o7_rsQVNiDibMp%% z?6_KeI&Ao;tW|@aYUx>eJoRX{9x>NtI9huKgL{VP zQ!HzmJ?&j@RjsI$$SH+Y!MXvSTz7A8@xuzY9@R1wMDc^Ip z13{wxwdMO7t?;_8c-}&?e1O;d_=KWOmYbKgQ@0u5$r;Fpi+#ykD0w{$qylX)c2&mn z&QRgn#r>bSCTYvTn-V!ox5mE+$uD(QTR!fu=(A0*%^+R{Cuk z2f3mB_gv2-Ar(o+A_Y+nT}gbV1NUv(^vX?<#0RP7Wb&-z9=@Zt>SDO0GX6)-B@9aX7w;p;Mt}jyRN*K%=Zv!FUEPsP)M{D2B5ENXtsb{o2 z+$pH-+uVO!C{k!OlUGWk%vQL6lu?Yw`+c6?6db^xKL*a<@m6F9C<=T4-j4m-2`G;c zh`~{&FnI{T0mSv{1`1C*%)D!e6yi0FDy>Ytve7a@5}F;C)=j%S$2g z7fDBrRKSwjV(;sw6I5#=5y00$)3EUJ%0u7*(ho8$H{n6-X|}Sn{=l-acmb>Ze?IjG zp~~qd{G#;uq>qKbB9#5b?FMl^!JXX`azG@(=}88uArMayHj^vOKz}Z(`^|rc34#A_ z#nk_|6;mi6A7m@@_eL0R+CcgT02pA9ukR&97OdXG=pf5#aH)+Me)md-r50KIPF1IB zJk)ECmXgu&S_Z0owYzHl^?o~r7dHK8!bbqhQvPMzBSE3Mqa}t5oGALRe_6f*Gi(Q# zjx?8hQ`K2~cB7BiO8bV$q)yY7l$DQy0z7wDqO1HadYW0nL(5nEZ!6 zN&rakHFfdaz!1zW1xBEQMK{nOfUxNIRECz+2dIQsb}v+_@Ulfwnz+ZCuQ&7NX%81; zmGhXi7l->8?`Bbt^!#-#?=aabAIqP67}OITk>D8Qk{!LinEB~_Sbce9xIb*sl=v#4_+Vn1G(&fR2S8w$0d83g9Uik zmv!y`zA}n8Uhfin4-|F(t8evN-Syvs&;R>@|NlK}_Lubui!050Xu9$-#$2Lm{ znn)qQImv*h?c?pB6C=hM^;Hg9JAbdSTJ}|7s7hU`P+!(?X%(09^pew`YPCT#L{@%m zUiu`U1sl!t4Ih!1Zp&(1#du%#w*@GN^OMy%fA|s4C;3IL-oTZ)M9$3r4LRf3{x^Eq z*Z+bZwsG=b(!>5IwICdS&Hg$u=3#To`L`M?oD!hnWW!GBf>^8c2X^*`Bf zj{ob_slWIG{<^MdWd8V9Gf{wX%FFlQ)z4F)*&^&>b<>Z}J0SX69jJn-7(2*jVJS|Q13s{2+nQ8my< z3%7k0NE`#bOU7jfeBR(8yG$dV8lKJ7e^tI{@>_Dl3cNV?lPvT-P>zZv*V^G}l3VnQ z(S817G=XPqW*ex_qR8?tK_*QZz^2$Gy-=T+P=W>`7EV0C9)d(i!StI2;ojsVxQ>^4 zRp%1Qq?&>o;LJ;9+gvgpUGVxl73x?%F<%O@ux5g29G&V&t(nMk<1-I|jg1Mek8J7O zoLGBTb@qu$*`G<{4znvb_7hqaAWowDOJXNh5eFMdiaa;{>c$Frxs#b~jDhQ9Z0U;+ z1d3OJ*9-PD~$vr z^t!a!60>dfuA9GyoC)hk4F$pWW4%%W|!p+%jy%|t0tRvFrkEN6VPC$ zaZAC*hkD?iga>=|5AxXHt|zr8BTB`gY+v-61%Jhy@{?6FjrUl|QN!xeAoBK0FluHT z04jLwa2@vx1uEoicgXFEf>W|$>3=Uhpl=w@YuPWYPWomckn8Fa?^$((GyZ}*=@t-^ z(7!7CVtMC3dT}bBRl7|B!0XWbGV12Dk)D4MD1&GNA=7 zd9)0L2~WG@IJ|CiDde|5J9Yso;d^eiiavrX12^IsV>3C{JiRP+2o|=-FKEJVqIlO3 z&#g5yRqb|goyJwaYsv-a9Bvn1H*^Y6dv=7oVCw@=+oh^gQ%fd?h}#s+SOMO@qEDA0 zWJ(U%*&L{^+NJFVl)l~G?(D^6@&nD$=Uc+iC!6)kW+@aamqnYXzDLB@SmFGy0%%!3 z&;aq3c8*I&XFl_a1y=t}$Mtc+EUAiiVUmRE*eVE({>5@@fnG&k>IlHb&o0<{)zt?$ zh?r&8cUQic-;Akmfwl(7V#Q?`h^n! zD*!n8V^gMK1U*%io`henfE*%jlHg(mkL6>$xL8lshw-#|ETbwCt1H7q zrjN*bY3|WRj@={1Nuuj!#rK{gy6Q}BPBC>Qe~S|<*x$%8Kg1@$@!GcIXMf!LZKVC* z|+&;RZ0Tb$H(1M3K&vzMb+JG!K4Ukhc+kEyRe@LK^GX z14k*7u!U3FkE@lcnjRau!6g-xAstHyg3~#n!JdD^0#w`wnd9E1#iLj8_nr2q$d%zI z{0@EZ&;ox4f>(Dc&vAaw#P)}@77#bk1zeE}z^6=y3eP^yQwhi3%`pKN!*2Lv;M?jC z2_NKwW|JJaaqQ(-->9Zz;jJu_JdEa|%mAI`(rT?)U74+dol-_(D{_I5W|N(ul>cCw z|95Kt!=;8zm@cgfY{(~-IHoG;SMfloaE8S1W`Ep{|G)o41%&t8-7LLv7|NGx);27Mxk^}r7Mg;;3T*roA9tbQ-=>Rz@cSomTCeq;Z3-r=+ z?LiLVso}Z2Fg~}b*o`Ihcm0`n{hRY^`^VoS*1#%1b62Tf`P6aBU0`_c?5w-EJv(0V zUSdpjDmj~UMFsne_xA6bUk489ua`g6#cB{_qnk~-JTB5$lwVb`aD;H;tfcqaL_n0I zVha7aU4EkOb=G#WKSkmb2QD6fBuGD+q?1{{Oo!I^x(w=^R@g(sV>>gHm$@+m9D<2N zPOBsjm^X1|*uyu~U3>MztQ8R~gSPBOlUlVg$_?e$pBl3hzRbKl%+!A$)&h84P0Pf&NmU(G^~MC zV?Jz|kSfatdeefxdASKf6}-a zAYf~(6Viq}vpHH9#i7b5NT$9gjuSNO_A{DvEkh}wZ)oqqA!CKfCm~A_>HXF|#*njB z$N9%yT}%P6t%Ql|JZ)ItbB7o1Jfu>0{v^^1$-Uv#sjQBYy;$96+aE`m&tEBv#04L} zmd@X*TlUA)9jl8HmVE`yj(^e0r65cPhHt>eyGxGC?HD=?|HOuU#ew|w!mV@-oR|^| zLi=nu!Rr^2Y(}MtIfD=tHMv7?(g|zDRQ$rP3QnF}NOts1-G>|z=)y*9?lQw&2l5VR zxD8YM!WSid)VVw}0|Tzn!tt1sp_H8}3Dh4#V$di@`BfgPp`6#xm<~%JA0^uc#a^W z{73BH1mC4izX?rvk{d7Hp*(!YgOQ@9Z(8$fbycO{kGp~S#gQHNYZU{0pJwlQSeyvv zS9!Hr9|ix+(#iqwF;l*lvpWJYqF!)Y+wQQW-4}%)Yj#Z=%ALuKSqO)6K(o5gz9L$@ zeJ!JFx5l4u-P0OcJ|5Lr-uIlNZdyerclg}~QeNim=1A&4PJx~oQ5&9Xsf18fVZc0b92UQrM& zmC>5|YAiQg;^$*KsWkVl;$o3OA$)x^&DU9A)8xSWB0{YBWiMTdgFpNF*kiXxkkEl8gfd(mqF++Np;JnRLagRvH3&v)mnwwb6>rONl7VLg|$x!KzN z*3;?@{EA2#D4T4WFpWlt0!9On8n7P#%A0XWH~0^0nATY73p;%M|3ykvA$W>o=(Wy1DB!3?a`{fZjsKM}DfSDl-g+I;565 z+(9Zqs89M*4ys68_)$N6f1IMAc4etvoU5l#{V_*^*|?O*2f*Qx-+8$AB!Gv~o?^hr zHl+upgdVV5YWxyzZp8aOSLyZz7X3?qy~^;WFISOD_nhv=E;*l>UGKr`84?tHq^zHu z#M(#Ybb*!G(>7SiwQT>LQq9+UwA9Kfz75+Z$w2nln-pS(t{!LpJx@EDyo6F=*i$goPFe=lZxsIndG`}B2S5-gX?|$)am=!l9*W@HV zx_!g>G_j)ssx2>*p;&cFd6)^0n7e6nO)C{!Jt-MOEmTve4i_?(Y-nh`e=#Ob@Tu6w z?jhMWl{(dIi-V1#^9kv8gSxnJE`TKaSjsB3CYnxNJ!! zGK)K2azFNR2ME;b;znQ8J4mS?aKx4tB-GXK(O1PpZ9yYon}si8&*iUNWjTeyjmEUF zP$g%9E}SYE!1jwUXfmUGSc+}-CYK$$mD#Pd`z16!@fMmY(0x0nZ?E_zyC{p|VN+;D zCav=M?&Eu+nlAm8dyk#f0Qf6h>*mt>UNm2JC>m2b6l)2wa1+ED*=pALk^`qpjZFRN z<;6R%?)|ypQB$O3+CXDD*+lafSNd|(1tJtRf#Dc}wTM=5@La^K5 z_V9Db@cxhF-LAy>{p^7;$wcfNk%y^7ME8X`IuIg|!G}>}+ydtet8~p8XHJc2!{^ET zryUdr;U&c#(_Lm@@z}w-M}OC;(vN2I@ZX0IRG@OdJ&127`LdKek!7iNv;ygGeoTzyYdcS$?D_b?#BkwN{WQ$ zTAzqjkY3LTLAP1h!o%3w?vF(X60b#IFxU&vONvz=#dn&1dUz6sIL%a6b3J*LaJo9~ zUqgZ_l_@&jUwpo-#dd|DX4GLA>d){OyzDTi&wuGoT>n=+*#uAd1H zJK_wkC0S*#!#A58!~hMf?Htj!-uzuQpi+26(w$u^-1wgQhn4RWREp!Na={jj5GO_y z3QTi$d>T2$W!*)_+EA!~5f{*?ikt1&YCTkp;JX=u!O@(c^~^V+w)LKHlxNEm2AK3sYM}4V_#Q^`|PnV;9*e!f6RIB zw!fvIyhr$!A_ub}WE;CA&aXoZZ(CP_VodMcmpmvk!n*nC);`6Qu}MYd#q$&}l(4g- zENIKe*koX1on#{*^q8Jb(;u?NW_~f+tI)!GLpv}mw{Y+2Ok@nn>qc|<`Z1r5%+Y+Y zEyzUR-4UN$g0EFId+S7k?oMf; z5}^N0klAnGcs$^>t8@}=%F?!;CZfl9tC^3VHpiwNEO7^#`#e5Qkmh4?&}^4F>+tzJ zWUErE0~A0oj+|O`^0^zj;N+*c9di$w!}rXubuPEY+1tx|s9E4sb5)0jz2bHXv}|Jg zbkV7?mG)M6ucV?jL5K1T&0eP7%nbERedC&lSSfb#g<}hylvUf(^|kAgGXyoy+eW5x zy8NoP_h_)p2i8VKhvw>Q8rzyd;3(BFBw!EAQ+}lZyR1*%s=6@KA=5oavec|Kj6jn@ zU5_X9SU;Lbo7Dl|=`;mVWPXQWY)Uih~!!a;{ znIwAUnI1N$0DQxKcF6EJKjK&;eW`u=rNP|D0&A^khqBx<`;wD!9=Vf+jly)P z=hHkMFYFFoiF&L`gA_Wi5j84+n9lq9mxU(Pn?NNd%f%^0e@KXr=;x+ zDppfjXPXC~5mW*$KNC+vvkX+xkH9~c;Vl%yHy9*z0BvRFELp;xZ^tUdk&xpLfjCUW zoKIHNzhn?xf8nP}QC^+Sl-+cEnu^ZeTy=apU3Bzzb-u>t3vwo+#L@6UkVlq@qQ28X z@FQey$bzH@)!+)FPw2h(m`!=d`cE5O3CMYYnD<10(A}~@v!3Q^>g0sr@XMq0KuTW5 zsD_YjTuB+;+Bt!odv*WCCWl+@wvRT{Axap@-di2zVnyX?a+$v3wzm6VR-T*)`nqUo(-i0W~hyH z#oM(R{VIgon7>y}^vEyz!JtrWgo6}ag&RM+3kzMfCi-Eo9V4Gl%g1Qn5&qPhUc=sW zvnSp+5j#yk@fTLkvt#mM$(~!Ejca4~wE^ z|FquH+6#6f-YW69sdLHekDYwRN115jtCpX4uGG<(wbEVs1=et2ww0N$La=EH8wl<9 zKv@qIWQ?p@T!_`U5?1aBUJGM4R;_e>-7Zm)r)8(myJKlHXPm-68hTcD-dl&!Bk;9V zTjPkmdWD2zIH*~Un81nEJJc05ynxh%C7UJvA z{1}#>xh8z^_YQTSN7DOmPi(}29VPht8K=^FG9N@6ycYEPN)Sj3Xc7zG?#X~xNbE0z zqO^=-jIDHIGqTW%frMNGg$4F$tg;uoajw0+zG)Alh055{Kr2o@)`W`wumaQlh=RKJ z-d`?#xggG>t82&;cRxdAD`B_7$fmVJeyCx|2MWINZFNJmk^w_R*20&bha;QX^uZ_G zLI%eX7wSKvTJ<`*55M`%VVqd}#`&sUY8KGY-LN=`+~7p6pWj#r zQ@%8G%v#z0%uU{su_wV=qZ}kCV%#o4b^B*O{cx>@)H30tc-)+NyZ-{gLoN7#EEzH* z!1+NU9e$f6JWQa*z6GZcd!gS6=1D%(W>PA#x#Kqc)3p`l!*lfbQima^o<$M35x|S9 zwrcf)`+`>8^_Z07D(q7Z`ZSaunW2wkird5WJj0bWP*EoxsYcsbl?BO&Z)QiCUIS7p zQmPlK9=Sq`OL(eB#be23rO^^Uz#wqf)|2NSLGari8N7N*IH+sxxi9)iEY6rFroSf; zt8gvPe)kpNvb%^&;J+$e^+@KM>4%0<#y4hmO62@L_etOtQ!XmmEW|!K8{%BuI2lY2 zY`}UP3B8b-1qQvr7xq+_kriDvRy?M;E{qbqpgyXNZ!EdTp7i5VqnUsNzx|h*O5lzp z8ywG$xVnrtN9!?}2dT%%uMxKz*hCHWL=9Soozm1jqVD)AYRGaUKPvd}kY|lP<;wb!T9Op;_|?g znYYJ}Ot;m^+HGY_=9Av%il4mq)LWaKAf z+ZG-jhR8GWwYLRAcJW>vX4w!2AA^}N{7+lqu;h)UWAcDRuWKeo&Ga`kjzk#*dof*R z-DIt?WeCw8d+UXFzuqEj?YHe&~J@m_+xNpx?5%Azy*jly(?U}v@3N;m< zxXGCDLxen(YhBtZy-JLG!Ub!xY$}}2KI4unwr|x^O%$_rj!}>cMK=V zz#3Dyd5YUg`fSHYcPah$p6-2BZH&{vuh>Z$_~U6MSx&$?4s!g8D4!SO$J(qJ{Mda-Z1BN8 z=tqXM9%0IUI7E+Lh2iq+Ne6^!NaM7y$}oe2kxT9QzT-TZ{K)-f$DquamMf7`(u zUXfj8({}Y6N7g_h&O-=s9ryxb1Jnk7Qp< zEo(i#Q6{yX`~>JQkwDHR!8qY&{nkZ(NyHLH`fOt5v)9+C$egI#h2N=Dz1G|OA?wWI zQD@;5%l&)T9r3_?-@1mb;i<5~Ksc6~U*y=D$&F!&cqm%6+dAGnk_UwJU$>=cn^FPa zD(0c&0qPdt)g6!HH=4epCj_&}*pFN!w72vjv3ot++fmvMf-Vg6!Ly#$m3ikIEjr4l z0`QImffgIv0wwM<@76_s3|&jXLrCky`_zik)!$87>45u`MyxzdWNvm(h_8*jxr@w; z@0~WQ=tS9(xXudaSB-tbkMV2>Gk$q_O*25d1R)p0@qS*mc0I>|FPS3fP#cQ1#@CE% z#oNj3X!?Tn}Rfwh?s`_=@ zOW}h}sCceE^@pr7kGDy-PWU+6WxX`$9eU4^O90#j9fbEjq}|p3aaB--Sfk?&EO3BX zjp=14+K4QVxA&3k3*rhk+F|>=s1_lw>E+FC!J>>Vraa@w5|_~V6ZKf7Z>jaR2o4T- z+bliwV3mgX(38i|fytMdvuG*+R@2+D=wUPS6XsHe%Ak=H5i4L)2c_9c(Sr*NP*df8 zu%cpfd@#j0Z(Kgo!XM(md#8~#&4H(pWSAZcsfiIK2JF?*7r+J2eH+rnLBcF=#D~jG zbdx=mK!dEJe-lYs#I2h(H`E&1G}KpbiKGkou>b8L8I!2TnvHTXxJ-9-=gM3kI&bcK zo8AfC$5K{dbsD_1(D=nlaj3Y*eA;czKE8vN?1`u;A^6deH_q?=*tKA5lXK)~ z?{()BGWeZzmIjv&8unt5+fX0?>_sr4k}iq&3XYF7J8k{1qkq;QUrEv(6DMpJ8d3(` zeb+=%$|ni?d`|t6XAy8i36FzctUUCLcMVa+T$|N}E%!o%^@93fc3qV?aH5*7x2^%t z9zP1`q)LZsZ8XR~m?=EP>d3+r{qD6r^kRfCsv5#G&fcz9e| z{=Np4IQ%SlD(Me_*xEc;?d_xRiYLg=FW5jRJll*w9`aC5PL)bPLY+(@M}SG*atDN@ zUXHm*Y*O>sDkZ?*%*)@c|!~$N&3B2yhq-r?7_=0XYcisbB`yOP( zRhvH~&bB5su1tT&%v=}Ku;BIP0;)jMnSh5}y>%QFr~NL@Hp)>37~h|PEY5ur2aFeZ zmaLK|h_dA2Y~V)U#c5wPkO_8$`t0j0wk#;UzWkC8Ol6Y)kmwUHCS2k$WuNY5 zc-u0|^`k@ZIfm8g(57#7hE<=qB&%}zC zc%A4gHEy1hA*1) zqjx6k>ZfY=M)Wu;tQ%Ycob`Y`(L#=gr(*OJ$ZLwduh;6wCoZf?<{0H4Nt3{j!itz*9J=ud(q`s!;53oR2W~KyQ3HZnC4l<69PRIVpYJHa((IV zTbFTIO=*KwP9TC8wV$LPq!)@u}Rg|Aen)m+zncrnC3W3@F|fPv8hU=b_E~Yh_Zfi?3Qqaqi4C<2MUX zj+1eWI%V1$TSE;=)mdCX!W56I{cq`sFL3?LFb-Mp)HJ|C3Aj13mzh(4T2oC20V2hF zXsk@}YL9<>ntO>62QIV`?=e_p(6Kjb*_eZvOBz-_k;##KkApg&#F)-|8b!_u`1e=d zOHMS{BSE9P<|*(r0j&imkIF0svWa{CR;O9mv!WAaD1!T+^$Tx^q)V?7e(#e%_&&0) z^L5alj)kRS9<8ZYXeV~kp5Ha2ZjLQO!nv;(S6Dsquy=^i!rq5eX}K{a&8oV{@b$E= z<#sg~SVq_0StZ1P0x9WhUnn-|M_E8Fh2CJh0ip zp^ATtMQUY(ZnUSF`?ON4VXs@C!Cs=Y;Z+p2*qxtGrH;SGo-uhWY72k z>~voxO*_2Exj|V=vfPcamx-Tt9hi2RcVAc#S9}vFFe!Ma;UoTb@2I-dLu>)_XiDT! z00j{0Q6^uezqwUI`vI<|l^mTrka1e##*jMcYs72^9 z)7m7uCc`~+VhA({;3(j3em9o+>t=rS8C3^*frALLKwL#lzm+dzvFGXMKA9+Msj2d| zci}ELV0Mn`7J!oxyQ6_~X0ViW*0ajhMYm(+52+KRDI@u< zqT>0Q;_^xFD!~ONuDvxlU@3s9|6D# zuLingUcXh-xWdHqqW`d<(Uxc{ux%qqz7qQFj{DwAoPz;VVAW?#zfO!F2jMfZ^Lb3< z#Z?l?GxULlz~=}%;Yp&+Oqkjg!Uq{Zk~o}OxS*Zd^!X|`-0aD4?V0d27o#|oYr=;D z26tundA1S#W`s4hUNU|*(sn$xHPNR3TWh5w9^Qr~Rs)sA0mu{0anM-3UK;lf zyBq)< z;nb-J|M7{&=oRn@)yw48i@QpoHXlZPIgvIB`*yqypHhka&%zV?fUq2Ng6@q&6Cwf%aeg z)G5Uth*ZX-9>A&{z(>-IcoQJ?CM>z#U~aitSnw=QGs9|L8(7ghp-8AJaPUu9aDFD@ zv7d;k0#cMj`C@&m{i#%CMG^E}Gs%7d{Q?As-L}3T$g@F~k1UxVf3-aNMGY_qc-C0S zD77>E%NELKWsbYv8EynYJZE2LWfg!w*5_CeA(iepjiD-#Qr??hGnl&5?XF0w?qkqL zD&T-!@Q98kD&F#?0(V$hU>vsIBnz{o_oxqG z?D#|GqnKUFrbPg5SG%Wq000MZ;PC+%z@C~oTZNvl<{?OsW{akv-Ybvo zserK)NK*B@R~u@J-op*vMwi9koGhxo=8xInwHWaSTJpH?)%=t>06N})3ga7K*6Y-O z#W!XS8^1l96di^25O5nb0F{Fchs?!$8B^)kUSYH3eu6Z11FYsL{qJR1Kxs-b*5~?j zO#Q~C@c}}p_){7AY}OuBB^Y?-p0xR$wrSX?wNeAPmm9y(WH1%!@hx5Z8)vVZ_zoJm zsywgB4QRf%Z`zOp5Ng%w&u|c!&-(eb~Rga2d6uIK(Zm4=HjQ}NBr%Z1t9v&{ydh@y9>7sP^k&enq|xjj4!akFPXL@ zsgQ~mH6s_3M6ea~6WZr`cN$5m8L*HW8*grs%$}=c>gC;gF-{6Va;TW@{t__jx;qcj zI@*^I+=r8xP&99avCz_!Siw+f``MfUdgV`~gp{IO{b&`A4HkfZ34D!v6G@1d$z+F> zX85TfuSs*po&g@rd9qr83;Eg^0E^__Z`BK1un#rWf)FH=o}m|L!9HLcH|w)f*=C(5yH|Uu)+}+U3o99Divt?$N^Mv$6j#j*!%8UA`-2ef&#h9o-<$J z`J{Uyo;kjIuA`zMcU{gW4Iasl%R6N9{Y4YnK4sWyM2KMj1zUgfDZ`03)1)Aa>-?Wc z1calKE&}MuaCtg^0O$n{!p3|Xww2l=|Ae1OPN|q;IO#m|khq8zZkwl}=3%T33Xajj zHBdFUk(oWKFeZTA13xi|gZ4CyuXJg8>^4+@!x)kHo>pGF4u){UfV9${)qBx(2g#jI ztAZOr8qRw+!!rvg=iW_4fWU5USorDE>V)m1*hn+*FD&G*%~(UJ60?;p&55+VVMjm0 z=#J-)mhKApQPd-ht;zytbte=jIAL=3RW~?|bAKM&;Z)NzVjE04ckipZiur4Edx@MU z?58g$JXu{_W`0I={^@2ig4svg<~DND=>aQ;(f+>jfk=XM^`hZGr6pa^Yf(7?k_bc$ot zadY2XZk{Cx{fVOF8~|;QJ*mo~&$yKGiqS9Y1k17wlHQV;3Tm6H93l>Hu}9yKmt3fM zI{SJj5~@M+ND0&@lU05PTg$M{Q{ApcVr+uHW?fh#=WVSmWFtMOv?&l-0rQg+j<<8S zc`2OJZ0ds3*O_)!0^pC&Mb$*XdftoN>g*OVou(9ZpNj z>ryZqBsd}GW2o=vpmVPeWtL5j%|gi|kiAr47lY%`!mp8qK`sk!VAzT^?HIr9z?H{X z4e_o3Y_g~vK)1-L;?DwrKCRCUX0v%(&-Elo8-`_H=R!?K_Zk>$u6p1YI`HLxfzcS> zvdOw4yk-mB@6|;2E^Q6z%R68}?f1ultJbL89_K@@WPQKuqH(-)ji)XbvMS!PR$sfJ zdge<_>eQcp^}pKj0M^{8!L@8k3$bTgtLEW5wZ2m}Vhgxp6>4@Gl7FhSerZsy@E8OR zaBQCtbp5(7pNUNq8nv5OYjh`-EgEP)(c)`-HvZz8?da5%1{XIPN=wi|@XaZ;Ak_ia z|GF6jA6-X$Bxw87N&mK0`3Zr*(0kI4zu#5F#2*O)1&`kT^R23qi3Nm`fLr3XC;o8> z7eH<#{`1fMu{gh{0H3Bc>ldgSE&~{(fC&j($y225K#sj-(9*)T*XOxG2L$su@m^VD zf#X?oW$|a@xWF*Q-+l|hl<$pqA$1Bj5oL__Q))e~+a@r3vAP;e5(rL2X$~@Ay{`IR z>(VmCLd{oO3gF+j6so<-fY-|3duu;(QF^ zsAK3quM-feXHLm+}$wWk{(Fh&uM?e?XCMclhlIM!RN zI`22HKU{DvgB-~=7HdO0+6;?LKMl(DvVqLZ7IKi&T7b?8p%-r$p8Ol^v1O5`rka0 zoULxXh@rOcnWP@MlG2d`K#>DvfI+@xUK!Q@|N^!Cuxi+FM0Mk^yrYDbk!( z*#9-RbYN~E4kHVIzSKp|}e4KCTH&%Xcu5jj;Z1L4>y{#Sc0CEFSgzjvLvp7@i@t-H;6y=Ho&fKc6CXo;;RRs?jk)^;=S?iomCc~K+r_T1xEz~ zW`o-^BKLZNqPh$OB%kU2HroGF*>y%WnRV*`CXAtpfT##qsUn~>LrE-y3L`|39;!-5 zf=CH1AcA-3V+TgSLYD-kh0uZsI3S`z2vS3hzz}+e60(J7jdF!)O)j3Z8YGj`MGo5&TV`z^u7^UKkFYZrJ!@e5Oq-tlzrBny5rAJCn zmUgnad+nd`?5QXu@y~6Z`XxGI|<}Qh0cj_wNR6>Ho49MgynTrj3Dw@5 zxrFm$ToEzb)c>g@$-!$du-ZImuUnf4fp0_(bqj_$Vz*PPHFnA$geI1Kr|K4Zr%5u^ zpxk!Wf7wtZH^TF^w31dlkB-G1KXErxP#G0skY%{8h{AW9uHQ3)VT|VtPnLQ4;*<5V zBQh1OYFSF&Q~x_)kh;Wq2Hhro1RsRQ5h|FdOAkHEB^>-!Q?)mO&o8PWU^K|_ zLo+hb<2S49U?pKE&D1_v3=SbCcS*k@89D6$1rxwn>Lo{siCbksHr*eFwjPFI(tJm= zCB6=^_T#oCe{)ivb+=D`z*l}H2tIauBggUM+m{gL;f}RX!B@h{MJ$|Ev3VCVYGOFm zRI!~{MV@NvUov1-*&XV0rZ8Jl-VBTl)caV-i_n(*3fb1at+$#=d0pSg?*^LIcNU*V zEcH?Zt0P|7(tI1%?ubM2uPuPb+?Fr;2}(KNTex7YYXBjn*w+7mQc)Bye!c}iS+hAj zu)zM(wpejz{w|<~Q+eala>hGtlqjW|Nsr8AE1JBZmq+}{(KP{~AYk0Y7E)6F+|J=e zPel&suZJz)#cvqTcVfqf*Bl7OI(T4Qaug{fTr(?iRQO+Qa7WvpDtZBWq^U_l|0-*l6U4=L2_f$r7@ zsQ7-8dTOb+k@{5>9>K;qXWsv8gR-z=e>*2TD>wLb6E!;pyq2$ts|=(j|Katy@B#dyLApFOQ-5A25Ko6(Eg3?{?Z+A{)()k`+Zo74E(5M~AA*cuzj zrm=lLFD|q2tW`!Oc>8lhNkWprS}r*tq3*guQGoMhLzN=uLLgJwKrbM(IL_0(4Rc7v z@{B_nY^c(V{jMAY75d+!f*gwObX9xx%v*sz2iB-V0AP{qmpL3+$l8J;+wD^r=%cR< z&+=>6;!tUuUo$qXmjO{^PHR*TasUglOs#$Jg@<-o@6sb_TQ7-Y1%_6BmVg5jc;Lcy zVe`>+P+`l}8aGGek>h~LGe$|ETgxJA*DGsJC>K#YCG4tpAKIfG_oHMI*eBq1`d^%l z;UNfM&hpy=PdFcqDudMmLDAaEY4IV|wGY-Gw%o@wWsR8TyAAKQjsbYTzT)Jg453x) zqg_^eWt$g_g)G1gs=nVK){;J)gk)Zulvgf9<;8r-Y9iLMf|ptA(~<)p)r$ndR9a^0 z`z;`ZkdVv|a}~%3CpuZPTB@J6LaKa#}F-UYe4j=h-Y zm)CtEw5706BO#D@Bu+g)3}~6^onje+6tTD13MDA#9nZ`t5d)p=HjfC+qQpLGuc^W6 z%k?^uaI|?^Q`aWAOYaY33M*qVO$fWWp1)%I>gHMah%_qzGan$~}z0Z6BZPHgdW zoLff#Xq0XT&`A56NajoT_5M;AXrTz$P0g*K;(L&!1W0E?5F`yYQXfJvmd58{z=&~c z4$p@+L-r}Z#U*Tw;A&f8yGvs$VzaE28Zp@!druaQDdRm}1}v) zMLaQNCTK4_j2t2&;~JjG@Li_cKVVn$_YLPb^~=@1^XI#s#I%)~M#eS=cl0HB%Z~o0 z;E=IMr@qccVY!(rUlyRbA)GMBT?) z?_}XefkE>7)o7}T2h+1WtEhRcU`8?jH$x!ENtW=z=pd^iD+o}0G|@lxr(}>MnzXRk zj7KKZK9F7W?n2ZP*vH+%Dhn~VCVD6FAi^!dskK|O{u*4^l|J{RO8-498F7F4C&Oy* zyUZOUzuoRtf4>xbcuGh3%6ip46d$1>aNb$)TJO;xwa)n0(SCS^PR#}>80i>RRN4#V zfGFBW`bAE*=LBe;h%t$j5lC3BJSY6zIak9`LvqYgNkUD&jv8_OCsN!za}XZ!QfrnLl(_nr^q%Ac25H@&0q3gI*RL{QO z6NU^aa@R!yOnVfx8gMD|GQstT3mZlDO(Xj6G;wFIAD(*B;q%_}rRU3rd)WUS;P85Y z!eP0sfSQh>r`}fPJN4Nk<5z8)Q+hJ5c(HNKKMl5wJ+;{`JdFGHd+`zBILj+xG7~3? zR7{9N37J++rK5saeV$ME>4?M(LWo=2m3@>_t`ZQR_7{y0BI^Oxtj~wy*lwK)*Kch7 z`j>qkwgx~n>)-blhMdY0pm%FGEktVc2eMZOR?kJ{_fYUSX6-rEqc$*Q8D~K?ld5gs zk|8+|wbluH_|j$C*wn3L z0!4`T0&@#9k7A5HqryX8-$i6R7M4mp12JLrc^*_FiIUc|cZR4e!)QoA8Ax+=$C+qV zhah9A6(F*^x>$4kzf20J(@`5yF=)Oy9b+54E^!8$6dwJBebjj4B+8LQ-W@UU&L|UV zTHWk%;N}LbABy(M)a9jZi^xbXFZZiSKM*fBq@-IBG^x|vCXz(R1Y zPj>*BBX;BEP6ah0jw)$bOF|%g>7e{5S=-;^tYsFvvP z>?59+Fdr6=<|bKk@+{|pwwi9~aPwT`L2(^<5^Uxgs*R|T==AjE9r{_4@5*%?)ndl&6z%<%hZT58Ra1L%>WX?TE`&Ko{_O)=}#PGWMQTo!pHrEM2~;&8we(>D7{$LVPV~Qil&ND~0MxkhI{G$8Zzbd z%jH0El+%(howo`F$!g$?nuPiX<;QL{7Xm+OeY=u>hZmH^D%0Vl#_HSLngi|-Q^62D z=XRAn2N@FFvoP41ae!MB!MQU^6#VgL63-zty=v>{egi}17DOX>86ZzUpI9@J$osRx zO!agaaeb~uwX$>usHafJ)ww9-4^#oC9+X1+tBxv4LYe4Dt|&+)hC@jP)tDK~d{#Xp z1K+RD-k1;Ua#n(Tio_`~~nzC;-MU3?sRnD_|^Gv!Y@CKv%_vdPDK}L-u`dgR+Y&B diff --git a/zh-cn/application-dev/ability/wantagent.md b/zh-cn/application-dev/ability/wantagent.md index 260fa41f19..b302a8b4e5 100644 --- a/zh-cn/application-dev/ability/wantagent.md +++ b/zh-cn/application-dev/ability/wantagent.md @@ -21,7 +21,7 @@ wantAgent封装了一个指定行为的意图,可以通过wantAgent.trigger接 import wantAgent from '@ohos.wantAgent'; ``` -2. 创建WantAgentInfo信息,详细的WantAgentInfo信息数据类型及包含的参数请见[WantAgentInfo文档](../reference/apis/js-apis-wantAgent.md#WantAgentInfo)介绍。 +2. 创建WantAgentInfo信息,详细的WantAgentInfo信息数据类型及包含的参数请见[WantAgentInfo文档](../reference/apis/js-apis-wantAgent.md#wantagentinfo)介绍。 ```javascript private wantAgentObj = null //用于保存创建成功的wantAgent对象,后续使用其完成触发的动作 diff --git a/zh-cn/application-dev/napi/Readme-CN.md b/zh-cn/application-dev/napi/Readme-CN.md new file mode 100644 index 0000000000..964849c316 --- /dev/null +++ b/zh-cn/application-dev/napi/Readme-CN.md @@ -0,0 +1,5 @@ +# Native API的相关指导 + +- [Native API在应用工程中的使用指导](napi-guidelines.md) +- [drawing开发指导](drawing-guidelines.md) +- [rawfile开发指导](rawfile-guidelines.md) diff --git a/zh-cn/application-dev/napi/drawing-guidelines.md b/zh-cn/application-dev/napi/drawing-guidelines.md new file mode 100644 index 0000000000..ae8af75872 --- /dev/null +++ b/zh-cn/application-dev/napi/drawing-guidelines.md @@ -0,0 +1,208 @@ +# drawing开发指导 + +## 场景介绍 + +native drawing模块提供了一系列的接口用于基本图形和字体的绘制。常见的应用场景举例: +* 2D图形绘制。 +* 文本绘制和显示。 + +## 接口说明 + +| 接口名 | 描述 | +| -------- | -------- | +| OH_Drawing_BitmapCreate (void) | 创建一个位图对象。 | +| OH_Drawing_BitmapBuild (OH_Drawing_Bitmap *, const uint32_t width, const uint32_t height, const OH_Drawing_BitmapFormat *) | 初始化位图对象的宽度和高度,并且为该位图设置像素格式。 | +| OH_Drawing_CanvasCreate (void) | 创建一个画布对象。 | +| OH_Drawing_CanvasBind (OH_Drawing_Canvas *, OH_Drawing_Bitmap *) | 将一个位图对象绑定到画布中,使得画布绘制的内容输出到位图中(即CPU渲染)。 | +| OH_Drawing_CanvasAttachBrush (OH_Drawing_Canvas *, const OH_Drawing_Brush *) | 设置画刷给画布,画布将会使用设置的画刷样式和颜色去填充绘制的图形形状。 | +| OH_Drawing_CanvasAttachPen (OH_Drawing_Canvas *, const OH_Drawing_Pen *) | 设置画笔给画布,画布将会使用设置画笔的样式和颜色去绘制图形形状的轮廓。 | +| OH_Drawing_CanvasDrawPath (OH_Drawing_Canvas *, const OH_Drawing_Path *) | 画一个自定义路径。 | +| OH_Drawing_PathCreate (void) | 创建一个路径对象。 | +| OH_Drawing_PathMoveTo (OH_Drawing_Path *, float x, float y) | 设置自定义路径的起始点位置。 | +| OH_Drawing_PathLineTo (OH_Drawing_Path *, float x, float y) | 添加一条到目标点的线段。 | +| OH_Drawing_PathClose (OH_Drawing_Path *) | 闭合路径,会添加一条到路径起点位置的线段。 | +| OH_Drawing_PenCreate (void) | 创建一个画笔对象。 | +| OH_Drawing_PenSetAntiAlias (OH_Drawing_Pen *, bool) | 设置抗锯齿属性,如果为真则说明画笔会启用抗锯齿功能,在绘制图形时会对图形的边缘像素进行半透明的模糊处理。 | +| OH_Drawing_PenSetWidth (OH_Drawing_Pen *, float width) | 设置画笔的厚度属性,厚度属性描述了画笔绘制图形轮廓的宽度。 | +| OH_Drawing_BrushCreate (void) | 创建一个画刷对象。 | +| OH_Drawing_BrushSetColor (OH_Drawing_Brush *, uint32_t color) | 设置画刷的颜色属性,颜色属性描述了画刷填充图形时使用的颜色,用一个32位(ARGB)的变量表示。 | +| OH_Drawing_CreateTypographyStyle (void) | 创建一个排版对象,用于定义排版样式。 | +| OH_Drawing_CreateTextStyle (void) | 创建一个文本对象,用于定义文本样式。 | +| OH_Drawing_TypographyHandlerAddText (OH_Drawing_TypographyCreate *, const char *) | 设置文本内容。 | +| OH_Drawing_TypographyPaint (OH_Drawing_Typography *, OH_Drawing_Canvas *, double, double) | 显示文本。 | + +详细的接口说明请参考[Drawing](../reference/native-apis/_drawing.md)。 + +## 2D图形绘制开发步骤 + +以下步骤描述了在**OpenHarmony**如何使用 **native drawing** 模块的画布画笔绘制一个基本的2D图形: + +1. **创建Bitmap实例**。使用 **drawing_bitmap.h** 的 **OH_Drawing_BitmapCreate** 接口创建一个Bitmap实例 **cBitmap**,并使用 **OH_Drawing_BitmapBuild** 指定其长宽大小和像素格式。 + + ```c++ + // 创建一个bitmap对象 + OH_Drawing_Bitmap* cBitmap = OH_Drawing_BitmapCreate(); + // 定义bitmap的像素格式 + OH_Drawing_BitmapFormat cFormat {COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUYE}; + // 构造对应格式的bitmap + OH_Drawing_BitmapBuild(cBitmap, width, height, &cFormat); + ``` + +2. **创建画布实例**。使用 **drawing_canvas.h** 的 **OH_Drawing_CanvasCreate** 接口创建一个画布实例 **cCanvas**,并使用 **OH_Drawing_CanvasBind** 接口将 **cBitmap** 实例绑定到 **cCanvas** 上,后续在画布上绘制的内容会输出到绑定的 **cBitmap** 实例中。 + + ```c++ + // 创建一个canvas对象 + OH_Drawing_Canvas* cCanvas = OH_Drawing_CanvasCreate(); + // 将画布与bitmap绑定,画布画的内容会输出到绑定的bitmap内存中 + OH_Drawing_CanvasBind(cCanvas, cBitmap); + // 使用白色清除画布内容 + OH_Drawing_CanvasClear(cCanvas, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0xFF, 0xFF)); + ``` + +3. **构造Path形状**。使用 **drawing_path.h** 提供的接口完成一个五角星形状的构造 **cPath**。 + + ```c++ + int len = 300; + + float aX = 500; + float aY = 500; + + float dX = aX - len * std::sin(18.0f); + float dY = aY + len * std::cos(18.0f); + + float cX = aX + len * std::sin(18.0f); + float cY = dY; + + float bX = aX + (len / 2.0); + float bY = aY + std::sqrt((cX - dX) * (cX - dX) + (len / 2.0) * (len / 2.0)); + + float eX = aX - (len / 2.0); + float eY = bY; + + // 创建一个path对象,然后使用接口连接成一个五角星形状 + OH_Drawing_Path* cPath = OH_Drawing_PathCreate(); + // 指定path的起始位置 + OH_Drawing_PathMoveTo(cPath, aX, aY); + // 用直线连接到目标点 + OH_Drawing_PathLineTo(cPath, bX, bY); + OH_Drawing_PathLineTo(cPath, cX, cY); + OH_Drawing_PathLineTo(cPath, dX, dY); + OH_Drawing_PathLineTo(cPath, eX, eY); + // 闭合形状,path绘制完毕 + OH_Drawing_PathClose(cPath); + ``` + +4. **设置画笔和画刷样式**。使用 **drawing_pen.h** 的 **OH_Drawing_PenCreate** 接口创建一个画笔实例 **cPen**, 并设置抗锯齿、颜色、线宽等属性,画笔用于形状边框线的绘制。使用**drawing_brush.h** 的 **OH_Drawing_BrushCreate** 接口创建一个画刷实例 **cBrush**, 并设置填充颜色, 画刷用于形状内部的填充。使用 **drawing_canvas.h** 的 **OH_Drawing_CanvasAttachPen** 和 **OH_Drawing_CanvasAttachBrush** 接口将画笔画刷的实例设置到画布实例中。 + + ```c++ + // 创建一个画笔Pen对象,Pen对象用于形状的边框线绘制 + OH_Drawing_Pen* cPen = OH_Drawing_PenCreate(); + OH_Drawing_PenSetAntiAlias(cPen, true); + OH_Drawing_PenSetColor(cPen, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0x00, 0x00)); + OH_Drawing_PenSetWidth(cPen, 10.0); + OH_Drawing_PenSetJoin(cPen, LINE_ROUND_JOIN); + // 将Pen画笔设置到canvas中 + OH_Drawing_CanvasAttachPen(cCanvas, cPen); + + // 创建一个画刷Brush对象,Brush对象用于形状的填充 + OH_Drawing_Brush* cBrush = OH_Drawing_BrushCreate(); + OH_Drawing_BrushSetColor(cBrush, OH_Drawing_ColorSetArgb(0xFF, 0x00, 0xFF, 0x00)); + + // 将Brush画刷设置到canvas中 + OH_Drawing_CanvasAttachBrush(cCanvas, cBrush); + ``` + +5. **绘制Path形状**。使用 **drawing_canvas.h** 的 **OH_Drawing_CanvasDrawPath** 接口将五角星绘制到画布上,绘制完毕后不再使用的实例需要调用对应的接口进行销毁。 + + ```c++ + // 在画布上画path的形状,五角星的边框样式为pen设置,颜色填充为Brush设置 + OH_Drawing_CanvasDrawPath(cCanvas, cPath); + // 销毁创建的对象 + OH_Drawing_BrushDestory(cBrush); + OH_Drawing_PenDestory(cPen); + OH_Drawing_PathDestory(cPath); + ``` + +6. **获取像素数据**。使用 **drawing_bitmap.h** 的 **OH_Drawing_BitmapGetPixels** 接口获取到画布绑定bitmap实例的像素地址,该地址指向的内存包含画布刚刚绘制的像素数据。 + + ```c++ + // 画完后获取像素地址,地址指向的内存包含画布画的像素数据 + void* bitmapAddr = OH_Drawing_BitmapGetPixels(cBitmap); + auto ret = memcpy_s(addr, addrSize, bitmapAddr, addrSize); + if (ret != EOK) { + LOGI("memcpy_s failed"); + } + // 销毁canvas对象 + OH_Drawing_CanvasDestory(cCanvas); + // 销毁bitmap对象 + OH_Drawing_BitmapDestory(cBitmap); + ``` + +## 文本绘制显示开发步骤 + +以下步骤描述了在OpenHarmony中,如何使用**native drawing**模块的文字显示功能: +1. **创建画布和bitmap实例**。 + + ```c++ + // 创建bitmap + OH_Drawing_Bitmap* cBitmap = OH_Drawing_BitmapCreate(); + OH_Drawing_BitmapFormat cFormat {COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE}; + OH_Drawing_BitmapBuild(cBitmap, width, height, &cFormat); + // 创建canvas + OH_Drawing_Canvas* cCanvas = OH_Drawing_CanvasCreate(); + OH_Drawing_CanvasBind(cCanvas, cBitmap); + OH_Drawing_CanvasClear(cCanvas, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0xFF, 0xFF)); + ``` + +2. **设置排版风格**。 + + ```c++ + // 选择左对齐/居中对齐等排版属性 + OH_Drawing_TypographyStyle* typoStyle = OH_Drawing_CreateTypographyStyle(); + OH_Drawing_SetTypographyTextDirection(typoStyle, TEXT_DIRECTION_LTR); + OH_Drawing_SetTypographyTextAlign(typoStyle, TEXT_ALIGN_LEFT); + ``` + +3. **设置文本风格**。 + + ```c++ + // 设置文字颜色,例如黑色 + OH_Drawing_TextStyle* txtStyle = OH_Drawing_CreateTextStyle(); + OH_Drawing_SetTextStyleColor(txtStyle, OH_Drawing_ColorSetArgb(0xFF, 0x00, 0x00, 0x00)); + // 设置文字大小、字重等属性 + double fontSize = 30; + OH_Drawing_SetTextStyleFontSize(txtStyle, fontSize); + OH_Drawing_SetTextStyleFontWeight(txtStyle, FONT_WEIGHT_400); + OH_Drawing_SetTextStyleBaseLine(txtStyle, TEXT_BASELINE_ALPHABETIC); + OH_Drawing_SetTextStyleFontHeight(txtStyle, 1); + // 设置字体类型等 + const char* fontFamilies[] = {"Roboto"}; + OH_Drawing_SetTextStyleFontFamilies(txtStyle, 1, fontFamilies); + OH_Drawing_SetTextStyleFontStyle(txtStyle, FONT_STYLE_NORMAL); + OH_Drawing_SetTextStyleLocale(txtStyle, "en"); + ``` + +4. **生成最终文字显示效果**。 + + ```c++ + OH_Drawing_TypographyCreate* handler = OH_Drawing_CreateTypographyHandler(typoStyle, + OH_Drawing_CreateFontCollection()); + OH_Drawing_TypographyHandlerPushTextStyle(handler, txtStyle); + // 设置文字内容 + const char* text = "OpenHarmony\n"; + OH_Drawing_TypographyHandlerAddText(handler, text); + OH_Drawing_TypographyHandlerPopTextStyle(handler); + OH_Drawing_Typography* typography = OH_Drawing_CreateTypography(handler); + // 设置页面最大宽度 + double maxWidth = 800.0; + OH_Drawing_TypographyLayout(typography, maxWidth); + // 设置文字显示起始位置 + double position[2] = {10.0, 15.0}; + OH_Drawing_TypographyPaint(typography, cCanvas, position[0], position[1]); + ``` + +## 相关实例 + +针对Drawing模块的使用,有以下相关实例可供参考: +* [Drawing模块2D图形绘制](https://gitee.com/openharmony/graphic_standard/blob/master/rosen/samples/2d_graphics/drawing_c_sample.cpp)。 +* [Drawing模块文本绘制显示](https://gitee.com/openharmony/graphic_standard/blob/master/rosen/samples/text/renderservice/drawing_text_c_sample.cpp)。 diff --git a/zh-cn/application-dev/napi/napi-guidelines.md b/zh-cn/application-dev/napi/napi-guidelines.md new file mode 100644 index 0000000000..41c5a212fd --- /dev/null +++ b/zh-cn/application-dev/napi/napi-guidelines.md @@ -0,0 +1,639 @@ +# Native API在应用工程中的使用指导 + +OpenHarmony的应用必须用js来桥接native。需要使用ace_napi仓中提供的napi接口来处理js交互。napi提供的接口名与三方Node.js一致,目前支持部分接口,符号表见仓下的该文件`libnapi.ndk.json`。 + +## 开发流程: + +IDE中会包含使用Native API的默认工程,使用`File`->`New`->`Create Project`创建`Native C++`模板工程。创建后在`main`目录下会包含`cpp`目录,可以使用ace_napi仓下提供的napi接口进行开发。 + +js侧通过`import`引入native侧包含处理js逻辑的so,如:`import hello from 'libhello.so'`,意为使用libhello.so的能力,native侧通过napi接口创建的js对象会给到应用js侧的`hello`对象。 + +## 开发建议: + +### 1、注册建议 + +* nm_register_func对应的函数需要加上static,防止与其他so里的符号冲突。 +* 模块注册的入口,即使用\_\_attribute\_\_((constructor))修饰的函数的函数名需要确保不与其他模块重复。 +### 2、so命名规则 + +* 每个模块对应一个so +* 如模块名为`hello`,则so的名字为`libhello.so`,`napi_module`中`nm_modname`字段应为`hello`,大小写与模块名保持一致,应用使用时写作:`import hello from 'libhello.so'` + +### 3、js对象线程限制 + +ark引擎会对js对象线程使用进行保护,不正确使用会引起应用crash。 + +* napi接口只能在js线程使用。 +* env与线程绑定,不能跨线程使用。native侧js对象只能在创建时的线程使用,即与线程所持有的env绑定。 + +### 4. napi_create_async_work接口说明 + +napi_create_async_work里有两个回调: + +* execute:用于异步处理业务逻辑。因为不在JS线程中,所以不允许调用napi的接口。业务逻辑的返回值可以返回到complete回调中处理。 + +* complete:可以调用napi的接口,将execute中的返回值封装成JS对象返回。此回调在JS线程中执行。 + +```c++ +napi_status napi_create_async_work(napi_env env, + napi_value async_resource, + napi_value async_resource_name, + napi_async_execute_callback execute, + napi_async_complete_callback complete, + void* data, + napi_async_work* result) +``` + + + +## 示例一,storage 模块——同步异步接口封装 + +### 模块简介 + +本例通过实现 `storage` 模块展示了同步和异步方法的封装。`storage ` 模块实现了数据的保存、获取、删除、清除功能。 + +### 接口声明 + +```typescript +import { AsyncCallback } from './basic'; +declare namespace storage { + function get(key: string, callback: AsyncCallback): void; + function get(key: string, defaultValue: string, callback: AsyncCallback): void; + function get(key: string, defaultValue?: string): Promise; + function set(key: string, value: string, callback: AsyncCallback): void; + function remove(key: string, callback: AsyncCallback): void; + function clear(callback: AsyncCallback): void; + function getSync(key: string, defaultValue?: string): string; + function setSync(key: string, value: string): void; + function removeSync(key: string): void; + function clearClear(): void; +} +export default storage; +``` + + + +### 具体实现 + +完整代码参见仓下路径:`sample/native_module_storage/` + +#### 模块注册 + +如下,注册了4个同步接口(`getSync`、`setSync`、`removeSync`、`clearSync`)、4个异步接口(`get`、`set`、`remove`、`clear`)。 + +```c++ +/*********************************************** + * Module export and register + ***********************************************/ +static napi_value StorgeExport(napi_env env, napi_value exports) +{ + napi_property_descriptor desc[] = { + DECLARE_NAPI_FUNCTION("get", JSStorageGet), + DECLARE_NAPI_FUNCTION("set", JSStorageSet), + DECLARE_NAPI_FUNCTION("remove", JSStorageDelete), + DECLARE_NAPI_FUNCTION("clear", JSStorageClear), + + DECLARE_NAPI_FUNCTION("getSync", JSStorageGetSync), + DECLARE_NAPI_FUNCTION("setSync", JSStorageSetSync), + DECLARE_NAPI_FUNCTION("deleteSync", JSStorageDeleteSync), + DECLARE_NAPI_FUNCTION("clearSync", JSStorageClearSync), + }; + NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); + return exports; +} + +// storage module +static napi_module storage_module = {.nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = StorgeExport, + .nm_modname = "storage", + .nm_priv = ((void*)0), + .reserved = {0}}; + +// storage module register +extern "C" __attribute__((constructor)) void StorageRegister() +{ + napi_module_register(&storage_module); +} +``` + +#### getSync 函数实现 + +如上注册时所写,`getSync` 对应的函数是 `JSStorageGetSync` 。从 `gKeyValueStorage` 中获取数据后,创建一个字符串对象并返回。 + +```c +static napi_value JSStorageGetSync(napi_env env, napi_callback_info info) +{ + GET_PARAMS(env, info, 2); + NAPI_ASSERT(env, argc >= 1, "requires 1 parameter"); + char key[32] = {0}; + size_t keyLen = 0; + char value[128] = {0}; + size_t valueLen = 0; + + // 参数解析 + for (size_t i = 0; i < argc; i++) { + napi_valuetype valueType; + napi_typeof(env, argv[i], &valueType); + + if (i == 0 && valueType == napi_string) { + napi_get_value_string_utf8(env, argv[i], key, 31, &keyLen); + } else if (i == 1 && valueType == napi_string) { + napi_get_value_string_utf8(env, argv[i], value, 127, &valueLen); + break; + } else { + NAPI_ASSERT(env, false, "type mismatch"); + } + } + + // 获取数据的业务逻辑,这里简单地从一个全局变量中获取 + auto itr = gKeyValueStorage.find(key); + napi_value result = nullptr; + if (itr != gKeyValueStorage.end()) { + // 获取到数据后创建一个string类型的JS对象 + napi_create_string_utf8(env, itr->second.c_str(), itr->second.length(), &result); + } else if (valueLen > 0) { + // 没有获取到数据使用默认值创建JS对象 + napi_create_string_utf8(env, value, valueLen, &result); + } else { + NAPI_ASSERT(env, false, "key does not exist"); + } + // 返回结果 + return result; +} +``` + +#### get 函数实现 + +如上注册时所写,`get`对应的函数式`JSStorageGet`。 + +```c +static napi_value JSStorageGet(napi_env env, napi_callback_info info) +{ + GET_PARAMS(env, info, 3); + NAPI_ASSERT(env, argc >= 1, "requires 1 parameter"); + + // StorageAsyncContext是自己定义的一个类,用于保存执行过程中的数据 + StorageAsyncContext* asyncContext = new StorageAsyncContext(); + + asyncContext->env = env; + + // 获取参数 + for (size_t i = 0; i < argc; i++) { + napi_valuetype valueType; + napi_typeof(env, argv[i], &valueType); + + if (i == 0 && valueType == napi_string) { + napi_get_value_string_utf8(env, argv[i], asyncContext->key, 31, &asyncContext->keyLen); + } else if (i == 1 && valueType == napi_string) { + napi_get_value_string_utf8(env, argv[i], asyncContext->value, 127, &asyncContext->valueLen); + } else if (i == 1 && valueType == napi_function) { + napi_create_reference(env, argv[i], 1, &asyncContext->callbackRef); + break; + } else if (i == 2 && valueType == napi_function) { + napi_create_reference(env, argv[i], 1, &asyncContext->callbackRef); + } else { + NAPI_ASSERT(env, false, "type mismatch"); + } + } + + napi_value result = nullptr; + + // 根据参数判断开发者使用的是promise还是callback + if (asyncContext->callbackRef == nullptr) { + // 创建promise + napi_create_promise(env, &asyncContext->deferred, &result); + } else { + napi_get_undefined(env, &result); + } + + napi_value resource = nullptr; + napi_create_string_utf8(env, "JSStorageGet", NAPI_AUTO_LENGTH, &resource); + + napi_create_async_work( + env, nullptr, resource, + // 回调1:此回调由napi异步执行,里面就是需要异步执行的业务逻辑。由于是异步线程执行,所以不要在此通过napi接口操作JS对象。 + [](napi_env env, void* data) { + StorageAsyncContext* asyncContext = (StorageAsyncContext*)data; + auto itr = gKeyValueStorage.find(asyncContext->key); + if (itr != gKeyValueStorage.end()) { + strncpy_s(asyncContext->value, 127, itr->second.c_str(), itr->second.length()); + asyncContext->status = 0; + } else { + asyncContext->status = 1; + } + }, + // 回调2:此回调在上述异步回调执行完后执行,此时回到了JS线程来回调开发者传入的回调 + [](napi_env env, napi_status status, void* data) { + StorageAsyncContext* asyncContext = (StorageAsyncContext*)data; + napi_value result[2] = {0}; + if (!asyncContext->status) { + napi_get_undefined(env, &result[0]); + napi_create_string_utf8(env, asyncContext->value, strlen(asyncContext->value), &result[1]); + } else { + napi_value message = nullptr; + napi_create_string_utf8(env, "key does not exist", NAPI_AUTO_LENGTH, &message); + napi_create_error(env, nullptr, message, &result[0]); + napi_get_undefined(env, &result[1]); + } + if (asyncContext->deferred) { + // 如果走的是promise,那么判断回调1的结果 + if (!asyncContext->status) { + // 回调1执行成功(status为1)时触发,也就是触发promise里then里面的回调 + napi_resolve_deferred(env, asyncContext->deferred, result[1]); + } else { + // 回调1执行失败(status为0)时触发,也就是触发promise里catch里面的回调 + napi_reject_deferred(env, asyncContext->deferred, result[0]); + } + } else { + // 如果走的是callback,则通过napi_call_function调用callback回调返回结果 + napi_value callback = nullptr; + napi_value returnVal; + napi_get_reference_value(env, asyncContext->callbackRef, &callback); + napi_call_function(env, nullptr, callback, 2, result, &returnVal); + napi_delete_reference(env, asyncContext->callbackRef); + } + napi_delete_async_work(env, asyncContext->work); + delete asyncContext; + }, + (void*)asyncContext, &asyncContext->work); + napi_queue_async_work(env, asyncContext->work); + + return result; +} +``` + +### JS Sample Code + +```js +import storage from 'libstorage.so'; + +export default { + testGetSync() { + const name = storage.getSync('name'); + console.log('name is ' + name); + }, + testGet() { + storage.get('name') + .then(date => { + console.log('name is ' + data); + }) + .catch(error => { + console.log('error: ' + error); + }); + } +} +``` + + + +## 示例二,NetServer 模块——native与js对象绑定 + +### 模块简介 + +本例展示了`on/off/once`订阅方法的实现,同时也包含了 C++ 与 JS 对象通过 wrap 接口的绑定。NetServer 模块实现了一个网络服务。 + +### 接口声明 + +```typescript +export class NetServer { + function start(port: number): void; + function stop(): void; + function on('start' | 'stop', callback: Function): void; + function once('start' | 'stop', callback: Function): void; + function off('start' | 'stop', callback: Function): void; +} +``` + +### 具体实现 + +完整代码参见:`sample/native_module_netserver/` + +#### 模块注册 + +```c +static napi_value NetServer::Export(napi_env env, napi_value exports) +{ + const char className[] = "NetServer"; + napi_property_descriptor properties[] = { + DECLARE_NAPI_FUNCTION("start", JS_Start), + DECLARE_NAPI_FUNCTION("stop", JS_Stop), + DECLARE_NAPI_FUNCTION("on", JS_On), + DECLARE_NAPI_FUNCTION("once", JS_Once), + DECLARE_NAPI_FUNCTION("off", JS_Off), + }; + napi_value netServerClass = nullptr; + + napi_define_class(env, className, sizeof(className), JS_Constructor, nullptr, countof(properties), properties, + &netServerClass); + + napi_set_named_property(env, exports, "NetServer", netServerClass); + + return exports; +} +``` + +#### 在构造函数中绑定 C++ 与 JS 对象 + +```c +napi_value NetServer::JS_Constructor(napi_env env, napi_callback_info cbinfo) +{ + napi_value thisVar = nullptr; + void* data = nullptr; + napi_get_cb_info(env, cbinfo, nullptr, nullptr, &thisVar, &data); + + // C++ Native对象,准备与JS对象映射在一起 + NetServer* netServer = new NetServer(env, thisVar); + + // 使用napi_wrap将netServer与thisVar(即当前创建的这个JS对象)做绑定 + napi_wrap( + env, thisVar, netServer, + // JS对象由引擎自动回收释放,当JS对象释放时触发该回调,在改回调中释放netServer + [](napi_env env, void* data, void* hint) { + printf("NetServer::Destructor\n"); + NetServer* netServer = (NetServer*)data; + delete netServer; + }, + nullptr, nullptr); + + return thisVar; +} +``` + +#### 从 JS 对象中取出 C++ 对象 + +```c +napi_value NetServer::JS_Start(napi_env env, napi_callback_info cbinfo) +{ + size_t argc = 1; + napi_value argv[1] = {0}; + napi_value thisVar = nullptr; + void* data = nullptr; + napi_get_cb_info(env, cbinfo, &argc, argv, &thisVar, &data); + + NetServer* netServer = nullptr; + // 通过napi_unwrap从thisVar中取出C++对象 + napi_unwrap(env, thisVar, (void**)&netServer); + + NAPI_ASSERT(env, argc >= 1, "requires 1 parameter"); + + napi_valuetype valueType; + napi_typeof(env, argv[0], &valueType); + NAPI_ASSERT(env, valueType == napi_number, "type mismatch for parameter 1"); + + int32_t port = 0; + napi_get_value_int32(env, argv[0], &port); + + // 开启服务 + netServer->Start(port); + + napi_value result = nullptr; + napi_get_undefined(env, &result); + return result; +} +``` + +`netServer->Start`后回调通过`on`注册的`start`事件。 + +```c +int NetServer::Start(int port) +{ + printf("NetServer::Start thread_id: %ld \n", uv_thread_self()); + + struct sockaddr_in addr; + int r; + + uv_ip4_addr("0.0.0.0", port, &addr); + + r = uv_tcp_init(loop_, &tcpServer_); + if (r) { + fprintf(stderr, "Socket creation error\n"); + return 1; + } + + r = uv_tcp_bind(&tcpServer_, (const struct sockaddr*)&addr, 0); + if (r) { + fprintf(stderr, "Bind error\n"); + return 1; + } + + r = uv_listen((uv_stream_t*)&tcpServer_, SOMAXCONN, OnConnection); + if (r) { + fprintf(stderr, "Listen error %s\n", uv_err_name(r)); + return 1; + } + + // 服务启动后触发“start”事件 + Emit("start", nullptr); + + return 0; +} +``` + +#### 注册或释放(on/off/once)事件,以 on 为例 + +```c +napi_value NetServer::JS_On(napi_env env, napi_callback_info cbinfo) +{ + size_t argc = 2; + napi_value argv[2] = {0}; + napi_value thisVar = 0; + void* data = nullptr; + napi_get_cb_info(env, cbinfo, &argc, argv, &thisVar, &data); + + NetServer* netServer = nullptr; + // 通过napi_unwrap取出NetServer指针 + napi_unwrap(env, thisVar, (void**)&netServer); + + NAPI_ASSERT(env, argc >= 2, "requires 2 parameter"); + + // 参数类型校验 + napi_valuetype eventValueType; + napi_typeof(env, argv[0], &eventValueType); + NAPI_ASSERT(env, eventValueType == napi_string, "type mismatch for parameter 1"); + + napi_valuetype eventHandleType; + napi_typeof(env, argv[1], &eventHandleType); + NAPI_ASSERT(env, eventHandleType == napi_function, "type mismatch for parameter 2"); + + char type[64] = {0}; + size_t typeLen = 0; + + napi_get_value_string_utf8(env, argv[0], type, 63, &typeLen); + + // 注册事件handler + netServer->On((const char*)type, argv[1]); + + napi_value result = nullptr; + napi_get_undefined(env, &result); + return result; +} +``` + +### JS Sample Code + +```javascript +import { NetServer } from 'libnetserver.so'; + +export default { + testNetServer() { + var netServer = new NetServer(); + netServer.on('start', (event) => {}); + netServer.start(1000); // 端口号1000, start完成后回调上面注册的 “start” 回调 + } +} +``` + + + +## 示例三,在非JS线程中回调JS接口 + +### 模块简介 + +本模块介绍如何在非JS线程中回调JS应用的回调函数。例如JS应用中注册了某个sensor的监听,这个sensor的数据是由一个SA服务来上报的,当SA通过IPC调到客户端时,此时的执行线程是一个IPC通信线程,与应用的JS线程是两个不同的线程。这时就需要将执行JS回调的任务抛到JS线程中才能执行,否则会出现崩溃。 + +### 具体实现 + +完整代码参见:`sample/native_module_callback/` + +#### 模块注册 + +如下,注册了1个接口`test`,会传入一个参数,类型为包含一个参数的函数。 + +```c++ +/*********************************************** + * Module export and register + ***********************************************/ +static napi_value CallbackExport(napi_env env, napi_value exports) +{ + static napi_property_descriptor desc[] = { + DECLARE_NAPI_FUNCTION("test", JSTest) + }; + NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); + return exports; +} + +// callback module define +static napi_module callbackModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = CallbackExport, + .nm_modname = "callback", + .nm_priv = ((void*)0), + .reserved = { 0 }, +}; + +// callback module register +extern "C" __attribute__((constructor)) void CallbackTestRegister() +{ + napi_module_register(&callbackModule); +} +``` + +#### 获取env中的loop,抛任务回JS线程 + +```c++ +#include + +#include "napi/native_api.h" +#include "napi/native_node_api.h" + +#include "uv.h" + +struct CallbackContext { + napi_env env = nullptr; + napi_ref callbackRef = nullptr; + int retData = 0; +}; + +void callbackTest(CallbackContext* context) +{ + uv_loop_s* loop = nullptr; + // 此处的env需要在注册JS回调时保存下来。从env中获取对应的JS线程的loop。 + napi_get_uv_event_loop(context->env, &loop); + + // 创建uv_work_t用于传递私有数据,注意回调完成后需要释放内存,此处省略生成回传数据的逻辑,传回int类型1。 + uv_work_t* work = new uv_work_t; + context->retData = 1; + work->data = (void*)context; + + // 调用libuv接口抛JS任务到loop中执行。 + uv_queue_work( + loop, + work, + // 此回调在另一个普通线程中执行,用于处理异步任务,回调执行完后执行下面的回调。本场景下该回调不需要执行任务。 + [](uv_work_t* work) {}, + // 此回调会在env对应的JS线程中执行。 + [](uv_work_t* work, int status) { + CallbackContext* context = (CallbackContext*)work->data; + napi_handle_scope scope = nullptr; + // 打开handle scope用于管理napi_value的生命周期,否则会内存泄露。 + napi_open_handle_scope(context->env, &scope); + if (scope == nullptr) { + return; + } + + // 调用napi。 + napi_value callback = nullptr; + napi_get_reference_value(context->env, context->callbackRef, &callback); + napi_value retArg; + napi_create_int32(context->env, context->retData, &retArg); + napi_value ret; + napi_call_function(context->env, nullptr, callback, 1, &retArg, &ret); + napi_delete_reference(context->env, context->callbackRef); + + // 关闭handle scope释放napi_value。 + napi_close_handle_scope(context->env, scope); + + // 释放work指针。 + if (work != nullptr) { + delete work; + } + + delete context; + } + ); +} + +static napi_value JSTest(napi_env env, napi_callback_info info) +{ + size_t argc = 1; + napi_value argv[1] = { 0 }; + napi_value thisVar = nullptr; + void* data = nullptr; + napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); + + // 获取第一个入参,即需要后续触发的回调函数 + napi_valuetype valueType = napi_undefined; + napi_typeof(env, argv[0], &valueType); + if (valueType != napi_function) { + return nullptr; + } + // 存下env与回调函数,用于传递 + auto asyncContext = new CallbackContext(); + asyncContext->env = env; + napi_create_reference(env, argv[0], 1, &asyncContext->callbackRef); + // 模拟抛到非js线程执行逻辑 + std::thread testThread(callbackTest, asyncContext); + testThread.detach(); + + return nullptr; +} +``` + +### JS Sample Code + +```js +import callback from 'libcallback.so'; + +export default { + testcallback() { + callback.test((data) => { + console.error('test result = ' + data) + }) + } +} +``` + diff --git a/zh-cn/application-dev/napi/rawfile-guidelines.md b/zh-cn/application-dev/napi/rawfile-guidelines.md new file mode 100644 index 0000000000..1b4d72eea0 --- /dev/null +++ b/zh-cn/application-dev/napi/rawfile-guidelines.md @@ -0,0 +1,174 @@ +# rawfile开发指导 + + + +## 场景介绍 + +开发者可以通过本指导了解在OpenHarmony应用中,如何使用rawfile native接口操作rawfile目录和文件。功能包括遍历、打开、搜索、读取和关闭rawfile。 + +## 接口说明 + +| 接口名 | 描述 | +| :----------------------------------------------------------- | :--------------------------------------- | +| NativeResourceManager *OH_ResourceManager_InitNativeResourceManager(napi_env env, napi_value jsResMgr) | 初始化native resource manager。 | +| RawDir *OH_ResourceManager_OpenRawDir(const NativeResourceManager *mgr, const char *dirName) | 打开指定rawfile目录。 | +| int OH_ResourceManager_GetRawFileCount(RawDir *rawDir) | 获取指定rawfile目录下的rawfile文件数量。 | +| const char *OH_ResourceManager_GetRawFileName(RawDir *rawDir, int index) | 获取rawfile名字。 | +| RawFile *OH_ResourceManager_OpenRawFile(const NativeResourceManager *mgr, const char *fileName) | 打开指定rawfile文件。 | +| long OH_ResourceManager_GetRawFileSize(RawFile *rawFile) | 获取rawfile文件大小。 | +| int OH_ResourceManager_SeekRawFile(const RawFile *rawFile, long offset, int whence) | 指定rawfile内偏移量。 | +| long OH_ResourceManager_GetRawFileOffset(const RawFile *rawFile) | 获取rawfile偏移量。 | +| int OH_ResourceManager_ReadRawFile(const RawFile *rawFile, void *buf, size_t length) | 读取rawfile文件内容。 | +| void OH_ResourceManager_CloseRawFile(RawFile *rawFile) | 释放rawfile文件相关资源。 | +| void OH_ResourceManager_CloseRawDir(RawDir *rawDir) | 释放rawfile目录相关资源。 | +| bool OH_ResourceManager_GetRawFileDescriptor(const RawFile *rawFile, RawFileDescriptor &descriptor) | 获取rawfile的fd。 | +| bool OH_ResourceManager_ReleaseRawFileDescriptor(const RawFileDescriptor &descriptor) | 释放rawfile的fd。 | +| void OH_ResourceManager_ReleaseNativeResourceManager(NativeResourceManager *resMgr) | 释放native resource manager相关资源。 | + +## 开发步骤 + +1. 添加头文件。 + + ```c++ + #include "raw_file_manager.h" + ``` + + + +2. 使用OH_ResourceManager_InitNativeResourceManager(napi_env env, napi_value jsResMgr)接口获取NativeResourceManager实例。 + + ```js + // js侧传递js resource manager。 + import resManager from '@ohos.resourceManager' + import rawfileTest from 'librawFileTest.so' + resManager.getResourceManager().then(resmgr => { + rawfileTest.testRawFile("test", resmgr, (error, value) => { + console.log("test rawFile"); + }) + }); + ``` + + ```c++ + // C++侧获取解析js侧传递的参数。 + NativeResourceManager* nativeResourceManager = nullptr; + std::string path; + if (i == 0 && valueType == napi_string) { + // 解析第一个参数,参数为相对rawfile目录的文件/目录路径。 + ...... + path = buf.data(); + } else if (i == 1 && valueType == napi_object) { + // 解析第二个参数,参数为js resource manager。 + nativeResourceManager = OH_ResourceManager_InitNativeResourceManager(env, argv[i]); + } + ``` + + + +3. 根据NativeResourceManager实例,使用OH_ResourceManager_OpenRawDir接口获取RawDir实例。 + + ```c++ + RawDir* rawDir = OH_ResourceManager_OpenRawDir(nativeResourceManager, path.c_str()); + ``` + + + +4. 根据RawDir实例,使用OH_ResourceManager_GetRawFileCount接口获取对应目录下的rawfile文件总数 。 + + ```c++ + int count = OH_ResourceManager_GetRawFileCount(rawDir); + ``` + + + +5. 根据RawDir实例,使用OH_ResourceManager_GetRawFileName接口获取目录下对应index的rawfile文件名。 + + ```c++ + for (int index = 0; index < count; index++) { + std::string fileName = OH_ResourceManager_GetRawFileName(rawDir, index); + } + ``` + + + +6. 根据NativeResourceManager实例,使用OH_ResourceManager_OpenRawFile接口获取指定文件名的RawFile实例 + + ```c++ + RawFile* rawFile = OH_ResourceManager_OpenRawFile(nativeResourceManager, fileName.c_str()); + ``` + + + +7. 根据RawFile实例,使用OH_ResourceManager_GetRawFileSize接口获取对应rawfile文件大小。 + + ```c++ + long rawFileSize = OH_ResourceManager_GetRawFileSize(rawFile); + ``` + + + +8. 根据RawFile实例,使用OH_ResourceManager_SeekRawFile接口指定rawfile偏移量。 + + ```c++ + int position = OH_ResourceManager_SeekRawFile(rawFile, 10, 0); + int position = OH_ResourceManager_SeekRawFile(rawFile, 0 , 1); + int position = OH_ResourceManager_SeekRawFile(rawFile, -10, 2); + ``` + + + +9. 根据RawFile实例,使用OH_ResourceManager_GetRawFileOffset接口获取rawfile偏移量。 + + ```c++ + long rawFileOffset = OH_ResourceManager_GetRawFileOffset(rawFile) + ``` + + + +10. 根据RawFile实例,使用OH_ResourceManager_ReadRawFile接口读取rawfile文件内容。 + + ```c++ + std::unique_ptr mediaData = std::make_unique(rawFileSize); + long rawFileOffset = OH_ResourceManager_ReadRawFile(rawFile, mediaData.get(), rawFileSize); + ``` + + + +11. 根据RawFile实例,使用OH_ResourceManager_CloseRawFile接口释放rawfile文件相关资源。 + + ```c++ + OH_ResourceManager_CloseRawFile(rawFile); + ``` + + + +12. 根据RawDir实例,使用OH_ResourceManager_CloseRawDir接口释放rawfile目录相关资源。 + + ```c++ + OH_ResourceManager_CloseRawDir(rawDir); + ``` + + + +13. 根据RawFile实例,使用OH_ResourceManager_GetRawFileDescriptor接口获取rawfile的RawFileDescriptor。 + + ```c++ + RawFileDescriptor descriptor; + bool result = OH_ResourceManager_GetRawFileDescriptor(rawFile, descriptor); + ``` + + + +14. 根据RawFileDescriptor实例,使用OH_ResourceManager_ReleaseRawFileDescriptor接口关闭rawfile的fd。 + + ```c++ + OH_ResourceManager_ReleaseRawFileDescriptor(descriptor); + ``` + + + +15. 根据NativeResourceManager实例,使用OH_ResourceManager_ReleaseNativeResourceManager接口释放native resource manager。 + + ```c++ + OH_ResourceManager_ReleaseNativeResourceManager(nativeResourceManager); + ``` + diff --git a/zh-cn/application-dev/quick-start/Readme-CN.md b/zh-cn/application-dev/quick-start/Readme-CN.md index 0ef683ee76..5ad69b2b45 100755 --- a/zh-cn/application-dev/quick-start/Readme-CN.md +++ b/zh-cn/application-dev/quick-start/Readme-CN.md @@ -8,7 +8,7 @@ - [使用JS语言开发(低代码方式)](start-with-js-low-code.md) - 开发基础知识 - [应用包结构说明(FA模型)](package-structure.md) - - [应用包结构说明(Stage模型)](module-structure.md) + - [应用包结构说明(Stage模型)](stage-structure.md) - [资源文件的分类](basic-resource-file-categories.md) - [SysCap说明](syscap.md) diff --git a/zh-cn/application-dev/reference/Readme-CN.md b/zh-cn/application-dev/reference/Readme-CN.md index 7e992dd2cb..ce807bfd00 100644 --- a/zh-cn/application-dev/reference/Readme-CN.md +++ b/zh-cn/application-dev/reference/Readme-CN.md @@ -1,8 +1,12 @@ # 开发参考 - [基于JS扩展的类Web开发范式](arkui-js/Readme-CN.md) - - [基于TS扩展的声明式开发范式](arkui-ts/Readme-CN.md) +- 接口 + - [JS(含eTS) API参考](apis/Readme-CN.md) + - Native API + - [OpenHarmony Native API](./native-apis/Readme-CN.md) + - [标准库](native-lib/third_party_libc/musl.md) + - [Node_API](native-lib/third_party_napi/napi.md) -- [接口](apis/Readme-CN.md) diff --git a/zh-cn/application-dev/reference/native-apis/Readme-CN.md b/zh-cn/application-dev/reference/native-apis/Readme-CN.md new file mode 100644 index 0000000000..f11bbcfaea --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/Readme-CN.md @@ -0,0 +1,33 @@ +# Native API + +- MyProject + - [Native XComponent](_o_h___native_x_component.md) + - [Native_Bundle](_native___bundle.md) + - [HiLog](_hi_log.md) + - [NativeWindow](_native_window.md) + - [Drawing](_drawing.md) + - [Rawfile](rawfile.md) +- 头文件和结构体 + - 头文件 + - [drawing_bitmap.h](drawing__bitmap_8h.md) + - [drawing_brush.h](drawing__brush_8h.md) + - [drawing_canvas.h](drawing__canvas_8h.md) + - [drawing_color.h](drawing__color_8h.md) + - [drawing_font_collection.h](drawing__font__collection_8h.md) + - [drawing_path.h](drawing__path_8h.md) + - [drawing_pen.h](drawing__pen_8h.md) + - [drawing_text_declaration.h](drawing__text__declaration_8h.md) + - [drawing_text_typography.h](drawing__text__typography_8h.md) + - [drawing_types.h](drawing__types_8h.md) + - [external_window.h](external__window_8h.md) + - [log.h](log_8h.md) + - [native_interface_bundle.h](native__interface__bundle_8h.md) + - [native_interface_xcomponent.h](native__interface__xcomponent_8h.md) + - [raw_dir.h](raw__dir_8h.md) + - [raw_file.h](raw__file_8h.md) + - 结构体 + - [OH_Drawing_BitmapFormat](_o_h___drawing___bitmap_format.md) + - [OH_NativeXComponent_Callback](_o_h___native_x_component___callback.md) + - [OH_NativeXComponent_TouchEvent](_o_h___native_x_component___touch_event.md) + - [OH_NativeXComponent_TouchPoint](_o_h___native_x_component___touch_point.md) + - [RawFileDescriptor](_raw_file_descriptor.md) diff --git a/zh-cn/application-dev/reference/native-apis/_drawing.md b/zh-cn/application-dev/reference/native-apis/_drawing.md new file mode 100644 index 0000000000..76b6c2c2e5 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/_drawing.md @@ -0,0 +1,2107 @@ +# Drawing + + +## **Overview** + +**Description:** + +Drawing模块提供包括2D图形渲染、文字绘制和图片显示等功能函数 + +Drawing模块提供包括2D图形渲染、文字绘制和图片显示等功能函数. + +提供2D绘制功能 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Since:** + +8 + +**Version:** + +1.0 + + +## **Summary** + + +### Files + + | File Name | Description | +| -------- | -------- | +| [drawing_bitmap.h](drawing__bitmap_8h.md) | 文件中定义了与位图相关的功能函数 | +| [drawing_brush.h](drawing__brush_8h.md) | 文件中定义了与画刷相关的功能函数 | +| [drawing_canvas.h](drawing__canvas_8h.md) | 文件中定义了与画布相关的功能函数 | +| [drawing_color.h](drawing__color_8h.md) | 文件中定义了与颜色相关的功能函数 | +| [drawing_font_collection.h](drawing__font__collection_8h.md) | 定义绘制模块中与fontCollection相关的函数 | +| [drawing_path.h](drawing__path_8h.md) | 文件中定义了与自定义路径相关的功能函数 | +| [drawing_pen.h](drawing__pen_8h.md) | 文件中定义了与画笔相关的功能函数 | +| [drawing_text_declaration.h](drawing__text__declaration_8h.md) | 提供2d drawing文本相关的数据结构声明 | +| [drawing_text_typography.h](drawing__text__typography_8h.md) | 定义绘制模块中排版相关的函数 | +| [drawing_types.h](drawing__types_8h.md) | 文件中定义了用于绘制2d图形的数据类型,包括画布、画笔、画刷、位图和路径 | + + +### Classes + + | Classe Name | Description | +| -------- | -------- | +| [OH_Drawing_BitmapFormat](_o_h___drawing___bitmap_format.md) | 结构体用于描述位图像素的格式,包括颜色类型和透明度类型 | + + +### Typedefs + + | Typedef Name | Description | +| -------- | -------- | +| OH_Drawing_FontCollection | typedef struct OH_Drawing_FontCollection
OH_Drawing_FontCollection用于加载字体 | +| OH_Drawing_Typography | typedef struct OH_Drawing_Typography
OH_Drawing_Typography用于管理排版的布局和显示等 | +| OH_Drawing_TextStyle | typedef struct OH_Drawing_TextStyle
OH_Drawing_TextStyle用于管理字体颜色、装饰等 | +| OH_Drawing_TypographyStyle | typedef struct OH_Drawing_TypographyStyle
OH_Drawing_TypographyStyle用于管理排版风格,如文字方向等 | +| OH_Drawing_TypographyCreate | typedef struct OH_Drawing_TypographyCreate
OH_Drawing_TypographyCreate用于创建OH_Drawing_Typography. | +| OH_Drawing_Canvas | typedef struct OH_Drawing_Canvas
OH_Drawing_Canvas定义为一块矩形的画布,可以结合画笔和画刷在上面绘制各种形状、图片和文字 | +| OH_Drawing_Pen | typedef struct OH_Drawing_Pen
OH_Drawing_Pen定义为画笔,画笔用于描述绘制图形轮廓的样式和颜色 | +| OH_Drawing_Brush | typedef struct OH_Drawing_Brush
OH_Drawing_Brush定义为画刷,画刷用于描述填充图形的样式和颜色 | +| OH_Drawing_Path | typedef struct OH_Drawing_Path
OH_Drawing_Path定义为路径,路径用于自定义各种形状 | +| OH_Drawing_Bitmap | typedef struct OH_Drawing_Bitmap
OH_Drawing_Bitmap定义为位图,位图是一块内存,内存中包含了描述一张图片的像素数据 | + + +### Enumerations + + | Enumeration Name | Description | +| -------- | -------- | +| OH_Drawing_PenLineCapStyle { LINE_FLAT_CAP, LINE_SQUARE_CAP, LINE_ROUND_CAP } | 枚举集合定义了画笔笔帽的样式,即画笔在绘制线段时,在线段头尾端点的样式 | +| OH_Drawing_PenLineJoinStyle { LINE_MITER_JOIN, LINE_ROUND_JOIN, LINE_BEVEL_JOIN } | 枚举集合定义了线条转角的样式,即画笔在绘制折线段时,在折线转角处的样式 | +| OH_Drawing_TextDirection { TEXT_DIRECTION_RTL, TEXT_DIRECTION_LTR } | 文字方向 | +| OH_Drawing_TextAlign {   TEXT_ALIGN_LEFT, TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER, TEXT_ALIGN_JUSTIFY,   TEXT_ALIGN_START, TEXT_ALIGN_END } | 文字对齐方式 | +| OH_Drawing_FontWeight {   FONT_WEIGHT_100, FONT_WEIGHT_200, FONT_WEIGHT_300, FONT_WEIGHT_400,   FONT_WEIGHT_500, FONT_WEIGHT_600, FONT_WEIGHT_700, FONT_WEIGHT_800,   FONT_WEIGHT_900 } | 字重 | +| OH_Drawing_TextBaseline { TEXT_BASELINE_ALPHABETIC, TEXT_BASELINE_IDEOGRAPHIC } | 基线位置 | +| OH_Drawing_TextDecoration { TEXT_DECORATION_NONE = 0x0, TEXT_DECORATION_UNDERLINE = 0x1, TEXT_DECORATION_OVERLINE = 0x2, TEXT_DECORATION_LINE_THROUGH = 0x4 } | 文本装饰 | +| OH_Drawing_FontStyle { FONT_STYLE_NORMAL, FONT_STYLE_ITALIC } | 区分字体是否为斜体 | +| OH_Drawing_ColorFormat {   COLOR_FORMAT_UNKNOWN, COLOR_FORMAT_ALPHA_8, COLOR_FORMAT_RGB_565, COLOR_FORMAT_ARGB_4444,   COLOR_FORMAT_RGBA_8888, COLOR_FORMAT_BGRA_8888 } | OH_Drawing_ColorFormat用于描述位图像素的存储格式 | +| OH_Drawing_AlphaFormat { ALPHA_FORMAT_UNKNOWN, ALPHA_FORMAT_OPAQUE, ALPHA_FORMAT_PREMUL, ALPHA_FORMAT_UNPREMUL } | OH_Drawing_AlphaFormat用于描述位图像素的透明度分量 | + + +### Functions + + | Function | Description | +| -------- | -------- | +| OH_Drawing_BitmapCreate (void) | OH_Drawing_Bitmap \*
函数用于创建一个位图对象。 | +| OH_Drawing_BitmapDestroy (OH_Drawing_Bitmap \*) | void
函数用于销毁位图对象并回收该对象占有内存。 | +| OH_Drawing_BitmapBuild (OH_Drawing_Bitmap \*, const uint32_t width, const uint32_t height, const OH_Drawing_BitmapFormat \*) | void
函数用于初始化位图对象的宽度和高度,并且为该位图设置像素格式 | +| OH_Drawing_BitmapGetWidth (OH_Drawing_Bitmap \*) | uint32_t
该函数用于获取指定位图的宽度 | +| OH_Drawing_BitmapGetHeight (OH_Drawing_Bitmap \*) | uint32_t
函数用于获取指定位图的高度 | +| OH_Drawing_BitmapGetPixels (OH_Drawing_Bitmap \*) | void \*
函数用于获取指定位图的像素地址,可以通过像素地址获取到位图的像素数据 | +| OH_Drawing_BrushCreate (void) | OH_Drawing_Brush \*
函数用于创建一个画刷对象 | +| OH_Drawing_BrushDestroy (OH_Drawing_Brush \*) | void
函数用于销毁画刷对象并回收该对象占有的内存。 | +| OH_Drawing_BrushIsAntiAlias (const OH_Drawing_Brush \*) | bool
函数用于获取画刷是否设置抗锯齿属性,如果为真则说明画刷会启用抗锯齿功能,在绘制图形时会对图形的边缘像素进行半透明的模糊处理 | +| OH_Drawing_BrushSetAntiAlias (OH_Drawing_Brush \*, bool) | void
函数用于设置画刷的抗锯齿属性,设置为真则画刷在绘制图形时会对图形的边缘像素进行半透明的模糊处理 | +| OH_Drawing_BrushGetColor (const OH_Drawing_Brush \*) | uint32_t
函数用于获取画刷的颜色属性,颜色属性描述了画刷填充图形时使用的颜色,用一个32位(ARGB)的变量表示 | +| OH_Drawing_BrushSetColor (OH_Drawing_Brush \*, uint32_t color) | void
函数用于设置画刷的颜色属性,颜色属性描述了画刷填充图形时使用的颜色,用一个32位(ARGB)的变量表示 | +| OH_Drawing_CanvasCreate (void) | OH_Drawing_Canvas \*
函数用于创建一个画布对象 | +| OH_Drawing_CanvasDestroy (OH_Drawing_Canvas \*) | void
函数用于销毁画布对象并回收该对象占有的内存 | +| OH_Drawing_CanvasBind (OH_Drawing_Canvas \*, OH_Drawing_Bitmap \*) | void
函数用于将一个位图对象绑定到画布中,使得画布绘制的内容输出到位图中(即CPU渲染) | +| OH_Drawing_CanvasAttachPen (OH_Drawing_Canvas \*, const OH_Drawing_Pen \*) | void
函数用于设置画笔给画布,画布将会使用设置画笔的样式和颜色去绘制图形形状的轮廓 | +| OH_Drawing_CanvasDetachPen (OH_Drawing_Canvas \*) | void
函数用于去除掉画布中的画笔,使用后画布将不去绘制图形形状的轮廓 | +| OH_Drawing_CanvasAttachBrush (OH_Drawing_Canvas \*, const OH_Drawing_Brush \*) | void
函数用于设置画刷给画布,画布将会使用设置的画刷样式和颜色去填充绘制的图形形状 | +| OH_Drawing_CanvasDetachBrush (OH_Drawing_Canvas \*) | void
函数用于去除掉画布中的画刷,使用后画布将不去填充图形形状 | +| OH_Drawing_CanvasSave (OH_Drawing_Canvas \*) | void
函数用于保存当前画布的状态(画布矩阵)到一个栈顶 | +| OH_Drawing_CanvasRestore (OH_Drawing_Canvas \*) | void
函数用于恢复保存在栈顶的画布状态(画布矩阵) | +| OH_Drawing_CanvasDrawLine (OH_Drawing_Canvas \*, float x1, float y1, float x2, float y2) | void
函数用于画一条直线段 | +| OH_Drawing_CanvasDrawPath (OH_Drawing_Canvas \*, const OH_Drawing_Path \*) | void
函数用于画一个自定义路径 | +| OH_Drawing_CanvasClear (OH_Drawing_Canvas \*, uint32_t color) | void
函数用于使用指定颜色去清空画布 | +| OH_Drawing_ColorSetArgb (uint32_t alpha, uint32_t red, uint32_t green, uint32_t blue) | uint32_t
函数用于将4个变量(分别描述透明度、红色、绿色和蓝色)转化为一个描述颜色的32位(ARGB)变量 | +| OH_Drawing_CreateFontCollection (void) | OH_Drawing_FontCollection \*
创建OH_Drawing_FontCollection | +| OH_Drawing_DestroyFontCollection (OH_Drawing_FontCollection \*) | void
释放被OH_Drawing_FontCollection对象占据的内存 | +| OH_Drawing_PathCreate (void) | OH_Drawing_Path \*
函数用于创建一个路径对象 | +| OH_Drawing_PathDestroy (OH_Drawing_Path \*) | void
函数用于销毁路径对象并回收该对象占有的内存 | +| OH_Drawing_PathMoveTo (OH_Drawing_Path \*, float x, float y) | void
函数用于设置自定义路径的起始点位置 | +| OH_Drawing_PathLineTo (OH_Drawing_Path \*, float x, float y) | void
函数用于添加一条从路径的最后点位置到目标点位置的线段 | +| OH_Drawing_PathArcTo (OH_Drawing_Path \*, float x1, float y1, float x2, float y2, float startDeg, float sweepDeg) | void
函数用于给路径添加一段弧线,绘制弧线的方式为角度弧,该方式首先会指定一个矩形边框,矩形边框会包裹椭圆, 然后会指定一个起始角度和扫描度数,从起始角度扫描截取的椭圆周长一部分即为绘制的弧线。另外会默认添加一条从路径的最后点位置到弧线起始点位置的线段 | +| OH_Drawing_PathQuadTo (OH_Drawing_Path \*, float ctrlX, float ctrlY, float endX, float endY) | void
函数用于添加一条从路径最后点位置到目标点位置的二阶贝塞尔圆滑曲线 | +| OH_Drawing_PathCubicTo (OH_Drawing_Path \*, float ctrlX1, float ctrlY1, float ctrlX2, float ctrlY2, float endX, float endY) | void
函数用于添加一条从路径最后点位置到目标点位置的三阶贝塞尔圆滑曲线 | +| OH_Drawing_PathClose (OH_Drawing_Path \*) | void
函数用于闭合路径,会添加一条从路径起点位置到最后点位置的线段 | +| OH_Drawing_PathReset (OH_Drawing_Path \*) | void
函数用于重置自定义路径数据 | +| OH_Drawing_PenCreate (void) | OH_Drawing_Pen \*
函数用于创建一个画笔对象 | +| OH_Drawing_PenDestroy (OH_Drawing_Pen \*) | void
函数用于销毁画笔对象并回收该对象占有的内存 | +| OH_Drawing_PenIsAntiAlias (const OH_Drawing_Pen \*) | bool
函数用于获取画笔是否设置抗锯齿属性,如果为真则说明画笔会启用抗锯齿功能,在绘制图形时会对图形的边缘像素进行半透明的模糊处理 | +| OH_Drawing_PenSetAntiAlias (OH_Drawing_Pen \*, bool) | void
函数用于设置画笔的抗锯齿属性,设置为真则画笔在绘制图形时会对图形的边缘像素进行半透明的模糊处理 | +| OH_Drawing_PenGetColor (const OH_Drawing_Pen \*) | uint32_t
函数用于获取画笔的颜色属性,颜色属性描述了画笔绘制图形轮廓时使用的颜色,用一个32位(ARGB)的变量表示 | +| OH_Drawing_PenSetColor (OH_Drawing_Pen \*, uint32_t color) | void
函数用于设置画笔的颜色属性,颜色属性描述了画笔绘制图形轮廓时使用的颜色,用一个32位(ARGB)的变量表示 | +| OH_Drawing_PenGetWidth (const OH_Drawing_Pen \*) | float
函数用于获取画笔的厚度属性,厚度属性描述了画笔绘制图形轮廓的宽度 | +| OH_Drawing_PenSetWidth (OH_Drawing_Pen \*, float width) | void
函数用于设置画笔的厚度属性,厚度属性描述了画笔绘制图形轮廓的宽度 | +| OH_Drawing_PenGetMiterLimit (const OH_Drawing_Pen \*) | float
函数用于获取折线尖角的限制值,当画笔绘制一条折线,转角类型设置为尖角时,那么此时该属性用于限制出现尖角的长度范围,如果超出则平角显示,不超出依然为尖角 | +| OH_Drawing_PenSetMiterLimit (OH_Drawing_Pen \*, float miter) | void
函数用于设置折线尖角的限制值,当画笔绘制一条折线,转角类型设置为尖角时,那么此时该属性用于限制出现尖角的长度范围,如果超出则平角显示,不超出依然为尖角 | +| OH_Drawing_PenGetCap (const OH_Drawing_Pen \*) | OH_Drawing_PenLineCapStyle
函数用于获取画笔笔帽的样式 | +| OH_Drawing_PenSetCap (OH_Drawing_Pen \*, OH_Drawing_PenLineCapStyle) | void
函数用于设置画笔笔帽样式 | +| OH_Drawing_PenGetJoin (const OH_Drawing_Pen \*) | OH_Drawing_PenLineJoinStyle
函数用于获取画笔绘制折线转角的样式 | +| OH_Drawing_PenSetJoin (OH_Drawing_Pen \*, OH_Drawing_PenLineJoinStyle) | void
函数用于设置画笔绘制转角的样式 | +| OH_Drawing_CreateTypographyStyle (void) | OH_Drawing_TypographyStyle \*
创建OH_Drawing_TypographyStyle | +| OH_Drawing_DestroyTypographyStyle (OH_Drawing_TypographyStyle \*) | void
释放被OH_Drawing_TypographyStyle对象占据的内存 | +| OH_Drawing_SetTypographyTextDirection (OH_Drawing_TypographyStyle \*, int) | void
设置文本方向 | +| OH_Drawing_SetTypographyTextAlign (OH_Drawing_TypographyStyle \*, int) | void
设置文本对齐方式 | +| OH_Drawing_SetTypographyTextMaxLines (OH_Drawing_TypographyStyle \*, int) | void
设置文本最大行数 | +| OH_Drawing_CreateTextStyle (void) | OH_Drawing_TextStyle \*
创建OH_Drawing_TextStyle | +| OH_Drawing_DestroyTextStyle (OH_Drawing_TextStyle \*) | void
释放被OH_Drawing_TextStyle对象占据的内存 | +| OH_Drawing_SetTextStyleColor (OH_Drawing_TextStyle \*, uint32_t) | void
设置文本颜色 | +| OH_Drawing_SetTextStyleFontSize (OH_Drawing_TextStyle \*, double) | void
设置字号 | +| OH_Drawing_SetTextStyleFontWeight (OH_Drawing_TextStyle \*, int) | void
设置字重 | +| OH_Drawing_SetTextStyleBaseLine (OH_Drawing_TextStyle \*, int) | void
设置字体基线位置 | +| OH_Drawing_SetTextStyleDecoration (OH_Drawing_TextStyle \*, int) | void
设置装饰 | +| OH_Drawing_SetTextStyleDecorationColor (OH_Drawing_TextStyle \*, uint32_t) | void
设置装饰颜色 | +| OH_Drawing_SetTextStyleFontHeight (OH_Drawing_TextStyle \*, double) | void
设置字体高度 | +| OH_Drawing_SetTextStyleFontFamilies (OH_Drawing_TextStyle \*, int, const char \*fontFamilies[]) | void
设置字体类型 | +| OH_Drawing_SetTextStyleFontStyle (OH_Drawing_TextStyle \*, int) | void
设置字体风格 | +| OH_Drawing_SetTextStyleLocale (OH_Drawing_TextStyle \*, const char \*) | void
设置语言区域 | +| OH_Drawing_CreateTypographyHandler (OH_Drawing_TypographyStyle \*, OH_Drawing_FontCollection \*) | OH_Drawing_TypographyCreate \*
创建指向OH_Drawing_TypographyCreate对象的指针 | +| OH_Drawing_DestroyTypographyHandler (OH_Drawing_TypographyCreate \*) | void
释放被OH_Drawing_TypographyCreate对象占据的内存 | +| OH_Drawing_TypographyHandlerPushStyle (OH_Drawing_TypographyCreate \*, OH_Drawing_TextStyle \*) | void
设置排版风格 | +| OH_Drawing_TypographyHandlerAddText (OH_Drawing_TypographyCreate \*, const char \*) | void
设置文本内容 | +| OH_Drawing_TypographyHandlerPop (OH_Drawing_TypographyCreate \*) | void
排版弹出 | +| OH_Drawing_CreateTypography (OH_Drawing_TypographyCreate \*) | OH_Drawing_Typography \*
创建OH_Drawing_Typography | +| OH_Drawing_DestroyTypography (OH_Drawing_Typography \*) | void
释放OH_Drawing_Typography对象占据的内存 | +| OH_Drawing_TypographyLayout (OH_Drawing_Typography \*, double) | void
排版布局 | +| OH_Drawing_TypographyPaint (OH_Drawing_Typography \*, OH_Drawing_Canvas \*, double, double) | void
显示文本 | + + +## **Details** + + +## **Typedef** + + +### OH_Drawing_Bitmap + + +``` +typedef struct OH_Drawing_Bitmap OH_Drawing_Bitmap +``` + +**Description:** + +OH_Drawing_Bitmap定义为位图,位图是一块内存,内存中包含了描述一张图片的像素数据 + + +### OH_Drawing_Brush + + +``` +typedef struct OH_Drawing_Brush OH_Drawing_Brush +``` + +**Description:** + +OH_Drawing_Brush定义为画刷,画刷用于描述填充图形的样式和颜色 + + +### OH_Drawing_Canvas + + +``` +typedef struct OH_Drawing_Canvas OH_Drawing_Canvas +``` + +**Description:** + +OH_Drawing_Canvas定义为一块矩形的画布,可以结合画笔和画刷在上面绘制各种形状、图片和文字 + + +### OH_Drawing_FontCollection + + +``` +typedef struct OH_Drawing_FontCollection OH_Drawing_FontCollection +``` + +**Description:** + +OH_Drawing_FontCollection用于加载字体 + + +### OH_Drawing_Path + + +``` +typedef struct OH_Drawing_Path OH_Drawing_Path +``` + +**Description:** + +OH_Drawing_Path定义为路径,路径用于自定义各种形状 + + +### OH_Drawing_Pen + + +``` +typedef struct OH_Drawing_Pen OH_Drawing_Pen +``` + +**Description:** + +OH_Drawing_Pen定义为画笔,画笔用于描述绘制图形轮廓的样式和颜色 + + +### OH_Drawing_TextStyle + + +``` +typedef struct OH_Drawing_TextStyle OH_Drawing_TextStyle +``` + +**Description:** + +OH_Drawing_TextStyle用于管理字体颜色、装饰等 + + +### OH_Drawing_Typography + + +``` +typedef struct OH_Drawing_Typography OH_Drawing_Typography +``` + +**Description:** + +OH_Drawing_Typography用于管理排版的布局和显示等 + + +### OH_Drawing_TypographyCreate + + +``` +typedef struct OH_Drawing_TypographyCreate OH_Drawing_TypographyCreate +``` + +**Description:** + +OH_Drawing_TypographyCreate用于创建OH_Drawing_Typography. + + +### OH_Drawing_TypographyStyle + + +``` +typedef struct OH_Drawing_TypographyStyle OH_Drawing_TypographyStyle +``` + +**Description:** + +OH_Drawing_TypographyStyle用于管理排版风格,如文字方向等 + + +## **Enumeration Type** + + +### OH_Drawing_AlphaFormat + + +``` +enum OH_Drawing_AlphaFormat +``` + +**Description:** + +OH_Drawing_AlphaFormat用于描述位图像素的透明度分量 + + | Enumerator | Description | +| -------- | -------- | +| ALPHA_FORMAT_UNKNOWN | 未知格式 | +| ALPHA_FORMAT_OPAQUE | 位图无透明度 | +| ALPHA_FORMAT_PREMUL | 每个像素的颜色组件由透明度分量预先乘以 | +| ALPHA_FORMAT_UNPREMUL | 每个像素的颜色组件未由透明度分量预先乘以 | + + +### OH_Drawing_ColorFormat + + +``` +enum OH_Drawing_ColorFormat +``` + +**Description:** + +OH_Drawing_ColorFormat用于描述位图像素的存储格式 + + | Enumerator | Description | +| -------- | -------- | +| COLOR_FORMAT_UNKNOWN | 未知格式. | +| COLOR_FORMAT_ALPHA_8 | 每个像素用一个8位的量表示,8个位比特位表示透明度 | +| COLOR_FORMAT_RGB_565 | 每个像素用一个16位的量表示,高位到低位依次是5个比特位表示红,6个比特位表示绿,5个比特位表示蓝 | +| COLOR_FORMAT_ARGB_4444 | 每个像素用一个16位的量表示,高位到低位依次是4个比特位表示透明度,4个比特位表示红,4个比特位表示绿,4个比特位表示蓝 | +| COLOR_FORMAT_RGBA_8888 | 每个像素用一个32位的量表示,高位到低位依次是8个比特位表示透明度,8个比特位表示红,8个比特位表示绿,8个比特位表示蓝 | +| COLOR_FORMAT_BGRA_8888 | 每个像素用一个32位的量表示,高位到低位依次是8个比特位表示蓝,8个比特位表示绿,8个比特位表示红,8个比特位表示透明度 | + + +### OH_Drawing_FontStyle + + +``` +enum OH_Drawing_FontStyle +``` + +**Description:** + +区分字体是否为斜体 + + | Enumerator | Description | +| -------- | -------- | +| FONT_STYLE_NORMAL | 非斜体 | +| FONT_STYLE_ITALIC | 斜体 | + + +### OH_Drawing_FontWeight + + +``` +enum OH_Drawing_FontWeight +``` + +**Description:** + +字重 + + | Enumerator | Description | +| -------- | -------- | +| FONT_WEIGHT_100 | 字重为thin | +| FONT_WEIGHT_200 | 字重为extra-light | +| FONT_WEIGHT_300 | 字重为light | +| FONT_WEIGHT_400 | 字重为normal/regular | +| FONT_WEIGHT_500 | 字重为medium | +| FONT_WEIGHT_600 | 字重为semi-bold | +| FONT_WEIGHT_700 | 字重为bold | +| FONT_WEIGHT_800 | 字重为extra-bold | +| FONT_WEIGHT_900 | 字重为black | + + +### OH_Drawing_PenLineCapStyle + + +``` +enum OH_Drawing_PenLineCapStyle +``` + +**Description:** + +枚举集合定义了画笔笔帽的样式,即画笔在绘制线段时,在线段头尾端点的样式 + + | Enumerator | Description | +| -------- | -------- | +| LINE_FLAT_CAP | 没有笔帽样式,线条头尾端点处横切 | +| LINE_SQUARE_CAP | 笔帽的样式为方框,线条的头尾端点处多出一个方框,方框宽度和线段一样宽,高度时线段厚度的一半 | +| LINE_ROUND_CAP | 笔帽的样式为圆弧,线条的头尾端点处多出一个半圆弧,半圆的直径与线段厚度一致 | + + +### OH_Drawing_PenLineJoinStyle + + +``` +enum OH_Drawing_PenLineJoinStyle +``` + +**Description:** + +枚举集合定义了线条转角的样式,即画笔在绘制折线段时,在折线转角处的样式 + + | Enumerator | Description | +| -------- | -------- | +| LINE_MITER_JOIN | 转角类型为尖角,如果折线角度比较小,则尖角会很长,需要使用限制值(miter limit)进行限制 | +| LINE_ROUND_JOIN | 转角类型为圆头 | +| LINE_BEVEL_JOIN | 转角类型为平头 | + + +### OH_Drawing_TextAlign + + +``` +enum OH_Drawing_TextAlign +``` + +**Description:** + +文字对齐方式 + + | Enumerator | Description | +| -------- | -------- | +| TEXT_ALIGN_LEFT | 左对齐 | +| TEXT_ALIGN_RIGHT | 右对齐 | +| TEXT_ALIGN_CENTER | 居中对齐 | +| TEXT_ALIGN_JUSTIFY | 两端对齐,即紧靠左和右边缘,中间单词空隙由空格填充 最后一行除外 | +| TEXT_ALIGN_START | 当OH_Drawing_TextDirection是TEXT_DIRECTION_LTR时, TEXT_ALIGN_START和TEXT_ALIGN_LEFT相同; 类似地,当OH_Drawing_TextDirection是TEXT_DIRECTION_RTL时, TEXT_ALIGN_START和TEXT_ALIGN_RIGHT相同。 | +| TEXT_ALIGN_END | 当OH_Drawing_TextDirection是TEXT_DIRECTION_LTR时, TEXT_ALIGN_END和TEXT_ALIGN_RIGHT相同; 类似地,当OH_Drawing_TextDirection是TEXT_DIRECTION_RTL时, TEXT_ALIGN_END和TEXT_ALIGN_LEFT相同。 | + + +### OH_Drawing_TextBaseline + + +``` +enum OH_Drawing_TextBaseline +``` + +**Description:** + +基线位置 + + | Enumerator | Description | +| -------- | -------- | +| TEXT_BASELINE_ALPHABETIC | 用于表音文字,基线在中间偏下的位置 | +| TEXT_BASELINE_IDEOGRAPHIC | 用于表意文字,基线位于底部 | + + +### OH_Drawing_TextDecoration + + +``` +enum OH_Drawing_TextDecoration +``` + +**Description:** + +文本装饰 + + | Enumerator | Description | +| -------- | -------- | +| TEXT_DECORATION_NONE | 无装饰 | +| TEXT_DECORATION_UNDERLINE | 下划线 | +| TEXT_DECORATION_OVERLINE | 上划线 | +| TEXT_DECORATION_LINE_THROUGH | 删除线 | + + +### OH_Drawing_TextDirection + + +``` +enum OH_Drawing_TextDirection +``` + +**Description:** + +文字方向 + + | Enumerator | Description | +| -------- | -------- | +| TEXT_DIRECTION_RTL | 方向:从右到左 | +| TEXT_DIRECTION_LTR | 方向:从左到右 | + + +## **Function** + + +### OH_Drawing_BitmapBuild() + + +``` +void OH_Drawing_BitmapBuild (OH_Drawing_Bitmap * , const uint32_t width, const uint32_t height, const OH_Drawing_BitmapFormat * ) +``` + +**Description:** + +函数用于初始化位图对象的宽度和高度,并且为该位图设置像素格式 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Bitmap | 参数是一个指向位图对象的指针 | +| width | 参数是位图要初始化设置的宽度 | +| height | 参数是位图要初始化设置的高度 | +| [OH_Drawing_BitmapFormat](_o_h___drawing___bitmap_format.md) | 参数是位图要初始化设置的像素格式,包括像素的颜色类型和透明度类型 | + + +### OH_Drawing_BitmapCreate() + + +``` +OH_Drawing_Bitmap* OH_Drawing_BitmapCreate (void ) +``` + +**Description:** + +函数用于创建一个位图对象。 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Returns:** + +函数会返回一个指针,指针指向创建的位图对象 + + +### OH_Drawing_BitmapDestroy() + + +``` +void OH_Drawing_BitmapDestroy (OH_Drawing_Bitmap * ) +``` + +**Description:** + +函数用于销毁位图对象并回收该对象占有内存。 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Bitmap | 参数是一个指向位图对象的指针 | + + +### OH_Drawing_BitmapGetHeight() + + +``` +uint32_t OH_Drawing_BitmapGetHeight (OH_Drawing_Bitmap * ) +``` + +**Description:** + +函数用于获取指定位图的高度 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Bitmap | 参数是一个指向位图对象的指针 | + +**Returns:** + +函数返回位图的高度 + + +### OH_Drawing_BitmapGetPixels() + + +``` +void* OH_Drawing_BitmapGetPixels (OH_Drawing_Bitmap * ) +``` + +**Description:** + +函数用于获取指定位图的像素地址,可以通过像素地址获取到位图的像素数据 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Bitmap | 参数是一个指向位图对象的指针 | + +**Returns:** + +函数返回位图的像素地址 + + +### OH_Drawing_BitmapGetWidth() + + +``` +uint32_t OH_Drawing_BitmapGetWidth (OH_Drawing_Bitmap * ) +``` + +**Description:** + +该函数用于获取指定位图的宽度 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Bitmap | 参数是一个指向位图对象的指针 | + +**Returns:** + +函数返回位图的宽度 + + +### OH_Drawing_BrushCreate() + + +``` +OH_Drawing_Brush* OH_Drawing_BrushCreate (void ) +``` + +**Description:** + +函数用于创建一个画刷对象 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Returns:** + +函数会返回一个指针,指针指向创建的画刷对象 + + +### OH_Drawing_BrushDestroy() + + +``` +void OH_Drawing_BrushDestroy (OH_Drawing_Brush * ) +``` + +**Description:** + +函数用于销毁画刷对象并回收该对象占有的内存。 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Brush | 参数是一个指向画刷对象的指针 | + + +### OH_Drawing_BrushGetColor() + + +``` +uint32_t OH_Drawing_BrushGetColor (const OH_Drawing_Brush * ) +``` + +**Description:** + +函数用于获取画刷的颜色属性,颜色属性描述了画刷填充图形时使用的颜色,用一个32位(ARGB)的变量表示 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Brush | 参数是一个指向画刷对象的指针 | + +**Returns:** + +函数返回一个描述颜色的32位(ARGB)变量 + + +### OH_Drawing_BrushIsAntiAlias() + + +``` +bool OH_Drawing_BrushIsAntiAlias (const OH_Drawing_Brush * ) +``` + +**Description:** + +函数用于获取画刷是否设置抗锯齿属性,如果为真则说明画刷会启用抗锯齿功能,在绘制图形时会对图形的边缘像素进行半透明的模糊处理 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Brush | 参数是一个指向画刷对象的指针 | + +**Returns:** + +函数返回画刷对象是否设置抗锯齿属性,返回真则设置了抗锯齿,返回假则没有设置抗锯齿 + + +### OH_Drawing_BrushSetAntiAlias() + + +``` +void OH_Drawing_BrushSetAntiAlias (OH_Drawing_Brush * , bool ) +``` + +**Description:** + +函数用于设置画刷的抗锯齿属性,设置为真则画刷在绘制图形时会对图形的边缘像素进行半透明的模糊处理 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Brush | 参数是一个指向画刷对象的指针 | +| bool | 参数真为抗锯齿,参数假则不做抗锯齿处理 | + + +### OH_Drawing_BrushSetColor() + + +``` +void OH_Drawing_BrushSetColor (OH_Drawing_Brush * , uint32_t color ) +``` + +**Description:** + +函数用于设置画刷的颜色属性,颜色属性描述了画刷填充图形时使用的颜色,用一个32位(ARGB)的变量表示 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Brush | 参数是一个指向画刷对象的指针 | +| color | 参数是一个描述颜色的32位(ARGB)变量 | + + +### OH_Drawing_CanvasAttachBrush() + + +``` +void OH_Drawing_CanvasAttachBrush (OH_Drawing_Canvas * , const OH_Drawing_Brush * ) +``` + +**Description:** + +函数用于设置画刷给画布,画布将会使用设置的画刷样式和颜色去填充绘制的图形形状 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Canvas | 参数为一个指向画布对象的指针 | +| OH_Drawing_Brush | 参数为一个指向画刷对象的指针 | + + +### OH_Drawing_CanvasAttachPen() + + +``` +void OH_Drawing_CanvasAttachPen (OH_Drawing_Canvas * , const OH_Drawing_Pen * ) +``` + +**Description:** + +函数用于设置画笔给画布,画布将会使用设置画笔的样式和颜色去绘制图形形状的轮廓 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Canvas | 参数为一个指向画布对象的指针 | +| OH_Drawing_Pen | 参数为一个指向画笔对象的指针 | + + +### OH_Drawing_CanvasBind() + + +``` +void OH_Drawing_CanvasBind (OH_Drawing_Canvas * , OH_Drawing_Bitmap * ) +``` + +**Description:** + +函数用于将一个位图对象绑定到画布中,使得画布绘制的内容输出到位图中(即CPU渲染) + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Canvas | 参数为一个指向画布对象的指针 | +| OH_Drawing_Bitmap | 参数为一个指向位图对象的指针 | + + +### OH_Drawing_CanvasClear() + + +``` +void OH_Drawing_CanvasClear (OH_Drawing_Canvas * , uint32_t color ) +``` + +**Description:** + +函数用于使用指定颜色去清空画布 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Canvas | 参数为一个指向画布对象的指针 | +| color | 参数为一个描述颜色的32位(ARGB)变量 | + + +### OH_Drawing_CanvasCreate() + + +``` +OH_Drawing_Canvas* OH_Drawing_CanvasCreate (void ) +``` + +**Description:** + +函数用于创建一个画布对象 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Returns:** + +函数会返回一个指针,指针指向创建的画布对象 + + +### OH_Drawing_CanvasDestroy() + + +``` +void OH_Drawing_CanvasDestroy (OH_Drawing_Canvas * ) +``` + +**Description:** + +函数用于销毁画布对象并回收该对象占有的内存 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Canvas | 参数是一个指向画布对象的指针 | + + +### OH_Drawing_CanvasDetachBrush() + + +``` +void OH_Drawing_CanvasDetachBrush (OH_Drawing_Canvas * ) +``` + +**Description:** + +函数用于去除掉画布中的画刷,使用后画布将不去填充图形形状 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Canvas | 参数为一个指向画布对象的指针 | + + +### OH_Drawing_CanvasDetachPen() + + +``` +void OH_Drawing_CanvasDetachPen (OH_Drawing_Canvas * ) +``` + +**Description:** + +函数用于去除掉画布中的画笔,使用后画布将不去绘制图形形状的轮廓 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Canvas | 参数为一个指向画布对象的指针 | + + +### OH_Drawing_CanvasDrawLine() + + +``` +void OH_Drawing_CanvasDrawLine (OH_Drawing_Canvas * , float x1, float y1, float x2, float y2 ) +``` + +**Description:** + +函数用于画一条直线段 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Canvas | 参数为一个指向画布对象的指针 | +| x1 | 参数为线段起始点的横坐标 | +| y1 | 参数为线段起始点的纵坐标 | +| x2 | 参数为线段结束点的横坐标 | +| y2 | 参数为线段结束点的纵坐标 | + + +### OH_Drawing_CanvasDrawPath() + + +``` +void OH_Drawing_CanvasDrawPath (OH_Drawing_Canvas * , const OH_Drawing_Path * ) +``` + +**Description:** + +函数用于画一个自定义路径 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Canvas | 参数为一个指向画布对象的指针 | +| OH_Drawing_Path | 参数为一个指向路径对象的指针 | + + +### OH_Drawing_CanvasRestore() + + +``` +void OH_Drawing_CanvasRestore (OH_Drawing_Canvas * ) +``` + +**Description:** + +函数用于恢复保存在栈顶的画布状态(画布矩阵) + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Canvas | 参数为一个指向画布对象的指针 | + + +### OH_Drawing_CanvasSave() + + +``` +void OH_Drawing_CanvasSave (OH_Drawing_Canvas * ) +``` + +**Description:** + +函数用于保存当前画布的状态(画布矩阵)到一个栈顶 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Canvas | 参数为一个指向画布对象的指针 | + + +### OH_Drawing_ColorSetArgb() + + +``` +uint32_t OH_Drawing_ColorSetArgb (uint32_t alpha, uint32_t red, uint32_t green, uint32_t blue ) +``` + +**Description:** + +函数用于将4个变量(分别描述透明度、红色、绿色和蓝色)转化为一个描述颜色的32位(ARGB)变量 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| alpha | 参数为一个描述透明度的变量, 变量范围是0x00~0xFF | +| red | 参数为一个描述红色的变量, 变量范围是0x00~0xFF | +| green | 参数为一个描述绿色的变量, 变量范围是0x00~0xFF | +| blue | 参数为一个描述蓝色的变量, 变量范围是0x00~0xFF | + +**Returns:** + +函数返回一个描述颜色的32位(ARGB)变量 + + +### OH_Drawing_CreateFontCollection() + + +``` +OH_Drawing_FontCollection* OH_Drawing_CreateFontCollection (void ) +``` + +**Description:** + +创建OH_Drawing_FontCollection + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Returns:** + +指向创建的OH_Drawing_FontCollection对象的指针 + + +### OH_Drawing_CreateTextStyle() + + +``` +OH_Drawing_TextStyle* OH_Drawing_CreateTextStyle (void ) +``` + +**Description:** + +创建OH_Drawing_TextStyle + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Returns:** + +指向创建的OH_Drawing_TextStyle对象的指针 + + +### OH_Drawing_CreateTypography() + + +``` +OH_Drawing_Typography* OH_Drawing_CreateTypography (OH_Drawing_TypographyCreate * ) +``` + +**Description:** + +创建OH_Drawing_Typography + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TypographyCreate | 指向OH_Drawing_TypographyCreate对象的指针 | + +**Returns:** + +指向OH_Drawing_Typography对象的指针 + + +### OH_Drawing_CreateTypographyHandler() + + +``` +OH_Drawing_TypographyCreate* OH_Drawing_CreateTypographyHandler (OH_Drawing_TypographyStyle * , OH_Drawing_FontCollection * ) +``` + +**Description:** + +创建指向OH_Drawing_TypographyCreate对象的指针 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TypographyStyle | 指向OH_Drawing_TypographyStyle的指针 | +| OH_Drawing_FontCollection | 指向OH_Drawing_FontCollection的指针 | + +**Returns:** + +指向新创建的OH_Drawing_TypographyCreate对象的指针 + + +### OH_Drawing_CreateTypographyStyle() + + +``` +OH_Drawing_TypographyStyle* OH_Drawing_CreateTypographyStyle (void ) +``` + +**Description:** + +创建OH_Drawing_TypographyStyle + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Returns:** + +指向创建的OH_Drawing_TypographyStyle对象的指针 + + +### OH_Drawing_DestroyFontCollection() + + +``` +void OH_Drawing_DestroyFontCollection (OH_Drawing_FontCollection * ) +``` + +**Description:** + +释放被OH_Drawing_FontCollection对象占据的内存 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_FontCollection | 指向OH_Drawing_FontCollection对象的指针 | + + +### OH_Drawing_DestroyTextStyle() + + +``` +void OH_Drawing_DestroyTextStyle (OH_Drawing_TextStyle * ) +``` + +**Description:** + +释放被OH_Drawing_TextStyle对象占据的内存 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TextStyle | 指向OH_Drawing_TextStyle对象的指针 | + + +### OH_Drawing_DestroyTypography() + + +``` +void OH_Drawing_DestroyTypography (OH_Drawing_Typography * ) +``` + +**Description:** + +释放OH_Drawing_Typography对象占据的内存 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Typography | 指向OH_Drawing_Typography对象的指针 | + + +### OH_Drawing_DestroyTypographyHandler() + + +``` +void OH_Drawing_DestroyTypographyHandler (OH_Drawing_TypographyCreate * ) +``` + +**Description:** + +释放被OH_Drawing_TypographyCreate对象占据的内存 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TypographyCreate | 指向OH_Drawing_TypographyCreate对象的指针 | + + +### OH_Drawing_DestroyTypographyStyle() + + +``` +void OH_Drawing_DestroyTypographyStyle (OH_Drawing_TypographyStyle * ) +``` + +**Description:** + +释放被OH_Drawing_TypographyStyle对象占据的内存 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TypographyStyle | 指向OH_Drawing_TypographyStyle对象的指针 | + + +### OH_Drawing_PathArcTo() + + +``` +void OH_Drawing_PathArcTo (OH_Drawing_Path * , float x1, float y1, float x2, float y2, float startDeg, float sweepDeg ) +``` + +**Description:** + +函数用于给路径添加一段弧线,绘制弧线的方式为角度弧,该方式首先会指定一个矩形边框,矩形边框会包裹椭圆, 然后会指定一个起始角度和扫描度数,从起始角度扫描截取的椭圆周长一部分即为绘制的弧线。另外会默认添加一条从路径的最后点位置到弧线起始点位置的线段 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Path | 参数为一个指向路径对象的指针 | +| x1 | 参数为包围椭圆的矩形左上角点位置的横坐标 | +| y1 | 参数为包围椭圆的矩形左上角点位置的纵坐标 | +| x2 | 参数为包围椭圆的矩形右下角点位置的横坐标 | +| y3 | 参数为包围椭圆的矩形右下角点位置的纵坐标 | + + +### OH_Drawing_PathClose() + + +``` +void OH_Drawing_PathClose (OH_Drawing_Path * ) +``` + +**Description:** + +函数用于闭合路径,会添加一条从路径起点位置到最后点位置的线段 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Path | 参数为一个指向路径对象的指针 | + + +### OH_Drawing_PathCreate() + + +``` +OH_Drawing_Path* OH_Drawing_PathCreate (void ) +``` + +**Description:** + +函数用于创建一个路径对象 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Returns:** + +函数会返回一个指针,指针指向创建的路径对象 + + +### OH_Drawing_PathCubicTo() + + +``` +void OH_Drawing_PathCubicTo (OH_Drawing_Path * , float ctrlX1, float ctrlY1, float ctrlX2, float ctrlY2, float endX, float endY ) +``` + +**Description:** + +函数用于添加一条从路径最后点位置到目标点位置的三阶贝塞尔圆滑曲线 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Path | 参数为一个指向路径对象的指针 | +| ctrlX1 | 参数为第一个控制点位置的横坐标 | +| ctrlY1 | 参数为第一个控制点位置的纵坐标 | +| ctrlX2 | 参数为第二个控制点位置的横坐标 | +| ctrlY2 | 参数为第二个控制点位置的纵坐标 | +| endX | 参数为目标点位置的横坐标 | +| endY | 参数为目标点位置的纵坐标 | + + +### OH_Drawing_PathDestroy() + + +``` +void OH_Drawing_PathDestroy (OH_Drawing_Path * ) +``` + +**Description:** + +函数用于销毁路径对象并回收该对象占有的内存 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Path | 参数为一个指向路径对象的指针 | + + +### OH_Drawing_PathLineTo() + + +``` +void OH_Drawing_PathLineTo (OH_Drawing_Path * , float x, float y ) +``` + +**Description:** + +函数用于添加一条从路径的最后点位置到目标点位置的线段 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Path | 参数为一个指向路径对象的指针 | +| x | 参数为目标点的横坐标 | +| y | 参数为目标点的纵坐标 | + + +### OH_Drawing_PathMoveTo() + + +``` +void OH_Drawing_PathMoveTo (OH_Drawing_Path * , float x, float y ) +``` + +**Description:** + +函数用于设置自定义路径的起始点位置 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Path | 参数为一个指向路径对象的指针 | +| x | 参数为起始点的横坐标 | +| y | 参数为起始点的纵坐标 | + + +### OH_Drawing_PathQuadTo() + + +``` +void OH_Drawing_PathQuadTo (OH_Drawing_Path * , float ctrlX, float ctrlY, float endX, float endY ) +``` + +**Description:** + +函数用于添加一条从路径最后点位置到目标点位置的二阶贝塞尔圆滑曲线 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Path | 参数为一个指向路径对象的指针 | +| ctrlX | 参数为控制点位置的横坐标 | +| ctrlY | 参数为控制点位置的纵坐标 | +| endX | 参数为目标点位置的横坐标 | +| endY | 参数为目标点位置的纵坐标 | + + +### OH_Drawing_PathReset() + + +``` +void OH_Drawing_PathReset (OH_Drawing_Path * ) +``` + +**Description:** + +函数用于重置自定义路径数据 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Path | 参数为一个指向路径对象的指针 | + + +### OH_Drawing_PenCreate() + + +``` +OH_Drawing_Pen* OH_Drawing_PenCreate (void ) +``` + +**Description:** + +函数用于创建一个画笔对象 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Returns:** + +函数会返回一个指针,指针指向创建的画笔对象 + + +### OH_Drawing_PenDestroy() + + +``` +void OH_Drawing_PenDestroy (OH_Drawing_Pen * ) +``` + +**Description:** + +函数用于销毁画笔对象并回收该对象占有的内存 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Pen | 参数是一个指向画笔对象的指针 | + + +### OH_Drawing_PenGetCap() + + +``` +OH_Drawing_PenLineCapStyle OH_Drawing_PenGetCap (const OH_Drawing_Pen * ) +``` + +**Description:** + +函数用于获取画笔笔帽的样式 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Pen | 参数是一个指向画笔对象的指针 | + +**Returns:** + +函数返回画笔笔帽样式 + + +### OH_Drawing_PenGetColor() + + +``` +uint32_t OH_Drawing_PenGetColor (const OH_Drawing_Pen * ) +``` + +**Description:** + +函数用于获取画笔的颜色属性,颜色属性描述了画笔绘制图形轮廓时使用的颜色,用一个32位(ARGB)的变量表示 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Pen | 参数是一个指向画笔对象的指针 | + +**Returns:** + +函数返回一个描述颜色的32位(ARGB)变量 + + +### OH_Drawing_PenGetJoin() + + +``` +OH_Drawing_PenLineJoinStyle OH_Drawing_PenGetJoin (const OH_Drawing_Pen * ) +``` + +**Description:** + +函数用于获取画笔绘制折线转角的样式 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Pen | 参数是一个指向画笔对象的指针 | + +**Returns:** + +函数返回折线转角的样式 + + +### OH_Drawing_PenGetMiterLimit() + + +``` +float OH_Drawing_PenGetMiterLimit (const OH_Drawing_Pen * ) +``` + +**Description:** + +函数用于获取折线尖角的限制值,当画笔绘制一条折线,转角类型设置为尖角时,那么此时该属性用于限制出现尖角的长度范围,如果超出则平角显示,不超出依然为尖角 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Pen | 参数是一个指向画笔对象的指针 | + +**Returns:** + +函数返回尖角的限制值 + + +### OH_Drawing_PenGetWidth() + + +``` +float OH_Drawing_PenGetWidth (const OH_Drawing_Pen * ) +``` + +**Description:** + +函数用于获取画笔的厚度属性,厚度属性描述了画笔绘制图形轮廓的宽度 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Pen | 参数是一个指向画笔对象的指针 | + +**Returns:** + +函数返回画笔的厚度 + + +### OH_Drawing_PenIsAntiAlias() + + +``` +bool OH_Drawing_PenIsAntiAlias (const OH_Drawing_Pen * ) +``` + +**Description:** + +函数用于获取画笔是否设置抗锯齿属性,如果为真则说明画笔会启用抗锯齿功能,在绘制图形时会对图形的边缘像素进行半透明的模糊处理 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Pen | 参数是一个指向画笔对象的指针 | + +**Returns:** + +函数返回画笔对象是否设置抗锯齿属性,返回真则设置了抗锯齿,返回假则没有设置抗锯齿 + + +### OH_Drawing_PenSetAntiAlias() + + +``` +void OH_Drawing_PenSetAntiAlias (OH_Drawing_Pen * , bool ) +``` + +**Description:** + +函数用于设置画笔的抗锯齿属性,设置为真则画笔在绘制图形时会对图形的边缘像素进行半透明的模糊处理 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Pen | 参数是一个指向画笔对象的指针 | +| bool | 参数真为抗锯齿,参数假则不做抗锯齿处理 | + + +### OH_Drawing_PenSetCap() + + +``` +void OH_Drawing_PenSetCap (OH_Drawing_Pen * , OH_Drawing_PenLineCapStyle ) +``` + +**Description:** + +函数用于设置画笔笔帽样式 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Pen | 参数是一个指向画笔对象的指针 | +| OH_Drawing_PenLineCapStyle | 参数是一个描述画笔笔帽样式的变量 | + + +### OH_Drawing_PenSetColor() + + +``` +void OH_Drawing_PenSetColor (OH_Drawing_Pen * , uint32_t color ) +``` + +**Description:** + +函数用于设置画笔的颜色属性,颜色属性描述了画笔绘制图形轮廓时使用的颜色,用一个32位(ARGB)的变量表示 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Pen | 参数是一个指向画笔对象的指针 | +| color | 参数是一个描述颜色的32位(ARGB)变量 | + + +### OH_Drawing_PenSetJoin() + + +``` +void OH_Drawing_PenSetJoin (OH_Drawing_Pen * , OH_Drawing_PenLineJoinStyle ) +``` + +**Description:** + +函数用于设置画笔绘制转角的样式 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Pen | 参数是一个指向画笔对象的指针 | +| OH_Drawing_PenLineJoinStyle | 参数值一个描述折线转角样式的变量 | + + +### OH_Drawing_PenSetMiterLimit() + + +``` +void OH_Drawing_PenSetMiterLimit (OH_Drawing_Pen * , float miter ) +``` + +**Description:** + +函数用于设置折线尖角的限制值,当画笔绘制一条折线,转角类型设置为尖角时,那么此时该属性用于限制出现尖角的长度范围,如果超出则平角显示,不超出依然为尖角 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Pen | 参数是一个指向画笔对象的指针 | +| miter | 参数是一个描述尖角限制值的变量 | + + +### OH_Drawing_PenSetWidth() + + +``` +void OH_Drawing_PenSetWidth (OH_Drawing_Pen * , float width ) +``` + +**Description:** + +函数用于设置画笔的厚度属性,厚度属性描述了画笔绘制图形轮廓的宽度 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Pen | 参数是一个指向画笔对象的指针 | +| width | 参数是一个描述画笔厚度的变量 | + + +### OH_Drawing_SetTextStyleBaseLine() + + +``` +void OH_Drawing_SetTextStyleBaseLine (OH_Drawing_TextStyle * , int ) +``` + +**Description:** + +设置字体基线位置 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TextStyle | 指向OH_Drawing_TextStyle对象的指针 | +| int | OH_Drawing_TextBaseline枚举类型 | + + +### OH_Drawing_SetTextStyleColor() + + +``` +void OH_Drawing_SetTextStyleColor (OH_Drawing_TextStyle * , uint32_t ) +``` + +**Description:** + +设置文本颜色 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TextStyle | 指向OH_Drawing_TextStyle对象的指针 | +| uint32_t | 颜色 | + + +### OH_Drawing_SetTextStyleDecoration() + + +``` +void OH_Drawing_SetTextStyleDecoration (OH_Drawing_TextStyle * , int ) +``` + +**Description:** + +设置装饰 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TextStyle | 指向OH_Drawing_TextStyle对象的指针 | +| int | OH_Drawing_TextDecoration枚举类型 | + + +### OH_Drawing_SetTextStyleDecorationColor() + + +``` +void OH_Drawing_SetTextStyleDecorationColor (OH_Drawing_TextStyle * , uint32_t ) +``` + +**Description:** + +设置装饰颜色 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TextStyle | 指向OH_Drawing_TextStyle对象的指针 | +| uint32_t | 颜色 | + + +### OH_Drawing_SetTextStyleFontFamilies() + + +``` +void OH_Drawing_SetTextStyleFontFamilies (OH_Drawing_TextStyle * , int , const char * fontFamilies[] ) +``` + +**Description:** + +设置字体类型 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TextStyle | 指向OH_Drawing_TextStyle对象的指针 | +| int | 字体名称数量 | +| char | 指向字体类型的指针 | + + +### OH_Drawing_SetTextStyleFontHeight() + + +``` +void OH_Drawing_SetTextStyleFontHeight (OH_Drawing_TextStyle * , double ) +``` + +**Description:** + +设置字体高度 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TextStyle | 指向OH_Drawing_TextStyle对象的指针 | +| double | 字体高度 | + + +### OH_Drawing_SetTextStyleFontSize() + + +``` +void OH_Drawing_SetTextStyleFontSize (OH_Drawing_TextStyle * , double ) +``` + +**Description:** + +设置字号 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TextStyle | 指向OH_Drawing_TextStyle对象的指针 | +| double | 字号 | + + +### OH_Drawing_SetTextStyleFontStyle() + + +``` +void OH_Drawing_SetTextStyleFontStyle (OH_Drawing_TextStyle * , int ) +``` + +**Description:** + +设置字体风格 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TextStyle | 指向OH_Drawing_TextStyle对象的指针 | +| int | OH_Drawing_FontStyle枚举类型 | + + +### OH_Drawing_SetTextStyleFontWeight() + + +``` +void OH_Drawing_SetTextStyleFontWeight (OH_Drawing_TextStyle * , int ) +``` + +**Description:** + +设置字重 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TextStyle | 指向OH_Drawing_TextStyle对象的指针 | +| int | OH_Drawing_FontWeight枚举类型 | + + +### OH_Drawing_SetTextStyleLocale() + + +``` +void OH_Drawing_SetTextStyleLocale (OH_Drawing_TextStyle * , const char * ) +``` + +**Description:** + +设置语言区域 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TextStyle | 指向OH_Drawing_TextStyle对象的指针 | +| char | 语言区域,数据类型为指向char的指针 | + + +### OH_Drawing_SetTypographyTextAlign() + + +``` +void OH_Drawing_SetTypographyTextAlign (OH_Drawing_TypographyStyle * , int ) +``` + +**Description:** + +设置文本对齐方式 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TypographyStyle | 指向OH_Drawing_TypographyStyle对象的指针 | +| int | OH_Drawing_TextAlign枚举类型 | + + +### OH_Drawing_SetTypographyTextDirection() + + +``` +void OH_Drawing_SetTypographyTextDirection (OH_Drawing_TypographyStyle * , int ) +``` + +**Description:** + +设置文本方向 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TypographyStyle | 指向OH_Drawing_TypographyStyle对象的指针 | +| int | OH_Drawing_TextDirection枚举类型 | + + +### OH_Drawing_SetTypographyTextMaxLines() + + +``` +void OH_Drawing_SetTypographyTextMaxLines (OH_Drawing_TypographyStyle * , int ) +``` + +**Description:** + +设置文本最大行数 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TypographyStyle | 指向OH_Drawing_TypographyStyle对象的指针 | +| int | 最大行数 | + + +### OH_Drawing_TypographyHandlerAddText() + + +``` +void OH_Drawing_TypographyHandlerAddText (OH_Drawing_TypographyCreate * , const char * ) +``` + +**Description:** + +设置文本内容 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TypographyCreate | 指向OH_Drawing_TypographyCreate对象的指针 | +| char | 指向文本内容的指针 | + + +### OH_Drawing_TypographyHandlerPop() + + +``` +void OH_Drawing_TypographyHandlerPop (OH_Drawing_TypographyCreate * ) +``` + +**Description:** + +排版弹出 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TypographyCreate | 指向OH_Drawing_TypographyCreate对象的指针 | + + +### OH_Drawing_TypographyHandlerPushStyle() + + +``` +void OH_Drawing_TypographyHandlerPushStyle (OH_Drawing_TypographyCreate * , OH_Drawing_TextStyle * ) +``` + +**Description:** + +设置排版风格 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_TypographyCreate | 指向OH_Drawing_TypographyCreate对象的指针 | +| OH_Drawing_TextStyle | 指向OH_Drawing_TextStyle对象的指针 | + + +### OH_Drawing_TypographyLayout() + + +``` +void OH_Drawing_TypographyLayout (OH_Drawing_Typography * , double ) +``` + +**Description:** + +排版布局 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Typography | 指向OH_Drawing_Typography对象的指针 | +| double | 文本最大宽度 | + + +### OH_Drawing_TypographyPaint() + + +``` +void OH_Drawing_TypographyPaint (OH_Drawing_Typography * , OH_Drawing_Canvas * , double , double ) +``` + +**Description:** + +显示文本 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeDrawing + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| OH_Drawing_Typography | 指向OH_Drawing_Typography对象的指针 | +| OH_Drawing_Canvas | 指向OH_Drawing_Canvas对象的指针 | +| double | x坐标 | +| double | y坐标 | diff --git a/zh-cn/application-dev/reference/native-apis/_hi_log.md b/zh-cn/application-dev/reference/native-apis/_hi_log.md new file mode 100644 index 0000000000..b35c12ae48 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/_hi_log.md @@ -0,0 +1,327 @@ +# HiLog + + +## **Overview** + +**Description:** + +HiLog模块实现日志打印功能。 + +开发者可以通过使用这些接口实现日志相关功能,输出日志时可以指定日志类型、所属业务领域、日志TAG标识、日志级别等。 + +\@syscap SystemCapability.HiviewDFX.HiLog + +**Since:** + +8 + + +## **Summary** + + +### Files + + | File Name | Description | +| -------- | -------- | +| [log.h](log_8h.md) | HiLog模块日志接口定义,通过这些接口实现日志打印相关功能。 | + + +### Macros + + | Macro Name and Value | Description | +| -------- | -------- | +| LOG_DOMAIN   0 | 日志所对应的业务领域,用于标识业务的子系统、模块。 | +| LOG_TAG   NULL | 字符串常量,标识调用所在的类或者业务。 | +| OH_LOG_DEBUG(type, ...)   ((void)OH_LOG_Print((type), LOG_DEBUG, LOG_DOMAIN, LOG_TAG, __VA_ARGS__)) | DEBUG级别写日志,宏封装接口。 | +| OH_LOG_INFO(type, ...)   ((void)OH_LOG_Print((type), LOG_INFO, LOG_DOMAIN, LOG_TAG, __VA_ARGS__)) | INFO级别写日志,宏封装接口。 | +| OH_LOG_WARN(type, ...)   ((void)OH_LOG_Print((type), LOG_WARN, LOG_DOMAIN, LOG_TAG, __VA_ARGS__)) | WARN级别写日志,宏封装接口。 | +| OH_LOG_ERROR(type, ...)   ((void)OH_LOG_Print((type), LOG_ERROR, LOG_DOMAIN, LOG_TAG, __VA_ARGS__)) | ERROR级别写日志,宏封装接口。 | +| OH_LOG_FATAL(type, ...)   ((void)HiLogPrint((type), LOG_FATAL, LOG_DOMAIN, LOG_TAG, __VA_ARGS__)) | FATAL级别写日志,宏封装接口。 | + + +### Enumerations + + | Enumeration Name | Description | +| -------- | -------- | +| LogType { LOG_APP = 0 } | 日志类型。 | +| LogLevel {   LOG_DEBUG = 3, LOG_INFO = 4, LOG_WARN = 5, LOG_ERROR = 6,   LOG_FATAL = 7 } | 日志级别。 | + + +### Functions + + | Function | Description | +| -------- | -------- | +| OH_LOG_Print (LogType type, LogLevel level, unsigned int domain, const char \*tag, const char \*fmt,...) __attribute__((__format__(os_log | int
写日志接口。 | +| OH_LOG_IsLoggable (unsigned int domain, const char \*tag, LogLevel level) | int bool
检查指定业务领域、TAG、级别的日志是否可以打印。 | + + +## **Details** + + +## **Macro Definition** + + +### LOG_DOMAIN + + +``` +#define LOG_DOMAIN 0 +``` + +**Description:** + +日志所对应的业务领域,用于标识业务的子系统、模块。 + +16进制整数,有效范围0x0~0xFFFF,超过自动截掉高位。 + + +### LOG_TAG + + +``` +#define LOG_TAG NULL +``` + +**Description:** + +字符串常量,标识调用所在的类或者业务。 + + +### OH_LOG_DEBUG + + +``` +#define OH_LOG_DEBUG( type, ... ) ((void)OH_LOG_Print((type), LOG_DEBUG, LOG_DOMAIN, LOG_TAG, __VA_ARGS__)) +``` + +**Description:** + +DEBUG级别写日志,宏封装接口。 + +使用时需要先定义日志业务领域、日志TAG,一般在源文件起始处统一定义一次。 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| type | 日志类型,三方应用日志类型为LOG_APP。 | +| fmt | 格式化字符串,基于类printf格式的增强,支持隐私参数标识,即在格式字符串每个参数中符号后类型前增加{public}、{private}标识。 | +| ... | 与格式字符串里参数类型对应的参数列表,参数数目、参数类型必须与格式字符串中的标识一一对应。 | + +**See also:** + +[OH_LOG_Print](#oh_log_print) + + +### OH_LOG_ERROR + + +``` +#define OH_LOG_ERROR( type, ... ) ((void)OH_LOG_Print((type), LOG_ERROR, LOG_DOMAIN, LOG_TAG, __VA_ARGS__)) +``` + +**Description:** + +ERROR级别写日志,宏封装接口。 + +使用时需要先定义日志业务领域、日志TAG,一般在源文件起始处统一定义一次。 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| type | 日志类型,三方应用日志类型为LOG_APP。 | +| fmt | 格式化字符串,基于类printf格式的增强,支持隐私参数标识,即在格式字符串每个参数中符号后类型前增加{public}、{private}标识。 | +| ... | 与格式字符串里参数类型对应的参数列表,参数数目、参数类型必须与格式字符串中的标识一一对应。 | + +**See also:** + +[OH_LOG_Print](#oh_log_print) + + +### OH_LOG_FATAL + + +``` +#define OH_LOG_FATAL( type, ... ) ((void)HiLogPrint((type), LOG_FATAL, LOG_DOMAIN, LOG_TAG, __VA_ARGS__)) +``` + +**Description:** + +FATAL级别写日志,宏封装接口。 + +使用时需要先定义日志业务领域、日志TAG,一般在源文件起始处统一定义一次。 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| type | 日志类型,三方应用日志类型为LOG_APP。 | +| fmt | 格式化字符串,基于类printf格式的增强,支持隐私参数标识,即在格式字符串每个参数中符号后类型前增加{public}、{private}标识。 | +| ... | 与格式字符串里参数类型对应的参数列表,参数数目、参数类型必须与格式字符串中的标识一一对应。 | + +**See also:** + +[OH_LOG_Print](#oh_log_print) + + +### OH_LOG_INFO + + +``` +#define OH_LOG_INFO( type, ... ) ((void)OH_LOG_Print((type), LOG_INFO, LOG_DOMAIN, LOG_TAG, __VA_ARGS__)) +``` + +**Description:** + +INFO级别写日志,宏封装接口。 + +使用时需要先定义日志业务领域、日志TAG,一般在源文件起始处统一定义一次。 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| type | 日志类型,三方应用日志类型为LOG_APP。 | +| fmt | 格式化字符串,基于类printf格式的增强,支持隐私参数标识,即在格式字符串每个参数中符号后类型前增加{public}、{private}标识。 | +| ... | 与格式字符串里参数类型对应的参数列表,参数数目、参数类型必须与格式字符串中的标识一一对应。 | + +**See also:** + +[OH_LOG_Print](#oh_log_print) + +### OH_LOG_WARN + + +``` +#define OH_LOG_WARN( type, ... ) ((void)OH_LOG_Print((type), LOG_WARN, LOG_DOMAIN, LOG_TAG, __VA_ARGS__)) +``` + +**Description:** + +WARN级别写日志,宏封装接口。 + +使用时需要先定义日志业务领域、日志TAG,一般在源文件起始处统一定义一次。 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| type | 日志类型,三方应用日志类型为LOG_APP。 | +| fmt | 格式化字符串,基于类printf格式的增强,支持隐私参数标识,即在格式字符串每个参数中符号后类型前增加{public}、{private}标识。 | +| ... | 与格式字符串里参数类型对应的参数列表,参数数目、参数类型必须与格式字符串中的标识一一对应。 | + +**See also:** + +[OH_LOG_Print](#oh_log_print) + + +## **Enumeration Type** + + +### LogLevel + + +``` +enum LogLevel +``` + +**Description:** + +日志级别。 + +该枚举类型用于定义日志级别。 + +各级别建议使用方式: + +DEBUG:比INFO级别更详细的流程记录,通过该级别的日志可以更详细地分析业务流程和定位分析问题。DEBUG级别的日志在正式发布版本中默认不会被打印,只有在调试版本或打开调试开关的情况下才会打印。 + +INFO:用来记录业务关键流程节点,可以还原业务的主要运行过程;用来记录非正常情况信息,但这些情况都是可以预期的(如无网络信号、登录失败等)。这些日志都应该由该业务内处于支配地位的模块来记录,避免在多个被调用的模块或低级函数中重复记录。 + +WARN:发生了较为严重的非预期情况,但是对用户影响不大,程序可以自动恢复或通过简单的操作就可以恢复的问题。 + +ERROR:程序或功能发生了错误,该错误会影响功能的正常运行或用户的正常使用,可以恢复但恢复代价较高,如重置数据等。 + +FATAL:重大致命异常,表明程序或功能即将崩溃,故障无法恢复。 + + | Enumerator | Description | +| -------- | -------- | +| LOG_DEBUG | DEBUG日志级别,使用OH_LOG_DEBUG接口打印 | +| LOG_INFO | INFO日志级别,使用OH_LOG_INFO接口打印 | +| LOG_WARN | WARN日志级别,使用OH_LOG_WARN接口打印 | +| LOG_ERROR | ERROR日志级别,使用OH_LOG_ERROR接口打印 | +| LOG_FATAL | FATAL日志级别,使用OH_LOG_FATAL接口打印 | + + +### LogType + + +``` +enum LogType +``` + +**Description:** + +日志类型。 + +该枚举类型用于定义应用开发者可以使用的日志类型。当前有应用日志LOG_APP。 + + | Enumerator | Description | +| -------- | -------- | +| LOG_APP | 应用日志 | + + +## **Function** + + +### OH_LOG_IsLoggable() + + +``` +int bool OH_LOG_IsLoggable (unsigned int domain, const char * tag, LogLevel level ) +``` + +**Description:** + +检查指定业务领域、TAG、级别的日志是否可以打印。 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| domain | 指定日志业务领域。 | +| tag | 指定日志TAG。 | +| level | 指定日志level。 | + +**Returns:** + +如果指定domain、tag、level日志可以打印则返回true;否则返回false。 + + +### OH_LOG_Print() + + +``` +int OH_LOG_Print (LogType type, LogLevel level, unsigned int domain, const char * tag, const char * fmt, ... ) +``` + +**Description:** + +写日志接口。 + +指定日志类型、日志级别、业务领域、TAG,按照类printf格式类型和隐私指示确定需要输出的变参。 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| type | 日志类型,三方应用日志类型为LOG_APP。 | +| level | 日志级别,日志级别包括LOG_DEBUG、LOG_INFO、LOG_WARN、LOG_ERROR、LOG_FATAL。 | +| domain | 日志业务领域,16进制整数,范围0x0~0xFFFF。 | +| tag | 日志TAG,字符串,标识调用所在的类或者业务。 | +| fmt | 格式化字符串,基于类printf格式的增强,支持隐私参数标识,即在格式字符串每个参数中符号后类型前增加{public}、{private}标识。 | +| ... | 与格式字符串里参数类型对应的参数列表,参数数目、参数类型必须与格式字符串中的标识一一对应。 | + +**Returns:** + +大于等于0表示成功;小于0表示失败。 diff --git a/zh-cn/application-dev/reference/native-apis/_native___bundle.md b/zh-cn/application-dev/reference/native-apis/_native___bundle.md new file mode 100644 index 0000000000..4322e5a5e9 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/_native___bundle.md @@ -0,0 +1,61 @@ +# Native_Bundle + + +## **Overview** + +**Description:** + +Describes the Native Bundle. + +**Since:** + +9 + +**Version:** + +1.0 + + +## **Summary** + + +### Files + + | File Name | Description | +| -------- | -------- | +| [native_interface_bundle.h](native__interface__bundle_8h.md) | Declares the **Bundle**-specific function, including function for obtaining application ID. | + + +### Functions + + | Function | Description | +| -------- | -------- | +| OH_NativeBundle_GetAppIdByBundleName (const char \*bundleName) | char \*
Obtains the application ID based on the given bundle name. | + + +## **Details** + + +## **Function** + + +### OH_NativeBundle_GetAppIdByBundleName() + + +``` +char* OH_NativeBundle_GetAppIdByBundleName (const char * bundleName) +``` + +**Description:** + +Obtains the application ID based on the given bundle name. + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| bundleName | Indicates the bundle name of the application. | + +**Returns:** + +Returns the application ID pointer if successfully obtained and needs to be freed; returns nullptr otherwise. diff --git a/zh-cn/application-dev/reference/native-apis/_native_window.md b/zh-cn/application-dev/reference/native-apis/_native_window.md new file mode 100644 index 0000000000..7c5ae2c90a --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/_native_window.md @@ -0,0 +1,339 @@ +# NativeWindow + + +## **Overview** + +**Description:** + +提供NativeWindow功能,主要用来和egl对接 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeWindow + +**Since:** + +8 + +**Version:** + +1.0 + + +## **Summary** + + +### Files + + | File Name | Description | +| -------- | -------- | +| [external_window.h](external__window_8h.md) | 定义获取和使用NativeWindow的相关函数 | + + +### Functions + + | Function | Description | +| -------- | -------- | +| OH_NativeWindow_CreateNativeWindowFromSurface (void \*pSurface) | struct NativeWindow \*
创建NativeWindow实例,每次调用都会产生一个新的NativeWindow实例 | +| OH_NativeWindow_DestroyNativeWindow (struct NativeWindow \*window) | void
将NativeWindow对象的引用计数减1,当引用计数为0的时候,该NativeWindow对象会被析构掉 | +| OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer (void \*pSurfaceBuffer) | struct NativeWindowBuffer \*
创建NativeWindowBuffer实例,每次调用都会产生一个新的NativeWindowBuffer实例 | +| OH_NativeWindow_DestroyNativeWindowBuffer (struct NativeWindowBuffer \*buffer) | void
将NativeWindowBuffer对象的引用计数减1,当引用计数为0的时候,该NativeWindowBuffer对象会被析构掉 | +| OH_NativeWindow_NativeWindowRequestBuffer (struct NativeWindow \*window, struct NativeWindowBuffer \*\*buffer, int \*fenceFd) | int32_t
通过NativeWindow对象申请一块NativeWindowBuffer,用以内容生产 | +| OH_NativeWindow_NativeWindowFlushBuffer (struct NativeWindow \*window, struct NativeWindowBuffer \*buffer, int fenceFd, Region region) | int32_t
通过NativeWindow将生产好内容的NativeWindowBuffer放回到Buffer队列中,用以内容消费 | +| OH_NativeWindow_NativeWindowCancelBuffer (struct NativeWindow \*window, struct NativeWindowBuffer \*buffer) | int32_t
通过NativeWindow将之前申请出来的NativeWindowBuffer返还到Buffer队列中,供下次再申请 | +| OH_NativeWindow_NativeWindowHandleOpt (struct NativeWindow \*window, int code,...) | int32_t
设置/获取NativeWindow的属性,包括设置/获取宽高、内容格式等 | +| OH_NativeWindow_GetBufferHandleFromNative (struct NativeWindowBuffer \*buffer) | BufferHandle \*
通过NativeWindowBuffer获取该buffer的BufferHandle指针 | +| OH_NativeWindow_NativeObjectReference (void \*obj) | int32_t
增加一个NativeObject的引用计数 | +| OH_NativeWindow_NativeObjectUnreference (void \*obj) | int32_t
减少一个NativeObject的引用计数,当引用计数减少为0时,该NativeObject将被析构掉 | +| OH_NativeWindow_GetNativeObjectMagic (void \*obj) | int32_t
获取NativeObject的MagicId | + + +## **Details** + + +## **Function** + + +### OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer() + + +``` +struct NativeWindowBuffer* OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer (void * pSurfaceBuffer) +``` + +**Description:** + +创建NativeWindowBuffer实例,每次调用都会产生一个新的NativeWindowBuffer实例 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeWindow + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| pSurfaceBuffer | 参数是一个指向生产者buffer的指针,类型为sptr<OHOS::SurfaceBuffer> | + +**Returns:** + +返回一个指针,指向NativeWindowBuffer的结构体实例 + + +### OH_NativeWindow_CreateNativeWindowFromSurface() + + +``` +struct NativeWindow* OH_NativeWindow_CreateNativeWindowFromSurface (void * pSurface) +``` + +**Description:** + +创建NativeWindow实例,每次调用都会产生一个新的NativeWindow实例 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeWindow + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| pSurface | 参数是一个指向生产者ProduceSurface的指针,类型为sptr<OHOS::Surface> | + +**Returns:** + +返回一个指针,指向NativeWindow的结构体实例 + + +### OH_NativeWindow_DestroyNativeWindow() + + +``` +void OH_NativeWindow_DestroyNativeWindow (struct NativeWindow * window) +``` + +**Description:** + +将NativeWindow对象的引用计数减1,当引用计数为0的时候,该NativeWindow对象会被析构掉 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeWindow + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| window | 参数是一个NativeWindow的结构体实例的指针 | + + +### OH_NativeWindow_DestroyNativeWindowBuffer() + + +``` +void OH_NativeWindow_DestroyNativeWindowBuffer (struct NativeWindowBuffer * buffer) +``` + +**Description:** + +将NativeWindowBuffer对象的引用计数减1,当引用计数为0的时候,该NativeWindowBuffer对象会被析构掉 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeWindow + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| buffer | 参数是一个NativeWindowBuffer的结构体实例的指针 | + + +### OH_NativeWindow_GetBufferHandleFromNative() + + +``` +BufferHandle* OH_NativeWindow_GetBufferHandleFromNative (struct NativeWindowBuffer * buffer) +``` + +**Description:** + +通过NativeWindowBuffer获取该buffer的BufferHandle指针 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeWindow + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| buffer | 参数是一个NativeWindowBuffer的结构体实例的指针 | + +**Returns:** + +BufferHandle 返回一个指针,指向BufferHandle的结构体实例 + + +### OH_NativeWindow_GetNativeObjectMagic() + + +``` +int32_t OH_NativeWindow_GetNativeObjectMagic (void * obj) +``` + +**Description:** + +获取NativeObject的MagicId + +\@syscap SystemCapability.Graphic.Graphic2D.NativeWindow + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| obj | 参数是一个NativeWindow or NativeWindowBuffer的结构体实例的指针 | + +**Returns:** + +MagicId 返回值为魔鬼数字,每个NativeObject唯一 + + +### OH_NativeWindow_NativeObjectReference() + + +``` +int32_t OH_NativeWindow_NativeObjectReference (void * obj) +``` + +**Description:** + +增加一个NativeObject的引用计数 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeWindow + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| obj | 参数是一个NativeWindow or NativeWindowBuffer的结构体实例的指针 | + +**Returns:** + +GSError 返回值为错误码 + + +### OH_NativeWindow_NativeObjectUnreference() + + +``` +int32_t OH_NativeWindow_NativeObjectUnreference (void * obj) +``` + +**Description:** + +减少一个NativeObject的引用计数,当引用计数减少为0时,该NativeObject将被析构掉 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeWindow + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| obj | 参数是一个NativeWindow or NativeWindowBuffer的结构体实例的指针 | + +**Returns:** + +GSError + + +### OH_NativeWindow_NativeWindowCancelBuffer() + + +``` +int32_t OH_NativeWindow_NativeWindowCancelBuffer (struct NativeWindow * window, struct NativeWindowBuffer * buffer ) +``` + +**Description:** + +通过NativeWindow将之前申请出来的NativeWindowBuffer返还到Buffer队列中,供下次再申请 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeWindow + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| window | 参数是一个NativeWindow的结构体实例的指针 | +| buffer | 参数是一个NativeWindowBuffer的结构体实例的指针 | + +**Returns:** + +GSError 返回值为错误码 + + +### OH_NativeWindow_NativeWindowFlushBuffer() + + +``` +int32_t OH_NativeWindow_NativeWindowFlushBuffer (struct NativeWindow * window, struct NativeWindowBuffer * buffer, int fenceFd, Region region ) +``` + +**Description:** + +通过NativeWindow将生产好内容的NativeWindowBuffer放回到Buffer队列中,用以内容消费 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeWindow + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| window | 参数是一个NativeWindow的结构体实例的指针 | +| buffer | 参数是一个NativeWindowBuffer的结构体实例的指针 | +| fenceFd | 参数是一个文件描述符句柄,用以同步时序 | +| region | 参数表示一块脏区域,该区域有内容更新 | + +**Returns:** + +GSError 返回值为错误码 + + +### OH_NativeWindow_NativeWindowHandleOpt() + + +``` +int32_t OH_NativeWindow_NativeWindowHandleOpt (struct NativeWindow * window, int code, ... ) +``` + +**Description:** + +设置/获取NativeWindow的属性,包括设置/获取宽高、内容格式等 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeWindow + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| window | 参数是一个NativeWindow的结构体实例的指针 | +| code | 操作码 | + +**Returns:** + +GSError 返回值为错误码 + + +### OH_NativeWindow_NativeWindowRequestBuffer() + + +``` +int32_t OH_NativeWindow_NativeWindowRequestBuffer (struct NativeWindow * window, struct NativeWindowBuffer ** buffer, int * fenceFd ) +``` + +**Description:** + +通过NativeWindow对象申请一块NativeWindowBuffer,用以内容生产 + +\@syscap SystemCapability.Graphic.Graphic2D.NativeWindow + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| window | 参数是一个NativeWindow的结构体实例的指针 | +| buffer | 参数是一个NativeWindowBuffer的结构体实例的二级指针 | +| fenceFd | 参数是一个文件描述符句柄 | + +**Returns:** + +GSError 返回值为错误码 diff --git a/zh-cn/application-dev/reference/native-apis/_o_h___drawing___bitmap_format.md b/zh-cn/application-dev/reference/native-apis/_o_h___drawing___bitmap_format.md new file mode 100644 index 0000000000..bf5350217d --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/_o_h___drawing___bitmap_format.md @@ -0,0 +1,61 @@ +# OH_Drawing_BitmapFormat + + +## **Overview** + +**Related Modules:** + +[Drawing](_drawing.md) + +**Description:** + +结构体用于描述位图像素的格式,包括颜色类型和透明度类型 + +**Since:** + +8 + +**Version:** + +1.0 + + +## **Summary** + + +### Public Attributes + + | Public Attribute Name | Description | +| -------- | -------- | +| colorFormat | | +| alphaFormat | | + + +## **Details** + + +## **Member Data** + + +### alphaFormat + + +``` +OH_Drawing_AlphaFormat OH_Drawing_BitmapFormat::alphaFormat +``` + +**Description:** + +描述位图像素的透明度分量 + + +### colorFormat + + +``` +OH_Drawing_ColorFormat OH_Drawing_BitmapFormat::colorFormat +``` + +**Description:** + +描述位图像素的存储格式 diff --git a/zh-cn/application-dev/reference/native-apis/_o_h___native_x_component.md b/zh-cn/application-dev/reference/native-apis/_o_h___native_x_component.md new file mode 100644 index 0000000000..048ec09047 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/_o_h___native_x_component.md @@ -0,0 +1,575 @@ +# Native XComponent + + +## **Overview** + +**Description:** + +Describes the surface and touch event held by the ArkUI XComponent, which can be used for the EGL/OpenGLES and media data input and displayed on the ArkUI XComponent. + +**Since:** + +8 + +**Version:** + +1.0 + + +## **Summary** + + +### Files + + | File Name | Description | +| -------- | -------- | +| [native_interface_xcomponent.h](native__interface__xcomponent_8h.md) | Declares APIs for accessing a Native XComponent. | + + +### Classes + + | Classe Name | Description | +| -------- | -------- | +| [OH_NativeXComponent_TouchPoint](_o_h___native_x_component___touch_point.md) | | +| [OH_NativeXComponent_TouchEvent](_o_h___native_x_component___touch_event.md) | | +| [OH_NativeXComponent_Callback](_o_h___native_x_component___callback.md) | Registers the surface lifecycle and touch event callbacks. | + + +### Macros + + | Macro Name and Value | Description | +| -------- | -------- | +| **OH_NATIVE_XCOMPONENT_OBJ**   ("__NATIVE_XCOMPONENT_OBJ__") | | + + +### Typedefs + + | Typedef Name | Description | +| -------- | -------- | +| OH_NativeXComponent | typedef struct OH_NativeXComponent
Provides an encapsulated **OH_NativeXComponent** instance. | +| OH_NativeXComponent_Callback | typedef struct OH_NativeXComponent_Callback
Registers the surface lifecycle and touch event callbacks. | + + +### Enumerations + + | Enumeration Name | Description | +| -------- | -------- | +| { OH_NATIVEXCOMPONENT_RESULT_SUCCESS = 0, OH_NATIVEXCOMPONENT_RESULT_FAILED = -1, OH_NATIVEXCOMPONENT_RESULT_BAD_PARAMETER = -2 } | Enumerates the API access states. | +| OH_NativeXComponent_TouchEventType {   OH_NATIVEXCOMPONENT_DOWN = 0, OH_NATIVEXCOMPONENT_UP, OH_NATIVEXCOMPONENT_MOVE, OH_NATIVEXCOMPONENT_CANCEL,   OH_NATIVEXCOMPONENT_UNKNOWN } | | + + +### Functions + + | Function | Description | +| -------- | -------- | +| OH_NativeXComponent_GetXComponentId (OH_NativeXComponent \*component, char \*id, uint64_t \*size) | int32_t
Obtains the ID of the ArkUI XComponent. | +| OH_NativeXComponent_GetXComponentSize (OH_NativeXComponent \*component, const void \*window, uint64_t \*width, uint64_t \*height) | int32_t
Obtains the size of the surface held by the ArkUI XComponent. | +| OH_NativeXComponent_GetXComponentOffset (OH_NativeXComponent \*component, const void \*window, double \*x, double \*y) | int32_t
Obtains the offset of the surface held by the ArkUI XComponent. | +| OH_NativeXComponent_GetTouchEvent (OH_NativeXComponent \*component, const void \*window, OH_NativeXComponent_TouchEvent \*touchEvent) | int32_t
Obtains the touch event dispatched by the ArkUI XComponent. | +| OH_NativeXComponent_RegisterCallback (OH_NativeXComponent \*component, OH_NativeXComponent_Callback \*callback) | int32_t
Registers a callback for this **OH_NativeXComponent** instance. | + + +## **Details** + + +## **Typedef** + + +### OH_NativeXComponent + + +``` +typedef struct OH_NativeXComponent OH_NativeXComponent +``` + +**Description:** + +Provides an encapsulated **OH_NativeXComponent** instance. + + +### OH_NativeXComponent_Callback + + +``` +typedef struct OH_NativeXComponent_Callback OH_NativeXComponent_Callback +``` + +**Description:** + +Registers the surface lifecycle and touch event callbacks. + + +## **Enumeration Type** + + +### anonymous enum + + +``` +anonymous enum +``` + +**Description:** + +Enumerates the API access states. + + | Enumerator | Description | +| -------- | -------- | +| OH_NATIVEXCOMPONENT_RESULT_SUCCESS | Success result. | +| OH_NATIVEXCOMPONENT_RESULT_FAILED | Failed result. | +| OH_NATIVEXCOMPONENT_RESULT_BAD_PARAMETER | Invalid parameters. | + + +### OH_NativeXComponent_TouchEventType + + +``` +enum OH_NativeXComponent_TouchEventType +``` + + | Enumerator | Description | +| -------- | -------- | +| OH_NATIVEXCOMPONENT_DOWN | Trigger a touch event when a finger is pressed. | +| OH_NATIVEXCOMPONENT_UP | Trigger a touch event when a finger is lifted. | +| OH_NATIVEXCOMPONENT_MOVE | Trigger a touch event when a finger moves on the screen in pressed state. | +| OH_NATIVEXCOMPONENT_CANCEL | Trigger an event when a touch event is canceled. | +| OH_NATIVEXCOMPONENT_UNKNOWN | Invalid touch type. | + + +## **Function** + + +### OH_NativeXComponent_GetTouchEvent() + + +``` +int32_t OH_NativeXComponent_GetTouchEvent (OH_NativeXComponent * component, const void * window, OH_NativeXComponent_TouchEvent * touchEvent ) +``` + +**Description:** + +Obtains the touch event dispatched by the ArkUI XComponent. + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| component | Indicates the pointer to this **OH_NativeXComponent** instance. | +| window | Indicates the native window handler. | +| touchEvent | Indicates the pointer to the current touch event. | + +**Returns:** + +Returns the status code of the execution. + + +### OH_NativeXComponent_GetXComponentId() + + +``` +int32_t OH_NativeXComponent_GetXComponentId (OH_NativeXComponent * component, char * id, uint64_t * size ) +``` + +**Description:** + +Obtains the ID of the ArkUI XComponent. + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| component | Indicates the pointer to this **OH_NativeXComponent** instance. | +| id | Indicates the char buffer to keep the ID of this **OH_NativeXComponent** instance. Note that a null-terminator will be appended to the char buffer, so the size of the char buffer should be at least as large as the size of the real id length plus 1. It is recommended that the size of the char buffer be [OH_XCOMPONENT_ID_LEN_MAX + 1]. | +| size | Indicates the pointer to the length of **id**, which you can set and receive. | + +**Returns:** + +Returns the status code of the execution. + + +### OH_NativeXComponent_GetXComponentOffset() + + +``` +int32_t OH_NativeXComponent_GetXComponentOffset (OH_NativeXComponent * component, const void * window, double * x, double * y ) +``` + +**Description:** + +Obtains the offset of the surface held by the ArkUI XComponent. + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| component | Indicates the pointer to this **OH_NativeXComponent** instance. | +| window | Indicates the native window handler. | +| x | Indicates the pointer to the x coordinate of the current surface. | +| y | Indicates the pointer to the y coordinate of the current surface. | + +**Returns:** + +Returns the status code of the execution. + + +### OH_NativeXComponent_GetXComponentSize() + + +``` +int32_t OH_NativeXComponent_GetXComponentSize (OH_NativeXComponent * component, const void * window, uint64_t * width, uint64_t * height ) +``` + +**Description:** + +Obtains the size of the surface held by the ArkUI XComponent. + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| component | Indicates the pointer to this **OH_NativeXComponent** instance. | +| window | Indicates the native window handler. | +| width | Indicates the pointer to the width of the current surface. | +| height | Indicates the pointer to the height of the current surface. | + +**Returns:** + +Returns the status code of the execution. + + +### OH_NativeXComponent_RegisterCallback() + + +``` +int32_t OH_NativeXComponent_RegisterCallback (OH_NativeXComponent * component, OH_NativeXComponent_Callback * callback ) +``` + +**Description:** + +Registers a callback for this **OH_NativeXComponent** instance. + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| component | Indicates the pointer to this **OH_NativeXComponent** instance. | +| callback | Indicates the pointer to a surface lifecycle and touch event callback. | + +**Returns:** + +Returns the status code of the execution. + + +## **Variable** + + +### deviceId + + +``` +int64_t OH_NativeXComponent_TouchEvent::deviceId = 0 +``` + +**Description:** + +ID of the device where the current touch event is generated. + + +### DispatchTouchEvent + + +``` +void(* OH_NativeXComponent_Callback::DispatchTouchEvent) (OH_NativeXComponent *component, void *window) +``` + +**Description:** + +Called when a touch event is triggered. + + +### force [1/2] + + +``` +float OH_NativeXComponent_TouchPoint::force = 0.0 +``` + +**Description:** + +Pressure of the current touch event. + + +### force [2/2] + + +``` +float OH_NativeXComponent_TouchEvent::force = 0.0 +``` + +**Description:** + +Pressure of the current touch event. + + +### id [1/2] + + +``` +int32_t OH_NativeXComponent_TouchPoint::id = 0 +``` + +**Description:** + +Unique identifier of a finger. + + +### id [2/2] + + +``` +int32_t OH_NativeXComponent_TouchEvent::id = 0 +``` + +**Description:** + +Unique identifier of a finger. + + +### isPressed + + +``` +bool OH_NativeXComponent_TouchPoint::isPressed = false +``` + +**Description:** + +Whether the current point is pressed. + + +### numPoints + + +``` +uint32_t OH_NativeXComponent_TouchEvent::numPoints = 0 +``` + +**Description:** + +Number of current touch points. + + +### OnSurfaceChanged + + +``` +void(* OH_NativeXComponent_Callback::OnSurfaceChanged) (OH_NativeXComponent *component, void *window) +``` + +**Description:** + +Called when the surface is changed. This API is defined but not implemented in OpenHarmony 3.1 Release. It will be available for use in OpenHarmony 3.1 MR. + + +### OnSurfaceCreated + + +``` +void(* OH_NativeXComponent_Callback::OnSurfaceCreated) (OH_NativeXComponent *component, void *window) +``` + +**Description:** + +Called when the surface is created. + + +### OnSurfaceDestroyed + + +``` +void(* OH_NativeXComponent_Callback::OnSurfaceDestroyed) (OH_NativeXComponent *component, void *window) +``` + +**Description:** + +Called when the surface is destroyed. + + +### screenX [1/2] + + +``` +float OH_NativeXComponent_TouchPoint::screenX = 0.0 +``` + +**Description:** + +X coordinate of the touch point relative to the left edge of the screen. + + +### screenX [2/2] + + +``` +float OH_NativeXComponent_TouchEvent::screenX = 0.0 +``` + +**Description:** + +X coordinate of the touch point relative to the left edge of the screen. + + +### screenY [1/2] + + +``` +float OH_NativeXComponent_TouchPoint::screenY = 0.0 +``` + +**Description:** + +Y coordinate of the touch point relative to the upper edge of the screen. + + +### screenY [2/2] + + +``` +float OH_NativeXComponent_TouchEvent::screenY = 0.0 +``` + +**Description:** + +Y coordinate of the touch point relative to the upper edge of the screen. + + +### size [1/2] + + +``` +double OH_NativeXComponent_TouchPoint::size = 0.0 +``` + +**Description:** + +Contact area between the finger pad and the screen. + + +### size [2/2] + + +``` +double OH_NativeXComponent_TouchEvent::size = 0.0 +``` + +**Description:** + +Contact area between the finger pad and the screen. + + +### timeStamp [1/2] + + +``` +long long OH_NativeXComponent_TouchPoint::timeStamp = 0 +``` + +**Description:** + +Timestamp of the current touch event. + + +### timeStamp [2/2] + + +``` +long long OH_NativeXComponent_TouchEvent::timeStamp = 0 +``` + +**Description:** + +Timestamp of the current touch event. + + +### touchPoints + + +``` +OH_NativeXComponent_TouchPoint OH_NativeXComponent_TouchEvent::touchPoints[OH_MAX_TOUCH_POINTS_NUMBER] +``` + +**Description:** + +Array of the current touch points. + + +### type [1/2] + + +``` +OH_NativeXComponent_TouchEventType OH_NativeXComponent_TouchPoint::type = OH_NativeXComponent_TouchEventType::OH_NATIVEXCOMPONENT_UNKNOWN +``` + +**Description:** + +Touch type of the touch event. + + +### type [2/2] + + +``` +OH_NativeXComponent_TouchEventType OH_NativeXComponent_TouchEvent::type = OH_NativeXComponent_TouchEventType::OH_NATIVEXCOMPONENT_UNKNOWN +``` + +**Description:** + +Touch type of the touch event. + + +### x [1/2] + + +``` +float OH_NativeXComponent_TouchPoint::x = 0.0 +``` + +**Description:** + +X coordinate of the touch point relative to the left edge of the element to touch. + + +### x [2/2] + + +``` +float OH_NativeXComponent_TouchEvent::x = 0.0 +``` + +**Description:** + +X coordinate of the touch point relative to the left edge of the element to touch. + + +### y [1/2] + + +``` +float OH_NativeXComponent_TouchPoint::y = 0.0 +``` + +**Description:** + +Y coordinate of the touch point relative to the upper edge of the element to touch. + + +### y [2/2] + + +``` +float OH_NativeXComponent_TouchEvent::y = 0.0 +``` + +**Description:** + +Y coordinate of the touch point relative to the upper edge of the element to touch. diff --git a/zh-cn/application-dev/reference/native-apis/_o_h___native_x_component___callback.md b/zh-cn/application-dev/reference/native-apis/_o_h___native_x_component___callback.md new file mode 100644 index 0000000000..68aeeadfd5 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/_o_h___native_x_component___callback.md @@ -0,0 +1,29 @@ +# OH_NativeXComponent_Callback + + +## **Overview** + +**Related Modules:** + +[Native XComponent](_o_h___native_x_component.md) + +**Description:** + +Registers the surface lifecycle and touch event callbacks. + +**Since:** +8 +**Version:** +1.0 + +## **Summary** + + +### Public Attributes + + | Public Attribute Name | Description | +| -------- | -------- | +| [OnSurfaceCreated](_o_h___native_x_component.md#ga8beefd4b2359680a3106b28227e47d00) )([OH_NativeXComponent](_o_h___native_x_component.md#ga0e676460ec145b81bdb07a97a368a5f1) \*component, void \*window) | | +| [OnSurfaceChanged](_o_h___native_x_component.md#ga7d84244e13477d91cfdade8d9ff8565b) )([OH_NativeXComponent](_o_h___native_x_component.md#ga0e676460ec145b81bdb07a97a368a5f1) \*component, void \*window) | | +| [OnSurfaceDestroyed](_o_h___native_x_component.md#gad32bd08c749422d807ac87c558af6a44) )([OH_NativeXComponent](_o_h___native_x_component.md#ga0e676460ec145b81bdb07a97a368a5f1) \*component, void \*window) | | +| [DispatchTouchEvent](_o_h___native_x_component.md#ga3d40ca63aba381a63435f71f679e1f26) )([OH_NativeXComponent](_o_h___native_x_component.md#ga0e676460ec145b81bdb07a97a368a5f1) \*component, void \*window) | | diff --git a/zh-cn/application-dev/reference/native-apis/_o_h___native_x_component___touch_event.md b/zh-cn/application-dev/reference/native-apis/_o_h___native_x_component___touch_event.md new file mode 100644 index 0000000000..2abae7c057 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/_o_h___native_x_component___touch_event.md @@ -0,0 +1,29 @@ +# OH_NativeXComponent_TouchEvent + + +## **Overview** + +**Related Modules:** + +[Native XComponent](_o_h___native_x_component.md) + + +## **Summary** + + +### Public Attributes + + | Public Attribute Name | Description | +| -------- | -------- | +| [id](_o_h___native_x_component.md#gac986c10f386a0b55bd813caec06fe190) = 0 | | +| [screenX](_o_h___native_x_component.md#ga68fe9ff656e74ae14254523443d85bb1) = 0.0 | | +| [screenY](_o_h___native_x_component.md#ga7696e0e1a81787400e187058a1e332f2) = 0.0 | | +| [x](_o_h___native_x_component.md#ga9688a76d25bede284e36b7226ec8ad3a) = 0.0 | | +| [y](_o_h___native_x_component.md#ga0136d85dae638fbe9baaa69cf67a9833) = 0.0 | | +| [type](_o_h___native_x_component.md#ga22f67143e6acdefa5c7fd4ba23f7c2b6) = [OH_NativeXComponent_TouchEventType::OH_NATIVEXCOMPONENT_UNKNOWN](_o_h___native_x_component.md#gga0a8c68dd460d7e801e7c0ff771f09182aff39d23c1412b3b110a19df4893651d3) | | +| [size](_o_h___native_x_component.md#ga723601b60610b546fbdaf29e87575ca2) = 0.0 | | +| [force](_o_h___native_x_component.md#ga7c0a450a47231bd55994a970b3750d3f) = 0.0 | | +| [deviceId](_o_h___native_x_component.md#ga00660bb31b05cebe8964ba221c24f966) = 0 | | +| [timeStamp](_o_h___native_x_component.md#gadd872bda25d5af9327d12d06a70149fd) = 0 | | +| [touchPoints](_o_h___native_x_component.md#gab3514bf8d2fa3de8191d4898ee739053) [OH_MAX_TOUCH_POINTS_NUMBER] | | +| [numPoints](_o_h___native_x_component.md#gad8c19c6c2bbb367fa18fffa813e21cc6) = 0 | | diff --git a/zh-cn/application-dev/reference/native-apis/_o_h___native_x_component___touch_point.md b/zh-cn/application-dev/reference/native-apis/_o_h___native_x_component___touch_point.md new file mode 100644 index 0000000000..221780a1d3 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/_o_h___native_x_component___touch_point.md @@ -0,0 +1,27 @@ +# OH_NativeXComponent_TouchPoint + + +## **Overview** + +**Related Modules:** + +[Native XComponent](_o_h___native_x_component.md) + + +## **Summary** + + +### Public Attributes + + | Public Attribute Name | Description | +| -------- | -------- | +| [id](_o_h___native_x_component.md#gafc435f3e8b5acf462b28bae69180d971) = 0 | | +| [screenX](_o_h___native_x_component.md#gae96f097ddffb119b824bcd9f59857ea4) = 0.0 | | +| [screenY](_o_h___native_x_component.md#ga8fb126875104358f84e17ddd66dbbf60) = 0.0 | | +| [x](_o_h___native_x_component.md#ga04e0e65a35a652d86460c82bf0ca02e3) = 0.0 | | +| [y](_o_h___native_x_component.md#ga13d254769a362f049243505e84df8fa4) = 0.0 | | +| [type](_o_h___native_x_component.md#gac2b852641112bce8de71f080a21a118a) = [OH_NativeXComponent_TouchEventType::OH_NATIVEXCOMPONENT_UNKNOWN](_o_h___native_x_component.md#gga0a8c68dd460d7e801e7c0ff771f09182aff39d23c1412b3b110a19df4893651d3) | | +| [size](_o_h___native_x_component.md#ga9e5a0e118ab61a889126a985be7947dd) = 0.0 | | +| [force](_o_h___native_x_component.md#gaf3d4f92022552678d5d81d2396900595) = 0.0 | | +| [timeStamp](_o_h___native_x_component.md#gad090e826a0e33a4054f468109a5a729d) = 0 | | +| [isPressed](_o_h___native_x_component.md#ga527c92deb88977ae842ffe6fee50d571) = false | | diff --git a/zh-cn/application-dev/reference/native-apis/_raw_file_descriptor.md b/zh-cn/application-dev/reference/native-apis/_raw_file_descriptor.md new file mode 100644 index 0000000000..2b4212c485 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/_raw_file_descriptor.md @@ -0,0 +1,76 @@ +# RawFileDescriptor + + +## **Overview** + +**Related Modules:** + +[Rawfile](rawfile.md) + +**Description:** + +提供rawfile文件描述符信息 + +RawFileDescriptor是[OH_ResourceManager_GetRawFileDescriptor](rawfile.md#ga8313a7d4bb361a98ced485346a9be4b1)的输出参数, 涵盖了rawfile文件的文件描述符以及在HAP包中的起始位置和长度。 + +**Since:** + +8 + +**Version:** + +1.0 + + +## **Summary** + + +### Public Attributes + + | Public Attribute Name | Description | +| -------- | -------- | +| fd | | +| start | | +| length | | + + +## **Details** + + +## **Member Data** + + +### fd + + +``` +int RawFileDescriptor::fd +``` + +**Description:** + +rawfile文件描述符 + + +### length + + +``` +long RawFileDescriptor::length +``` + +**Description:** + +rawfile在HAP包中的长度 + + +### start + + +``` +long RawFileDescriptor::start +``` + +**Description:** + +rawfile在HAP包中的起始位置 diff --git a/zh-cn/application-dev/reference/native-apis/annotated.md b/zh-cn/application-dev/reference/native-apis/annotated.md new file mode 100644 index 0000000000..b4b83d5bb7 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/annotated.md @@ -0,0 +1,13 @@ +# 结构体 + + + +- **[OH_Drawing_BitmapFormat](_o_h___drawing___bitmap_format.md)** + +- **[OH_NativeXComponent_Callback](_o_h___native_x_component___callback.md)** + +- **[OH_NativeXComponent_TouchEvent](_o_h___native_x_component___touch_event.md)** + +- **[OH_NativeXComponent_TouchPoint](_o_h___native_x_component___touch_point.md)** + +- **[RawFileDescriptor](_raw_file_descriptor.md)** \ No newline at end of file diff --git a/zh-cn/application-dev/reference/native-apis/drawing__bitmap_8h.md b/zh-cn/application-dev/reference/native-apis/drawing__bitmap_8h.md new file mode 100644 index 0000000000..e16944b2b8 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/drawing__bitmap_8h.md @@ -0,0 +1,38 @@ +# drawing_bitmap.h + + +## **Overview** + +**Related Modules:** + +[Drawing](_drawing.md) + +**Description:** + +文件中定义了与位图相关的功能函数 + +**Since:** +8 +**Version:** +1.0 + +## **Summary** + + +### Classes + + | Classe Name | Description | +| -------- | -------- | +| [OH_Drawing_BitmapFormat](_o_h___drawing___bitmap_format.md) | 结构体用于描述位图像素的格式,包括颜色类型和透明度类型 | + + +### Functions + + | Function | Description | +| -------- | -------- | +| [OH_Drawing_BitmapCreate](_drawing.md#gac2d33ba4b18e71eca8c41c136004ba48) (void) | [OH_Drawing_Bitmap](_drawing.md#ga8ac4e64cd1e2c651d11325e04c72ddeb) \*
函数用于创建一个位图对象。 | +| [OH_Drawing_BitmapDestroy](_drawing.md#ga5c31becccf1d3ad5df5f6bc7d9007b8f) ([OH_Drawing_Bitmap](_drawing.md#ga8ac4e64cd1e2c651d11325e04c72ddeb) \*) | void
函数用于销毁位图对象并回收该对象占有内存。 | +| [OH_Drawing_BitmapBuild](_drawing.md#ga699afe9c4d2665cdd21b5d9b6dfed2ec) ([OH_Drawing_Bitmap](_drawing.md#ga8ac4e64cd1e2c651d11325e04c72ddeb) \*, const uint32_t width, const uint32_t height, const [OH_Drawing_BitmapFormat](_o_h___drawing___bitmap_format.md) \*) | void
函数用于初始化位图对象的宽度和高度,并且为该位图设置像素格式 | +| [OH_Drawing_BitmapGetWidth](_drawing.md#ga67b83650847ab1f6e79ca122905d55a3) ([OH_Drawing_Bitmap](_drawing.md#ga8ac4e64cd1e2c651d11325e04c72ddeb) \*) | uint32_t
该函数用于获取指定位图的宽度 | +| [OH_Drawing_BitmapGetHeight](_drawing.md#gace471d69bec5b152bd4de5fa8504f7fd) ([OH_Drawing_Bitmap](_drawing.md#ga8ac4e64cd1e2c651d11325e04c72ddeb) \*) | uint32_t
函数用于获取指定位图的高度 | +| [OH_Drawing_BitmapGetPixels](_drawing.md#gaf007f52cfbcbc63cd02971c6480c55fb) ([OH_Drawing_Bitmap](_drawing.md#ga8ac4e64cd1e2c651d11325e04c72ddeb) \*) | void \*
函数用于获取指定位图的像素地址,可以通过像素地址获取到位图的像素数据 | diff --git a/zh-cn/application-dev/reference/native-apis/drawing__brush_8h.md b/zh-cn/application-dev/reference/native-apis/drawing__brush_8h.md new file mode 100644 index 0000000000..6d656d795c --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/drawing__brush_8h.md @@ -0,0 +1,31 @@ +# drawing_brush.h + + +## **Overview** + +**Related Modules:** + +[Drawing](_drawing.md) + +**Description:** + +文件中定义了与画刷相关的功能函数 + +**Since:** +8 +**Version:** +1.0 + +## **Summary** + + +### Functions + + | Function | Description | +| -------- | -------- | +| [OH_Drawing_BrushCreate](_drawing.md#ga75e2193d23cf75878c7b2c78d6b23b35) (void) | [OH_Drawing_Brush](_drawing.md#ga178c83de4a084d35c30e4681319ea711) \*
函数用于创建一个画刷对象 | +| [OH_Drawing_BrushDestroy](_drawing.md#ga9dc1d4aa465d06f2d847feddae1558b5) ([OH_Drawing_Brush](_drawing.md#ga178c83de4a084d35c30e4681319ea711) \*) | void
函数用于销毁画刷对象并回收该对象占有的内存。 | +| [OH_Drawing_BrushIsAntiAlias](_drawing.md#ga4c861e23b8c0a3fb84d906d81bea5335) (const [OH_Drawing_Brush](_drawing.md#ga178c83de4a084d35c30e4681319ea711) \*) | bool
函数用于获取画刷是否设置抗锯齿属性,如果为真则说明画刷会启用抗锯齿功能,在绘制图形时会对图形的边缘像素进行半透明的模糊处理 | +| [OH_Drawing_BrushSetAntiAlias](_drawing.md#ga41735fc7a2776fbe41c77b3f4637e1c5) ([OH_Drawing_Brush](_drawing.md#ga178c83de4a084d35c30e4681319ea711) \*, bool) | void
函数用于设置画刷的抗锯齿属性,设置为真则画刷在绘制图形时会对图形的边缘像素进行半透明的模糊处理 | +| [OH_Drawing_BrushGetColor](_drawing.md#ga29dc1e2442cea7e958a5e037c4cc9f59) (const [OH_Drawing_Brush](_drawing.md#ga178c83de4a084d35c30e4681319ea711) \*) | uint32_t
函数用于获取画刷的颜色属性,颜色属性描述了画刷填充图形时使用的颜色,用一个32位(ARGB)的变量表示 | +| [OH_Drawing_BrushSetColor](_drawing.md#ga4b62aa574623c1a75e14f612a831531b) ([OH_Drawing_Brush](_drawing.md#ga178c83de4a084d35c30e4681319ea711) \*, uint32_t color) | void
函数用于设置画刷的颜色属性,颜色属性描述了画刷填充图形时使用的颜色,用一个32位(ARGB)的变量表示 | diff --git a/zh-cn/application-dev/reference/native-apis/drawing__canvas_8h.md b/zh-cn/application-dev/reference/native-apis/drawing__canvas_8h.md new file mode 100644 index 0000000000..1e68afc0eb --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/drawing__canvas_8h.md @@ -0,0 +1,37 @@ +# drawing_canvas.h + + +## **Overview** + +**Related Modules:** + +[Drawing](_drawing.md) + +**Description:** + +文件中定义了与画布相关的功能函数 + +**Since:** +8 +**Version:** +1.0 + +## **Summary** + + +### Functions + + | Function | Description | +| -------- | -------- | +| [OH_Drawing_CanvasCreate](_drawing.md#ga1bfe881a0b018a982678906f3522d4df) (void) | [OH_Drawing_Canvas](_drawing.md#ga086e2de47ef7bfe6c96e6b09e87da33a) \*
函数用于创建一个画布对象 | +| [OH_Drawing_CanvasDestroy](_drawing.md#ga1a3023ccc48a381cc0b4ae09e2d85c38) ([OH_Drawing_Canvas](_drawing.md#ga086e2de47ef7bfe6c96e6b09e87da33a) \*) | void
函数用于销毁画布对象并回收该对象占有的内存 | +| [OH_Drawing_CanvasBind](_drawing.md#ga666595bb182a5e31733f4144c1515cae) ([OH_Drawing_Canvas](_drawing.md#ga086e2de47ef7bfe6c96e6b09e87da33a) \*, [OH_Drawing_Bitmap](_drawing.md#ga8ac4e64cd1e2c651d11325e04c72ddeb) \*) | void
函数用于将一个位图对象绑定到画布中,使得画布绘制的内容输出到位图中(即CPU渲染) | +| [OH_Drawing_CanvasAttachPen](_drawing.md#gaaec6db563bd7153dc95d0bfab71a4ed1) ([OH_Drawing_Canvas](_drawing.md#ga086e2de47ef7bfe6c96e6b09e87da33a) \*, const [OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) \*) | void
函数用于设置画笔给画布,画布将会使用设置画笔的样式和颜色去绘制图形形状的轮廓 | +| [OH_Drawing_CanvasDetachPen](_drawing.md#ga79321b669f2b5dc0460ca929f00dfc47) ([OH_Drawing_Canvas](_drawing.md#ga086e2de47ef7bfe6c96e6b09e87da33a) \*) | void
函数用于去除掉画布中的画笔,使用后画布将不去绘制图形形状的轮廓 | +| [OH_Drawing_CanvasAttachBrush](_drawing.md#ga1b238c829ea5f2ff627766a3e50feaa6) ([OH_Drawing_Canvas](_drawing.md#ga086e2de47ef7bfe6c96e6b09e87da33a) \*, const [OH_Drawing_Brush](_drawing.md#ga178c83de4a084d35c30e4681319ea711) \*) | void
函数用于设置画刷给画布,画布将会使用设置的画刷样式和颜色去填充绘制的图形形状 | +| [OH_Drawing_CanvasDetachBrush](_drawing.md#ga7a6b5e56d2492b5641b8b3f634b096fe) ([OH_Drawing_Canvas](_drawing.md#ga086e2de47ef7bfe6c96e6b09e87da33a) \*) | void
函数用于去除掉画布中的画刷,使用后画布将不去填充图形形状 | +| [OH_Drawing_CanvasSave](_drawing.md#ga4ebc55405e00ad4b8609303fefc6997a) ([OH_Drawing_Canvas](_drawing.md#ga086e2de47ef7bfe6c96e6b09e87da33a) \*) | void
函数用于保存当前画布的状态(画布矩阵)到一个栈顶 | +| [OH_Drawing_CanvasRestore](_drawing.md#gadd632be64ccc2601def753ecc1e53944) ([OH_Drawing_Canvas](_drawing.md#ga086e2de47ef7bfe6c96e6b09e87da33a) \*) | void
函数用于恢复保存在栈顶的画布状态(画布矩阵) | +| [OH_Drawing_CanvasDrawLine](_drawing.md#gadf6bae5efd20587612596f8e78a16144) ([OH_Drawing_Canvas](_drawing.md#ga086e2de47ef7bfe6c96e6b09e87da33a) \*, float x1, float y1, float x2, float y2) | void
函数用于画一条直线段 | +| [OH_Drawing_CanvasDrawPath](_drawing.md#ga99ebc73abdc27599f4bcc1c1045cb75e) ([OH_Drawing_Canvas](_drawing.md#ga086e2de47ef7bfe6c96e6b09e87da33a) \*, const [OH_Drawing_Path](_drawing.md#gab7e53fc0181099b4a0a3e4a08d3c9023) \*) | void
函数用于画一个自定义路径 | +| [OH_Drawing_CanvasClear](_drawing.md#ga7f07cc6f0b223d9b343c133fbb2503f6) ([OH_Drawing_Canvas](_drawing.md#ga086e2de47ef7bfe6c96e6b09e87da33a) \*, uint32_t color) | void
函数用于使用指定颜色去清空画布 | diff --git a/zh-cn/application-dev/reference/native-apis/drawing__color_8h.md b/zh-cn/application-dev/reference/native-apis/drawing__color_8h.md new file mode 100644 index 0000000000..5f156e5927 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/drawing__color_8h.md @@ -0,0 +1,26 @@ +# drawing_color.h + + +## **Overview** + +**Related Modules:** + +[Drawing](_drawing.md) + +**Description:** + +文件中定义了与颜色相关的功能函数 + +**Since:** +8 +**Version:** +1.0 + +## **Summary** + + +### Functions + + | Function | Description | +| -------- | -------- | +| [OH_Drawing_ColorSetArgb](_drawing.md#ga9137935b970e49ffd813157ebd8bbfb7) (uint32_t alpha, uint32_t red, uint32_t green, uint32_t blue) | uint32_t
函数用于将4个变量(分别描述透明度、红色、绿色和蓝色)转化为一个描述颜色的32位(ARGB)变量 | diff --git a/zh-cn/application-dev/reference/native-apis/drawing__font__collection_8h.md b/zh-cn/application-dev/reference/native-apis/drawing__font__collection_8h.md new file mode 100644 index 0000000000..111f5d88e9 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/drawing__font__collection_8h.md @@ -0,0 +1,27 @@ +# drawing_font_collection.h + + +## **Overview** + +**Related Modules:** + +[Drawing](_drawing.md) + +**Description:** + +定义绘制模块中与fontCollection相关的函数 + +**Since:** +8 +**Version:** +1.0 + +## **Summary** + + +### Functions + + | Function | Description | +| -------- | -------- | +| [OH_Drawing_CreateFontCollection](_drawing.md#gab54c68359a650cde36b82f021f06c814) (void) | [OH_Drawing_FontCollection](_drawing.md#ga4ce31d04a1580d4f50e87b8695fcebc7) \*
创建OH_Drawing_FontCollection | +| [OH_Drawing_DestroyFontCollection](_drawing.md#ga4791ce4ddfaa3545a797c2ce144c819d) ([OH_Drawing_FontCollection](_drawing.md#ga4ce31d04a1580d4f50e87b8695fcebc7) \*) | void
释放被OH_Drawing_FontCollection对象占据的内存 | diff --git a/zh-cn/application-dev/reference/native-apis/drawing__path_8h.md b/zh-cn/application-dev/reference/native-apis/drawing__path_8h.md new file mode 100644 index 0000000000..7f2639ed4d --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/drawing__path_8h.md @@ -0,0 +1,34 @@ +# drawing_path.h + + +## **Overview** + +**Related Modules:** + +[Drawing](_drawing.md) + +**Description:** + +文件中定义了与自定义路径相关的功能函数 + +**Since:** +8 +**Version:** +1.0 + +## **Summary** + + +### Functions + + | Function | Description | +| -------- | -------- | +| [OH_Drawing_PathCreate](_drawing.md#ga379fcebc6b43c3b90e0933d928d7c890) (void) | [OH_Drawing_Path](_drawing.md#gab7e53fc0181099b4a0a3e4a08d3c9023) \*
函数用于创建一个路径对象 | +| [OH_Drawing_PathDestroy](_drawing.md#gaa5961e76fd8d2aacdd1fe94ad354ba51) ([OH_Drawing_Path](_drawing.md#gab7e53fc0181099b4a0a3e4a08d3c9023) \*) | void
函数用于销毁路径对象并回收该对象占有的内存 | +| [OH_Drawing_PathMoveTo](_drawing.md#ga3934f53ce94644feaa79fb96bc7fbcc9) ([OH_Drawing_Path](_drawing.md#gab7e53fc0181099b4a0a3e4a08d3c9023) \*, float x, float y) | void
函数用于设置自定义路径的起始点位置 | +| [OH_Drawing_PathLineTo](_drawing.md#ga4da6ed28d5db091be54af8efe661eb18) ([OH_Drawing_Path](_drawing.md#gab7e53fc0181099b4a0a3e4a08d3c9023) \*, float x, float y) | void
函数用于添加一条从路径的最后点位置到目标点位置的线段 | +| [OH_Drawing_PathArcTo](_drawing.md#ga33c44796dfe8050dad3e6306f66ba0d3) ([OH_Drawing_Path](_drawing.md#gab7e53fc0181099b4a0a3e4a08d3c9023) \*, float x1, float y1, float x2, float y2, float startDeg, float sweepDeg) | void
函数用于给路径添加一段弧线,绘制弧线的方式为角度弧,该方式首先会指定一个矩形边框,矩形边框会包裹椭圆, 然后会指定一个起始角度和扫描度数,从起始角度扫描截取的椭圆周长一部分即为绘制的弧线。另外会默认添加一条从路径的最后点位置到弧线起始点位置的线段 | +| [OH_Drawing_PathQuadTo](_drawing.md#ga5f69a50c045822c5d5d4896bc120318b) ([OH_Drawing_Path](_drawing.md#gab7e53fc0181099b4a0a3e4a08d3c9023) \*, float ctrlX, float ctrlY, float endX, float endY) | void
函数用于添加一条从路径最后点位置到目标点位置的二阶贝塞尔圆滑曲线 | +| [OH_Drawing_PathCubicTo](_drawing.md#ga6a84a20af7911dc504696402c357f1be) ([OH_Drawing_Path](_drawing.md#gab7e53fc0181099b4a0a3e4a08d3c9023) \*, float ctrlX1, float ctrlY1, float ctrlX2, float ctrlY2, float endX, float endY) | void
函数用于添加一条从路径最后点位置到目标点位置的三阶贝塞尔圆滑曲线 | +| [OH_Drawing_PathClose](_drawing.md#ga7a3be11857364cdf2e6ca1af70917816) ([OH_Drawing_Path](_drawing.md#gab7e53fc0181099b4a0a3e4a08d3c9023) \*) | void
函数用于闭合路径,会添加一条从路径起点位置到最后点位置的线段 | +| [OH_Drawing_PathReset](_drawing.md#gaf907c525b05dbd1355d16dc13b4ccda9) ([OH_Drawing_Path](_drawing.md#gab7e53fc0181099b4a0a3e4a08d3c9023) \*) | void
函数用于重置自定义路径数据 | diff --git a/zh-cn/application-dev/reference/native-apis/drawing__pen_8h.md b/zh-cn/application-dev/reference/native-apis/drawing__pen_8h.md new file mode 100644 index 0000000000..2174b6e957 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/drawing__pen_8h.md @@ -0,0 +1,47 @@ +# drawing_pen.h + + +## **Overview** + +**Related Modules:** + +[Drawing](_drawing.md) + +**Description:** + +文件中定义了与画笔相关的功能函数 + +**Since:** +8 +**Version:** +1.0 + +## **Summary** + + +### Enumerations + + | Enumeration Name | Description | +| -------- | -------- | +| [OH_Drawing_PenLineCapStyle](_drawing.md#gafa9d815d933e0fd6aa7549d12080fa8f) { [LINE_FLAT_CAP](_drawing.md#ggafa9d815d933e0fd6aa7549d12080fa8fa99c48cc6172088f1a86e8688e347933a), [LINE_SQUARE_CAP](_drawing.md#ggafa9d815d933e0fd6aa7549d12080fa8fac9929c30114c046b75b844e459f1e69f), [LINE_ROUND_CAP](_drawing.md#ggafa9d815d933e0fd6aa7549d12080fa8fa0efe3fb7b56d7407737c42aebe5b91e5) } | 枚举集合定义了画笔笔帽的样式,即画笔在绘制线段时,在线段头尾端点的样式 | +| [OH_Drawing_PenLineJoinStyle](_drawing.md#gad10001f23f6c42f97a392cba30011460) { [LINE_MITER_JOIN](_drawing.md#ggad10001f23f6c42f97a392cba30011460a126e5fbae0f63b8431d3a6763035d488), [LINE_ROUND_JOIN](_drawing.md#ggad10001f23f6c42f97a392cba30011460aa2bfcc7c744ab7a56c047942060ad3ba), [LINE_BEVEL_JOIN](_drawing.md#ggad10001f23f6c42f97a392cba30011460a8ad7df33f8ff73c5c080fcf159631fde) } | 枚举集合定义了线条转角的样式,即画笔在绘制折线段时,在折线转角处的样式 | + + +### Functions + + | Function | Description | +| -------- | -------- | +| [OH_Drawing_PenCreate](_drawing.md#gae52fe4132b90726d813661750948e2dd) (void) | [OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) \*
函数用于创建一个画笔对象 | +| [OH_Drawing_PenDestroy](_drawing.md#ga907538d02a50836e8033a3f7bf12c80e) ([OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) \*) | void
函数用于销毁画笔对象并回收该对象占有的内存 | +| [OH_Drawing_PenIsAntiAlias](_drawing.md#ga31dee499a3d1dd81e526bcc1dd620961) (const [OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) \*) | bool
函数用于获取画笔是否设置抗锯齿属性,如果为真则说明画笔会启用抗锯齿功能,在绘制图形时会对图形的边缘像素进行半透明的模糊处理 | +| [OH_Drawing_PenSetAntiAlias](_drawing.md#ga93dbc44cf424038a17ae311920550283) ([OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) \*, bool) | void
函数用于设置画笔的抗锯齿属性,设置为真则画笔在绘制图形时会对图形的边缘像素进行半透明的模糊处理 | +| [OH_Drawing_PenGetColor](_drawing.md#ga8a8db886ecf41a729e40a1f760338220) (const [OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) \*) | uint32_t
函数用于获取画笔的颜色属性,颜色属性描述了画笔绘制图形轮廓时使用的颜色,用一个32位(ARGB)的变量表示 | +| [OH_Drawing_PenSetColor](_drawing.md#ga6e5b065f521dd9c41d5e7f2af5c379cb) ([OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) \*, uint32_t color) | void
函数用于设置画笔的颜色属性,颜色属性描述了画笔绘制图形轮廓时使用的颜色,用一个32位(ARGB)的变量表示 | +| [OH_Drawing_PenGetWidth](_drawing.md#ga3d898184f61b685d724e6d272fb12168) (const [OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) \*) | float
函数用于获取画笔的厚度属性,厚度属性描述了画笔绘制图形轮廓的宽度 | +| [OH_Drawing_PenSetWidth](_drawing.md#ga562b5102bf599e640a94e104480df0f4) ([OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) \*, float width) | void
函数用于设置画笔的厚度属性,厚度属性描述了画笔绘制图形轮廓的宽度 | +| [OH_Drawing_PenGetMiterLimit](_drawing.md#ga8f8a512b3930d8883dff59916eaaa72a) (const [OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) \*) | float
函数用于获取折线尖角的限制值,当画笔绘制一条折线,转角类型设置为尖角时,那么此时该属性用于限制出现尖角的长度范围,如果超出则平角显示,不超出依然为尖角 | +| [OH_Drawing_PenSetMiterLimit](_drawing.md#ga73a96e3e9ca95a82f0de2076cb03ffba) ([OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) \*, float miter) | void
函数用于设置折线尖角的限制值,当画笔绘制一条折线,转角类型设置为尖角时,那么此时该属性用于限制出现尖角的长度范围,如果超出则平角显示,不超出依然为尖角 | +| [OH_Drawing_PenGetCap](_drawing.md#ga7db0d5ac28ac24db29fc49c113affc32) (const [OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) \*) | [OH_Drawing_PenLineCapStyle](_drawing.md#gafa9d815d933e0fd6aa7549d12080fa8f)
函数用于获取画笔笔帽的样式 | +| [OH_Drawing_PenSetCap](_drawing.md#gaa0d8f5e75ec5fbc776c4e5e780e29af3) ([OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) \*, [OH_Drawing_PenLineCapStyle](_drawing.md#gafa9d815d933e0fd6aa7549d12080fa8f)) | void
函数用于设置画笔笔帽样式 | +| [OH_Drawing_PenGetJoin](_drawing.md#ga35b26a60ebf70c207f1e8fb8659a9103) (const [OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) \*) | [OH_Drawing_PenLineJoinStyle](_drawing.md#gad10001f23f6c42f97a392cba30011460)
函数用于获取画笔绘制折线转角的样式 | +| [OH_Drawing_PenSetJoin](_drawing.md#ga65e9826c39a847b22825e99af65afbb7) ([OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) \*, [OH_Drawing_PenLineJoinStyle](_drawing.md#gad10001f23f6c42f97a392cba30011460)) | void
函数用于设置画笔绘制转角的样式 | diff --git a/zh-cn/application-dev/reference/native-apis/drawing__text__declaration_8h.md b/zh-cn/application-dev/reference/native-apis/drawing__text__declaration_8h.md new file mode 100644 index 0000000000..873019b493 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/drawing__text__declaration_8h.md @@ -0,0 +1,30 @@ +# drawing_text_declaration.h + + +## **Overview** + +**Related Modules:** + +[Drawing](_drawing.md) + +**Description:** + +提供2d drawing文本相关的数据结构声明 + +**Since:** +8 +**Version:** +1.0 + +## **Summary** + + +### Typedefs + + | Typedef Name | Description | +| -------- | -------- | +| [OH_Drawing_FontCollection](_drawing.md#ga4ce31d04a1580d4f50e87b8695fcebc7) | typedef struct [OH_Drawing_FontCollection](_drawing.md#ga4ce31d04a1580d4f50e87b8695fcebc7)
OH_Drawing_FontCollection用于加载字体 | +| [OH_Drawing_Typography](_drawing.md#ga70d06422fc84eb1ba49e35f525573007) | typedef struct [OH_Drawing_Typography](_drawing.md#ga70d06422fc84eb1ba49e35f525573007)
OH_Drawing_Typography用于管理排版的布局和显示等 | +| [OH_Drawing_TextStyle](_drawing.md#gad731266accf168a6b50e1fa33ce90528) | typedef struct [OH_Drawing_TextStyle](_drawing.md#gad731266accf168a6b50e1fa33ce90528)
OH_Drawing_TextStyle用于管理字体颜色、装饰等 | +| [OH_Drawing_TypographyStyle](_drawing.md#ga270cc54313a929ea90235840668daef9) | typedef struct [OH_Drawing_TypographyStyle](_drawing.md#ga270cc54313a929ea90235840668daef9)
OH_Drawing_TypographyStyle用于管理排版风格,如文字方向等 | +| [OH_Drawing_TypographyCreate](_drawing.md#gaedefc2b3d226b0b07abcbce76be4cdb9) | typedef struct [OH_Drawing_TypographyCreate](_drawing.md#gaedefc2b3d226b0b07abcbce76be4cdb9)
OH_Drawing_TypographyCreate用于创建OH_Drawing_Typography. | diff --git a/zh-cn/application-dev/reference/native-apis/drawing__text__typography_8h.md b/zh-cn/application-dev/reference/native-apis/drawing__text__typography_8h.md new file mode 100644 index 0000000000..193e657f5d --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/drawing__text__typography_8h.md @@ -0,0 +1,63 @@ +# drawing_text_typography.h + + +## **Overview** + +**Related Modules:** + +[Drawing](_drawing.md) + +**Description:** + +定义绘制模块中排版相关的函数 + +**Since:** +8 +**Version:** +1.0 + +## **Summary** + + +### Enumerations + + | Enumeration Name | Description | +| -------- | -------- | +| [OH_Drawing_TextDirection](_drawing.md#ga7dc9803407c3fea32075122c7605ffb2) { [TEXT_DIRECTION_RTL](_drawing.md#gga7dc9803407c3fea32075122c7605ffb2a7b4debd0a116bc438085a43efa3824cf), [TEXT_DIRECTION_LTR](_drawing.md#gga7dc9803407c3fea32075122c7605ffb2a81d702a35ec4d3482ea5ff10edd8cab7) } | 文字方向 | +| [OH_Drawing_TextAlign](_drawing.md#ga3fee1a3916c2376e62e7957be15a1b02) {   [TEXT_ALIGN_LEFT](_drawing.md#gga3fee1a3916c2376e62e7957be15a1b02a3b85bc4d8cfda6b273b534eb2e1cebfc), [TEXT_ALIGN_RIGHT](_drawing.md#gga3fee1a3916c2376e62e7957be15a1b02abc81ce8623a972fc7b97f497189c494b), [TEXT_ALIGN_CENTER](_drawing.md#gga3fee1a3916c2376e62e7957be15a1b02a4da3c85cde615e7442df8ef17d0753ba), [TEXT_ALIGN_JUSTIFY](_drawing.md#gga3fee1a3916c2376e62e7957be15a1b02a3e3185762a0ae703ae1eab769eb3191d),   [TEXT_ALIGN_START](_drawing.md#gga3fee1a3916c2376e62e7957be15a1b02a72f2441e221a61374bd891dc2b75bcb0), [TEXT_ALIGN_END](_drawing.md#gga3fee1a3916c2376e62e7957be15a1b02a17b99fff762deffd75c0de66cd27d219) } | 文字对齐方式 | +| [OH_Drawing_FontWeight](_drawing.md#ga7a1d4dd0ce9dd97bf3bbbad3b87f7f21) {   [FONT_WEIGHT_100](_drawing.md#gga7a1d4dd0ce9dd97bf3bbbad3b87f7f21a23b26a36963095342fe2e0697910a6e6), [FONT_WEIGHT_200](_drawing.md#gga7a1d4dd0ce9dd97bf3bbbad3b87f7f21a4f29ce93f64a0085ca2154ee25d9e138), [FONT_WEIGHT_300](_drawing.md#gga7a1d4dd0ce9dd97bf3bbbad3b87f7f21a093d1106fec67eebea0dbcb2ebbe9a64), [FONT_WEIGHT_400](_drawing.md#gga7a1d4dd0ce9dd97bf3bbbad3b87f7f21a62367da70683540c34ddaf2a519f22a3),   [FONT_WEIGHT_500](_drawing.md#gga7a1d4dd0ce9dd97bf3bbbad3b87f7f21aef238378a2c00c698e269b052d31d904), [FONT_WEIGHT_600](_drawing.md#gga7a1d4dd0ce9dd97bf3bbbad3b87f7f21a63eebceda71bb1ffdae4a5503d63bbd9), [FONT_WEIGHT_700](_drawing.md#gga7a1d4dd0ce9dd97bf3bbbad3b87f7f21ae6abaa1dc57d487006cbe6c8e0f87bc6), [FONT_WEIGHT_800](_drawing.md#gga7a1d4dd0ce9dd97bf3bbbad3b87f7f21ad34b21ce514a03d6d98b75341bb5726e),   [FONT_WEIGHT_900](_drawing.md#gga7a1d4dd0ce9dd97bf3bbbad3b87f7f21ac3f4c8f2d6a6922780166cc08df83461) } | 字重 | +| [OH_Drawing_TextBaseline](_drawing.md#ga23be0106a439e7498cbbb1d048733ec5) { [TEXT_BASELINE_ALPHABETIC](_drawing.md#gga23be0106a439e7498cbbb1d048733ec5ad436b9da96a5246e75e785a0585963f9), [TEXT_BASELINE_IDEOGRAPHIC](_drawing.md#gga23be0106a439e7498cbbb1d048733ec5a723ba0ba56cd7106deb97c95f51febcf) } | 基线位置 | +| [OH_Drawing_TextDecoration](_drawing.md#ga11b405dddb93d91c3a5b4482d8a9165b) { [TEXT_DECORATION_NONE](_drawing.md#gga11b405dddb93d91c3a5b4482d8a9165ba2b42614c2c9b73ffecf31769cfd60f28) = 0x0, [TEXT_DECORATION_UNDERLINE](_drawing.md#gga11b405dddb93d91c3a5b4482d8a9165ba0fc17108b6c8a91d840889336c669dda) = 0x1, [TEXT_DECORATION_OVERLINE](_drawing.md#gga11b405dddb93d91c3a5b4482d8a9165bad8415c121f9b656cd5c6cab927d78802) = 0x2, [TEXT_DECORATION_LINE_THROUGH](_drawing.md#gga11b405dddb93d91c3a5b4482d8a9165ba25692d42e0a907af878d99a0a31f7f47) = 0x4 } | 文本装饰 | +| [OH_Drawing_FontStyle](_drawing.md#ga9cd0177d2561ccef51adbae0f8a42eec) { [FONT_STYLE_NORMAL](_drawing.md#gga9cd0177d2561ccef51adbae0f8a42eeca307e676fb5de5c785e856272b2f0e8ce), [FONT_STYLE_ITALIC](_drawing.md#gga9cd0177d2561ccef51adbae0f8a42eeca6054e24016c46486668dd42e4b86c036) } | 区分字体是否为斜体 | + + +### Functions + + | Function | Description | +| -------- | -------- | +| [OH_Drawing_CreateTypographyStyle](_drawing.md#ga19561093a2d5ec17f2c73b40f0d97376) (void) | [OH_Drawing_TypographyStyle](_drawing.md#ga270cc54313a929ea90235840668daef9) \*
创建OH_Drawing_TypographyStyle | +| [OH_Drawing_DestroyTypographyStyle](_drawing.md#ga9bd838c0d86136e16faca0ada643d87e) ([OH_Drawing_TypographyStyle](_drawing.md#ga270cc54313a929ea90235840668daef9) \*) | void
释放被OH_Drawing_TypographyStyle对象占据的内存 | +| [OH_Drawing_SetTypographyTextDirection](_drawing.md#ga9e96b89ffc3f06f50ab38f05689e766e) ([OH_Drawing_TypographyStyle](_drawing.md#ga270cc54313a929ea90235840668daef9) \*, int) | void
设置文本方向 | +| [OH_Drawing_SetTypographyTextAlign](_drawing.md#gaa1a8b20a882ae6aa4e2ad442a18423da) ([OH_Drawing_TypographyStyle](_drawing.md#ga270cc54313a929ea90235840668daef9) \*, int) | void
设置文本对齐方式 | +| [OH_Drawing_SetTypographyTextMaxLines](_drawing.md#gab74fd8ef23005bf584f87357147fa379) ([OH_Drawing_TypographyStyle](_drawing.md#ga270cc54313a929ea90235840668daef9) \*, int) | void
设置文本最大行数 | +| [OH_Drawing_CreateTextStyle](_drawing.md#ga9041c35231647ed34306ef26f21037f9) (void) | [OH_Drawing_TextStyle](_drawing.md#gad731266accf168a6b50e1fa33ce90528) \*
创建OH_Drawing_TextStyle | +| [OH_Drawing_DestroyTextStyle](_drawing.md#ga2550946ac8d3c8c9ddc548e128175020) ([OH_Drawing_TextStyle](_drawing.md#gad731266accf168a6b50e1fa33ce90528) \*) | void
释放被OH_Drawing_TextStyle对象占据的内存 | +| [OH_Drawing_SetTextStyleColor](_drawing.md#ga4c03826dd970defade08b67ed1861fc8) ([OH_Drawing_TextStyle](_drawing.md#gad731266accf168a6b50e1fa33ce90528) \*, uint32_t) | void
设置文本颜色 | +| [OH_Drawing_SetTextStyleFontSize](_drawing.md#ga4f435be1d8b20bd0abac441ac91bb81d) ([OH_Drawing_TextStyle](_drawing.md#gad731266accf168a6b50e1fa33ce90528) \*, double) | void
设置字号 | +| [OH_Drawing_SetTextStyleFontWeight](_drawing.md#ga751dd287f984367c18de6ca3a3a304ec) ([OH_Drawing_TextStyle](_drawing.md#gad731266accf168a6b50e1fa33ce90528) \*, int) | void
设置字重 | +| [OH_Drawing_SetTextStyleBaseLine](_drawing.md#gacb93fa7c791e719cf9c5d218981f61ee) ([OH_Drawing_TextStyle](_drawing.md#gad731266accf168a6b50e1fa33ce90528) \*, int) | void
设置字体基线位置 | +| [OH_Drawing_SetTextStyleDecoration](_drawing.md#ga2f029e23749fcd121aaae6e233202ded) ([OH_Drawing_TextStyle](_drawing.md#gad731266accf168a6b50e1fa33ce90528) \*, int) | void
设置装饰 | +| [OH_Drawing_SetTextStyleDecorationColor](_drawing.md#ga22304942171ce4548b50057bd7d606be) ([OH_Drawing_TextStyle](_drawing.md#gad731266accf168a6b50e1fa33ce90528) \*, uint32_t) | void
设置装饰颜色 | +| [OH_Drawing_SetTextStyleFontHeight](_drawing.md#gab96b5567c05f34e6ba7d48a4dd75eab4) ([OH_Drawing_TextStyle](_drawing.md#gad731266accf168a6b50e1fa33ce90528) \*, double) | void
设置字体高度 | +| [OH_Drawing_SetTextStyleFontFamilies](_drawing.md#ga3f46d90176575f24040828264ce18a90) ([OH_Drawing_TextStyle](_drawing.md#gad731266accf168a6b50e1fa33ce90528) \*, int, const char \*fontFamilies[]) | void
设置字体类型 | +| [OH_Drawing_SetTextStyleFontStyle](_drawing.md#ga67afa0910007fa3d8b15f2b6df61712c) ([OH_Drawing_TextStyle](_drawing.md#gad731266accf168a6b50e1fa33ce90528) \*, int) | void
设置字体风格 | +| [OH_Drawing_SetTextStyleLocale](_drawing.md#ga7eb6f2da34059c013cfb0567c44813d4) ([OH_Drawing_TextStyle](_drawing.md#gad731266accf168a6b50e1fa33ce90528) \*, const char \*) | void
设置语言区域 | +| [OH_Drawing_CreateTypographyHandler](_drawing.md#gae72088abf73419c0c8e8e524602a317e) ([OH_Drawing_TypographyStyle](_drawing.md#ga270cc54313a929ea90235840668daef9) \*, [OH_Drawing_FontCollection](_drawing.md#ga4ce31d04a1580d4f50e87b8695fcebc7) \*) | [OH_Drawing_TypographyCreate](_drawing.md#gaedefc2b3d226b0b07abcbce76be4cdb9) \*
创建指向OH_Drawing_TypographyCreate对象的指针 | +| [OH_Drawing_DestroyTypographyHandler](_drawing.md#ga211dced7f1eaed0c5bd507cd75d003c8) ([OH_Drawing_TypographyCreate](_drawing.md#gaedefc2b3d226b0b07abcbce76be4cdb9) \*) | void
释放被OH_Drawing_TypographyCreate对象占据的内存 | +| [OH_Drawing_TypographyHandlerPushStyle](_drawing.md#ga5aff793cec1b58c171817649b01f35d1) ([OH_Drawing_TypographyCreate](_drawing.md#gaedefc2b3d226b0b07abcbce76be4cdb9) \*, [OH_Drawing_TextStyle](_drawing.md#gad731266accf168a6b50e1fa33ce90528) \*) | void
设置排版风格 | +| [OH_Drawing_TypographyHandlerAddText](_drawing.md#ga0bb4f9730faa77f6ed8cdce25e7965f2) ([OH_Drawing_TypographyCreate](_drawing.md#gaedefc2b3d226b0b07abcbce76be4cdb9) \*, const char \*) | void
设置文本内容 | +| [OH_Drawing_TypographyHandlerPop](_drawing.md#gabe9b81431e1a7ca473fc0659c150bb6b) ([OH_Drawing_TypographyCreate](_drawing.md#gaedefc2b3d226b0b07abcbce76be4cdb9) \*) | void
排版弹出 | +| [OH_Drawing_CreateTypography](_drawing.md#gaf996ac9db09b8d7c21b8ea4797ea0c19) ([OH_Drawing_TypographyCreate](_drawing.md#gaedefc2b3d226b0b07abcbce76be4cdb9) \*) | [OH_Drawing_Typography](_drawing.md#ga70d06422fc84eb1ba49e35f525573007) \*
创建OH_Drawing_Typography | +| [OH_Drawing_DestroyTypography](_drawing.md#ga2d0d1b715931c104042c75e4d21a86a3) ([OH_Drawing_Typography](_drawing.md#ga70d06422fc84eb1ba49e35f525573007) \*) | void
释放OH_Drawing_Typography对象占据的内存 | +| [OH_Drawing_TypographyLayout](_drawing.md#ga9032552c1d8d8e258f86832190223843) ([OH_Drawing_Typography](_drawing.md#ga70d06422fc84eb1ba49e35f525573007) \*, double) | void
排版布局 | +| [OH_Drawing_TypographyPaint](_drawing.md#ga8b12b7dc251b3a2bb71f7e289a27e174) ([OH_Drawing_Typography](_drawing.md#ga70d06422fc84eb1ba49e35f525573007) \*, [OH_Drawing_Canvas](_drawing.md#ga086e2de47ef7bfe6c96e6b09e87da33a) \*, double, double) | void
显示文本 | diff --git a/zh-cn/application-dev/reference/native-apis/drawing__types_8h.md b/zh-cn/application-dev/reference/native-apis/drawing__types_8h.md new file mode 100644 index 0000000000..b17a49f042 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/drawing__types_8h.md @@ -0,0 +1,38 @@ +# drawing_types.h + + +## **Overview** + +**Related Modules:** + +[Drawing](_drawing.md) + +**Description:** + +文件中定义了用于绘制2d图形的数据类型,包括画布、画笔、画刷、位图和路径 + +**Since:** +8 +**Version:** +1.0 + +## **Summary** + + +### Typedefs + + | Typedef Name | Description | +| -------- | -------- | +| [OH_Drawing_Canvas](_drawing.md#ga086e2de47ef7bfe6c96e6b09e87da33a) | typedef struct [OH_Drawing_Canvas](_drawing.md#ga086e2de47ef7bfe6c96e6b09e87da33a)
OH_Drawing_Canvas定义为一块矩形的画布,可以结合画笔和画刷在上面绘制各种形状、图片和文字 | +| [OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2) | typedef struct [OH_Drawing_Pen](_drawing.md#ga88e73d9d7b62e6113237fc0f828910d2)
OH_Drawing_Pen定义为画笔,画笔用于描述绘制图形轮廓的样式和颜色 | +| [OH_Drawing_Brush](_drawing.md#ga178c83de4a084d35c30e4681319ea711) | typedef struct [OH_Drawing_Brush](_drawing.md#ga178c83de4a084d35c30e4681319ea711)
OH_Drawing_Brush定义为画刷,画刷用于描述填充图形的样式和颜色 | +| [OH_Drawing_Path](_drawing.md#gab7e53fc0181099b4a0a3e4a08d3c9023) | typedef struct [OH_Drawing_Path](_drawing.md#gab7e53fc0181099b4a0a3e4a08d3c9023)
OH_Drawing_Path定义为路径,路径用于自定义各种形状 | +| [OH_Drawing_Bitmap](_drawing.md#ga8ac4e64cd1e2c651d11325e04c72ddeb) | typedef struct [OH_Drawing_Bitmap](_drawing.md#ga8ac4e64cd1e2c651d11325e04c72ddeb)
OH_Drawing_Bitmap定义为位图,位图是一块内存,内存中包含了描述一张图片的像素数据 | + + +### Enumerations + + | Enumeration Name | Description | +| -------- | -------- | +| [OH_Drawing_ColorFormat](_drawing.md#ga6a37fff6c3e0b0d9d81b01755ef846db) {   [COLOR_FORMAT_UNKNOWN](_drawing.md#gga6a37fff6c3e0b0d9d81b01755ef846dbab58141bf00d632ba06094d3c4b6446c2), [COLOR_FORMAT_ALPHA_8](_drawing.md#gga6a37fff6c3e0b0d9d81b01755ef846dbabe54d848a7de45ac9a9a89a6eb6a1886), [COLOR_FORMAT_RGB_565](_drawing.md#gga6a37fff6c3e0b0d9d81b01755ef846dbabc7b2f524d90d876ad222dd595c287d9), [COLOR_FORMAT_ARGB_4444](_drawing.md#gga6a37fff6c3e0b0d9d81b01755ef846dba3dac16f10989bdacb479e7fcd9b8861e),   [COLOR_FORMAT_RGBA_8888](_drawing.md#gga6a37fff6c3e0b0d9d81b01755ef846dba3b1984f6b8b6fe5f5d65215c95e80ac2), [COLOR_FORMAT_BGRA_8888](_drawing.md#gga6a37fff6c3e0b0d9d81b01755ef846dba44017098e353684bc3bbd2cd0878df15) } | OH_Drawing_ColorFormat用于描述位图像素的存储格式 | +| [OH_Drawing_AlphaFormat](_drawing.md#gac4dc831be312bb0a7a4745448f4407d3) { [ALPHA_FORMAT_UNKNOWN](_drawing.md#ggac4dc831be312bb0a7a4745448f4407d3ac7e2536628ce62acfc14ec2538425a4a), [ALPHA_FORMAT_OPAQUE](_drawing.md#ggac4dc831be312bb0a7a4745448f4407d3abd3d60c5f30c90748393276a5845f662), [ALPHA_FORMAT_PREMUL](_drawing.md#ggac4dc831be312bb0a7a4745448f4407d3ac0ad416cd779ddc62466d6dceb9a757f), [ALPHA_FORMAT_UNPREMUL](_drawing.md#ggac4dc831be312bb0a7a4745448f4407d3a0b8120300ddca06e3d5db79bfad59a32) } | OH_Drawing_AlphaFormat用于描述位图像素的透明度分量 | diff --git a/zh-cn/application-dev/reference/native-apis/external__window_8h.md b/zh-cn/application-dev/reference/native-apis/external__window_8h.md new file mode 100644 index 0000000000..bbfe0b179a --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/external__window_8h.md @@ -0,0 +1,37 @@ +# external_window.h + + +## **Overview** + +**Related Modules:** + +[NativeWindow](_native_window.md) + +**Description:** + +定义获取和使用NativeWindow的相关函数 + +**Since:** +8 +**Version:** +1.0 + +## **Summary** + + +### Functions + + | Function | Description | +| -------- | -------- | +| [OH_NativeWindow_CreateNativeWindowFromSurface](_native_window.md#ga4225dd025093bc610670c2b517f186c2) (void \*pSurface) | struct NativeWindow \*
创建NativeWindow实例,每次调用都会产生一个新的NativeWindow实例 | +| [OH_NativeWindow_DestroyNativeWindow](_native_window.md#ga1ca5f2e39a03b6546352ac90be19238d) (struct NativeWindow \*window) | void
将NativeWindow对象的引用计数减1,当引用计数为0的时候,该NativeWindow对象会被析构掉 | +| [OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer](_native_window.md#gaec1b04ace16a364d79b7d54cf917e6f5) (void \*pSurfaceBuffer) | struct NativeWindowBuffer \*
创建NativeWindowBuffer实例,每次调用都会产生一个新的NativeWindowBuffer实例 | +| [OH_NativeWindow_DestroyNativeWindowBuffer](_native_window.md#gafa11a7f9a36b2e6962cc34790eb1e87e) (struct NativeWindowBuffer \*buffer) | void
将NativeWindowBuffer对象的引用计数减1,当引用计数为0的时候,该NativeWindowBuffer对象会被析构掉 | +| [OH_NativeWindow_NativeWindowRequestBuffer](_native_window.md#ga80cad8d3c2863294f828caa4d3422c2c) (struct NativeWindow \*window, struct NativeWindowBuffer \*\*buffer, int \*fenceFd) | int32_t
通过NativeWindow对象申请一块NativeWindowBuffer,用以内容生产 | +| [OH_NativeWindow_NativeWindowFlushBuffer](_native_window.md#ga8489a6525b5c9f7a6b52aafba07fb777) (struct NativeWindow \*window, struct NativeWindowBuffer \*buffer, int fenceFd, Region region) | int32_t
通过NativeWindow将生产好内容的NativeWindowBuffer放回到Buffer队列中,用以内容消费 | +| [OH_NativeWindow_NativeWindowCancelBuffer](_native_window.md#gad7b6ffa8b402f5be0bf6e742b18f03d0) (struct NativeWindow \*window, struct NativeWindowBuffer \*buffer) | int32_t
通过NativeWindow将之前申请出来的NativeWindowBuffer返还到Buffer队列中,供下次再申请 | +| [OH_NativeWindow_NativeWindowHandleOpt](_native_window.md#ga5620fba277d2f086da6c6d7434c09253) (struct NativeWindow \*window, int code,...) | int32_t
设置/获取NativeWindow的属性,包括设置/获取宽高、内容格式等 | +| [OH_NativeWindow_GetBufferHandleFromNative](_native_window.md#ga28c34ab9b0751010cb716ca9acd6dfef) (struct NativeWindowBuffer \*buffer) | BufferHandle \*
通过NativeWindowBuffer获取该buffer的BufferHandle指针 | +| [OH_NativeWindow_NativeObjectReference](_native_window.md#gafcbd7894c5cdae431e591028c5f7f709) (void \*obj) | int32_t
增加一个NativeObject的引用计数 | +| [OH_NativeWindow_NativeObjectUnreference](_native_window.md#ga24567fa7daee679bf927623adac93a9f) (void \*obj) | int32_t
减少一个NativeObject的引用计数,当引用计数减少为0时,该NativeObject将被析构掉 | +| [OH_NativeWindow_GetNativeObjectMagic](_native_window.md#ga93828d364eebf3ec5c81d7897757f9f2) (void \*obj) | int32_t
获取NativeObject的MagicId | diff --git a/zh-cn/application-dev/reference/native-apis/files.md b/zh-cn/application-dev/reference/native-apis/files.md new file mode 100644 index 0000000000..f4beb38e74 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/files.md @@ -0,0 +1,35 @@ +# 头文件 + + + +- **[drawing_bitmap.h](drawing__bitmap_8h.md)** + +- **[drawing_brush.h](drawing__brush_8h.md)** + +- **[drawing_canvas.h](drawing__canvas_8h.md)** + +- **[drawing_color.h](drawing__color_8h.md)** + +- **[drawing_font_collection.h](drawing__font__collection_8h.md)** + +- **[drawing_path.h](drawing__path_8h.md)** + +- **[drawing_pen.h](drawing__pen_8h.md)** + +- **[drawing_text_declaration.h](drawing__text__declaration_8h.md)** + +- **[drawing_text_typography.h](drawing__text__typography_8h.md)** + +- **[drawing_types.h](drawing__types_8h.md)** + +- **[external_window.h](external__window_8h.md)** + +- **[log.h](log_8h.md)** + +- **[native_interface_bundle.h](native__interface__bundle_8h.md)** + +- **[native_interface_xcomponent.h](native__interface__xcomponent_8h.md)** + +- **[raw_dir.h](raw__dir_8h.md)** + +- **[raw_file.h](raw__file_8h.md)** \ No newline at end of file diff --git a/zh-cn/application-dev/reference/native-apis/index.md b/zh-cn/application-dev/reference/native-apis/index.md new file mode 100644 index 0000000000..f04f11fd3b --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/index.md @@ -0,0 +1,15 @@ +# MyProject + + + +- **[Native XComponent](_o_h___native_x_component.md)** + +- **[Native_Bundle](_native___bundle.md)** + +- **[HiLog](_hi_log.md)** + +- **[NativeWindow](_native_window.md)** + +- **[Drawing](_drawing.md)** + +- **[Rawfile](rawfile.md)** \ No newline at end of file diff --git a/zh-cn/application-dev/reference/native-apis/log_8h.md b/zh-cn/application-dev/reference/native-apis/log_8h.md new file mode 100644 index 0000000000..2eea0fb831 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/log_8h.md @@ -0,0 +1,48 @@ +# log.h + + +## **Overview** + +**Related Modules:** + +[HiLog](_hi_log.md) + +**Description:** + +HiLog模块日志接口定义,通过这些接口实现日志打印相关功能。 + +用户输出日志时,先定义日志所属业务领域、日志TAG,然后按照类型、级别选择对应API,指定参数隐私标识输出日志内容。 业务领域:指定日志所对应的业务领域,用户自定义使用,用于标识业务的子系统、模块。16进制整数,范围0x0~0xFFFF。 日志TAG:字符串常量,用于标识调用所在的类或者业务。 日志级别:DEBUG、INFO、WARN、ERROR、FATAL。 参数格式:类printf的方式,包括格式字符串(包括参数类型标识)和变参。 隐私参数标识:在格式字符串每个参数中符号后类型前增加{public}、{private}标识。注意:每个参数未指定隐私标识时,缺省为隐私。 使用示例: 定义业务领域、TAG: \#define LOG_DOMAIN 0x0201 \#define LOG_TAG "MY_TAG" 日志打印: HILOG_WARN([LOG_APP](_hi_log.md#ggaf67907baa897e9fb84df0cb89795b87ca84f0546432a39b6f5e8a777d5cf667b5), "Failed to visit %{private}s, reason:%{public}d.", url, errno); 结果输出: 05-06 15:01:06.870 1051 1051 W 0201/MY_TAG: Failed to visit <private>, reason:503. + +**Since:** +8 + +## **Summary** + + +### Macros + + | Macro Name and Value | Description | +| -------- | -------- | +| [LOG_DOMAIN](_hi_log.md#ga95a1d08c807e0aada863b5298a61d08d)   0 | 日志所对应的业务领域,用于标识业务的子系统、模块。 | +| [LOG_TAG](_hi_log.md#ga7ce0df38eb467e59f209470c8f5ac4e6)   NULL | 字符串常量,标识调用所在的类或者业务。 | +| [OH_LOG_DEBUG](_hi_log.md#gac9b9319de06bce0df57ef440ccaa25fc)(type, ...)   ((void)[OH_LOG_Print](_hi_log.md#gaed4b343058326b7f5dbcac6799025946)((type), [LOG_DEBUG](_hi_log.md#ggaca1fd1d8935433e6ba2e3918214e07f9ab9f002c6ffbfd511da8090213227454e), [LOG_DOMAIN](_hi_log.md#ga95a1d08c807e0aada863b5298a61d08d), [LOG_TAG](_hi_log.md#ga7ce0df38eb467e59f209470c8f5ac4e6), __VA_ARGS__)) | DEBUG级别写日志,宏封装接口。 | +| [OH_LOG_INFO](_hi_log.md#gadf3fd661bccb575348c5109a0f24f252)(type, ...)   ((void)[OH_LOG_Print](_hi_log.md#gaed4b343058326b7f5dbcac6799025946)((type), [LOG_INFO](_hi_log.md#ggaca1fd1d8935433e6ba2e3918214e07f9a6e98ff471e3ce6c4ef2d75c37ee51837), [LOG_DOMAIN](_hi_log.md#ga95a1d08c807e0aada863b5298a61d08d), [LOG_TAG](_hi_log.md#ga7ce0df38eb467e59f209470c8f5ac4e6), __VA_ARGS__)) | INFO级别写日志,宏封装接口。 | +| [OH_LOG_WARN](_hi_log.md#ga1beaeee414c2e0238db4c57212809737)(type, ...)   ((void)[OH_LOG_Print](_hi_log.md#gaed4b343058326b7f5dbcac6799025946)((type), [LOG_WARN](_hi_log.md#ggaca1fd1d8935433e6ba2e3918214e07f9ac8041ffa22bc823d4726701cdb13fc13), [LOG_DOMAIN](_hi_log.md#ga95a1d08c807e0aada863b5298a61d08d), [LOG_TAG](_hi_log.md#ga7ce0df38eb467e59f209470c8f5ac4e6), __VA_ARGS__)) | WARN级别写日志,宏封装接口。 | +| [OH_LOG_ERROR](_hi_log.md#gab7e62682d195ee81093e7e08673c4941)(type, ...)   ((void)[OH_LOG_Print](_hi_log.md#gaed4b343058326b7f5dbcac6799025946)((type), [LOG_ERROR](_hi_log.md#ggaca1fd1d8935433e6ba2e3918214e07f9a230506cce5c68c3bac5a821c42ed3473), [LOG_DOMAIN](_hi_log.md#ga95a1d08c807e0aada863b5298a61d08d), [LOG_TAG](_hi_log.md#ga7ce0df38eb467e59f209470c8f5ac4e6), __VA_ARGS__)) | ERROR级别写日志,宏封装接口。 | +| [OH_LOG_FATAL](_hi_log.md#ga17370605a946403e37024ea898d27f55)(type, ...)   ((void)HiLogPrint((type), [LOG_FATAL](_hi_log.md#ggaca1fd1d8935433e6ba2e3918214e07f9ac630750884d91cb9767ef2200bbb048b), [LOG_DOMAIN](_hi_log.md#ga95a1d08c807e0aada863b5298a61d08d), [LOG_TAG](_hi_log.md#ga7ce0df38eb467e59f209470c8f5ac4e6), __VA_ARGS__)) | FATAL级别写日志,宏封装接口。 | + + +### Enumerations + + | Enumeration Name | Description | +| -------- | -------- | +| [LogType](_hi_log.md#gaf67907baa897e9fb84df0cb89795b87c) { [LOG_APP](_hi_log.md#ggaf67907baa897e9fb84df0cb89795b87ca84f0546432a39b6f5e8a777d5cf667b5) = 0 } | 日志类型。 | +| [LogLevel](_hi_log.md#gaca1fd1d8935433e6ba2e3918214e07f9) {   [LOG_DEBUG](_hi_log.md#ggaca1fd1d8935433e6ba2e3918214e07f9ab9f002c6ffbfd511da8090213227454e) = 3, [LOG_INFO](_hi_log.md#ggaca1fd1d8935433e6ba2e3918214e07f9a6e98ff471e3ce6c4ef2d75c37ee51837) = 4, [LOG_WARN](_hi_log.md#ggaca1fd1d8935433e6ba2e3918214e07f9ac8041ffa22bc823d4726701cdb13fc13) = 5, [LOG_ERROR](_hi_log.md#ggaca1fd1d8935433e6ba2e3918214e07f9a230506cce5c68c3bac5a821c42ed3473) = 6,   [LOG_FATAL](_hi_log.md#ggaca1fd1d8935433e6ba2e3918214e07f9ac630750884d91cb9767ef2200bbb048b) = 7 } | 日志级别。 | + + +### Functions + + | Function | Description | +| -------- | -------- | +| [OH_LOG_Print](_hi_log.md#gaed4b343058326b7f5dbcac6799025946) ([LogType](_hi_log.md#gaf67907baa897e9fb84df0cb89795b87c) type, [LogLevel](_hi_log.md#gaca1fd1d8935433e6ba2e3918214e07f9) level, unsigned int domain, const char \*tag, const char \*fmt,...) __attribute__((__format__(os_log | int
写日志接口。 | +| [OH_LOG_IsLoggable](_hi_log.md#gabba82e8c08cf8941e4af54941eeda257) (unsigned int domain, const char \*tag, [LogLevel](_hi_log.md#gaca1fd1d8935433e6ba2e3918214e07f9) level) | int bool
检查指定业务领域、TAG、级别的日志是否可以打印。 | diff --git a/zh-cn/application-dev/reference/native-apis/native__interface__bundle_8h.md b/zh-cn/application-dev/reference/native-apis/native__interface__bundle_8h.md new file mode 100644 index 0000000000..f1ce9e4227 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/native__interface__bundle_8h.md @@ -0,0 +1,26 @@ +# native_interface_bundle.h + + +## **Overview** + +**Related Modules:** + +[Native_Bundle](_native___bundle.md) + +**Description:** + +Declares the **Bundle**-specific function, including function for obtaining application ID. + +**Since:** +9 +**Version:** +1.0 + +## **Summary** + + +### Functions + + | Function | Description | +| -------- | -------- | +| [OH_NativeBundle_GetAppIdByBundleName](_native___bundle.md#gaa407fb88995597480c5584cce1fb14bd) (const char \*bundleName) | char \*
Obtains the application ID based on the given bundle name. | diff --git a/zh-cn/application-dev/reference/native-apis/native__interface__xcomponent_8h.md b/zh-cn/application-dev/reference/native-apis/native__interface__xcomponent_8h.md new file mode 100644 index 0000000000..ba93772b7a --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/native__interface__xcomponent_8h.md @@ -0,0 +1,62 @@ +# native_interface_xcomponent.h + + +## **Overview** + +**Related Modules:** + +[Native XComponent](_o_h___native_x_component.md) + +**Description:** + +Declares APIs for accessing a Native XComponent. + +**Since:** +8 +**Version:** +1.0 + +## **Summary** + + +### Classes + + | Classe Name | Description | +| -------- | -------- | +| [OH_NativeXComponent_TouchPoint](_o_h___native_x_component___touch_point.md) | | +| [OH_NativeXComponent_TouchEvent](_o_h___native_x_component___touch_event.md) | | +| [OH_NativeXComponent_Callback](_o_h___native_x_component___callback.md) | Registers the surface lifecycle and touch event callbacks. | + + +### Macros + + | Macro Name and Value | Description | +| -------- | -------- | +| **OH_NATIVE_XCOMPONENT_OBJ**   ("__NATIVE_XCOMPONENT_OBJ__") | | + + +### Typedefs + + | Typedef Name | Description | +| -------- | -------- | +| [OH_NativeXComponent](_o_h___native_x_component.md#ga0e676460ec145b81bdb07a97a368a5f1) | typedef struct [OH_NativeXComponent](_o_h___native_x_component.md#ga0e676460ec145b81bdb07a97a368a5f1)
Provides an encapsulated **OH_NativeXComponent** instance. | +| [OH_NativeXComponent_Callback](_o_h___native_x_component.md#gaf629ecc5d06f0a69aea9da3511679ea5) | typedef struct [OH_NativeXComponent_Callback](_o_h___native_x_component___callback.md)
Registers the surface lifecycle and touch event callbacks. | + + +### Enumerations + + | Enumeration Name | Description | +| -------- | -------- | +| { [OH_NATIVEXCOMPONENT_RESULT_SUCCESS](_o_h___native_x_component.md#gga06fc87d81c62e9abb8790b6e5713c55baf2a815b270113979adea7b9440e0b80e) = 0, [OH_NATIVEXCOMPONENT_RESULT_FAILED](_o_h___native_x_component.md#gga06fc87d81c62e9abb8790b6e5713c55bad6e4a33f3c594e267b8101bbc8ba682f) = -1, [OH_NATIVEXCOMPONENT_RESULT_BAD_PARAMETER](_o_h___native_x_component.md#gga06fc87d81c62e9abb8790b6e5713c55baa12565a3677df7c8dc60e216ed40e580) = -2 } | Enumerates the API access states. | +| [OH_NativeXComponent_TouchEventType](_o_h___native_x_component.md#ga0a8c68dd460d7e801e7c0ff771f09182) {   [OH_NATIVEXCOMPONENT_DOWN](_o_h___native_x_component.md#gga0a8c68dd460d7e801e7c0ff771f09182a87b4dfe82e5aafd40c202484fc10dfb4) = 0, [OH_NATIVEXCOMPONENT_UP](_o_h___native_x_component.md#gga0a8c68dd460d7e801e7c0ff771f09182ae2da3fbb127398f9a749070edf671597), [OH_NATIVEXCOMPONENT_MOVE](_o_h___native_x_component.md#gga0a8c68dd460d7e801e7c0ff771f09182a0b97e9e7830d0363e3617e2a7d33b378), [OH_NATIVEXCOMPONENT_CANCEL](_o_h___native_x_component.md#gga0a8c68dd460d7e801e7c0ff771f09182a8593a5e1053e9c9df74d6b0e8a9bbb0a),   [OH_NATIVEXCOMPONENT_UNKNOWN](_o_h___native_x_component.md#gga0a8c68dd460d7e801e7c0ff771f09182aff39d23c1412b3b110a19df4893651d3) } | | + + +### Functions + + | Function | Description | +| -------- | -------- | +| [OH_NativeXComponent_GetXComponentId](_o_h___native_x_component.md#ga1aa5d0ac3778b9caef35f93b54a6f677) ([OH_NativeXComponent](_o_h___native_x_component.md#ga0e676460ec145b81bdb07a97a368a5f1) \*component, char \*id, uint64_t \*size) | int32_t
Obtains the ID of the ArkUI XComponent. | +| [OH_NativeXComponent_GetXComponentSize](_o_h___native_x_component.md#ga8f60375298a5d9eae57d03d4c5cf5f3f) ([OH_NativeXComponent](_o_h___native_x_component.md#ga0e676460ec145b81bdb07a97a368a5f1) \*component, const void \*window, uint64_t \*width, uint64_t \*height) | int32_t
Obtains the size of the surface held by the ArkUI XComponent. | +| [OH_NativeXComponent_GetXComponentOffset](_o_h___native_x_component.md#ga3a594868e2d0f633026b7fea2f45812a) ([OH_NativeXComponent](_o_h___native_x_component.md#ga0e676460ec145b81bdb07a97a368a5f1) \*component, const void \*window, double \*x, double \*y) | int32_t
Obtains the offset of the surface held by the ArkUI XComponent. | +| [OH_NativeXComponent_GetTouchEvent](_o_h___native_x_component.md#ga5b0e85c74dab846b5b61a5e244ee60ca) ([OH_NativeXComponent](_o_h___native_x_component.md#ga0e676460ec145b81bdb07a97a368a5f1) \*component, const void \*window, [OH_NativeXComponent_TouchEvent](_o_h___native_x_component___touch_event.md) \*touchEvent) | int32_t
Obtains the touch event dispatched by the ArkUI XComponent. | +| [OH_NativeXComponent_RegisterCallback](_o_h___native_x_component.md#gaf9b8b470cd51ac0e339710926bca72e3) ([OH_NativeXComponent](_o_h___native_x_component.md#ga0e676460ec145b81bdb07a97a368a5f1) \*component, [OH_NativeXComponent_Callback](_o_h___native_x_component___callback.md) \*callback) | int32_t
Registers a callback for this **OH_NativeXComponent** instance. | diff --git a/zh-cn/application-dev/reference/native-apis/public_sys-resources/icon-caution.gif b/zh-cn/application-dev/reference/native-apis/public_sys-resources/icon-caution.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 GIT binary patch literal 580 zcmV-K0=xZ3Nk%w1VIu$?0Hp~4{QBgqmQ+MG9K51r{QB&)np^||1PlfQ%(86!{`~yv zv{XhUWKt}AZaiE{EOcHp{O-j3`t;<+eEiycJT4p@77X;(jQsMfB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/native-apis/public_sys-resources/icon-danger.gif b/zh-cn/application-dev/reference/native-apis/public_sys-resources/icon-danger.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571 GIT binary patch literal 580 zcmV-K0=xZ3Nk%w1VIu$?0Hp~4{QBgqmQ+MG9K51r{QB&)np^||1PlfQ%(86!{`~yv zv{XhUWKt}AZaiE{EOcHp{O-j3`t;<+eEiycJT4p@77X;(jQsMfB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/native-apis/public_sys-resources/icon-note.gif b/zh-cn/application-dev/reference/native-apis/public_sys-resources/icon-note.gif new file mode 100644 index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda GIT binary patch literal 394 zcmZ?wbhEHblx7fPSjxcg=ii?@_wH=jwxy=7CMGH-B`L+l$wfv=#>UF#$gv|VY%C^b zCQFtrnKN(Bo_%|sJbO}7RAORe!otL&qo<>yq_Sq+8Xqqo5h0P3w3Lvb5E(g{p01vl zxR@)KuDH0l^z`+-dH3eaw=XqSH7aTIx{kzVBN;X&hha0dQSgWuiw0NWUvMRmkD|> literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/native-apis/public_sys-resources/icon-notice.gif b/zh-cn/application-dev/reference/native-apis/public_sys-resources/icon-notice.gif new file mode 100644 index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27 GIT binary patch literal 406 zcmV;H0crk6Nk%w1VIu$@0J8u9|NsB@_xJDb@8;&_*4Ea}&d#;9wWXz{jEszHYim+c zQaU<1At50E0000000000A^8Le000gEEC2ui03!e%000R7038S%NU)&51O^i-Tu6`s z0)`MFE@;3YqD6xSC^kTNu_J>91{PH8XfZ(p1pp2-SU@u3#{mEUC}_}tg3+I#{z}{Ok@D_ZUDg- zt0stin4;pC8M{WLSlRH*1pzqEw1}3oOskyNN?j;7HD{BBZ*OEcv4HK!6Bk6beR+04 z&8}k>SkTusVTDmkyOz#5fCA$JTPGJVQvr3uZ?QzzPQFvD0rGf_PdrcF`pMs}p^BcF zKtKTd`0wipR%nKN&Wj+V}pX;WC3SdJV!a_8Qi zE7z`U*|Y^H0^}fB$R?oG%6hQ z+MMLZbQBH@)Vg&1^3?qHb(5!%>3r0+`eq=&V&E}0Dypi0000000000 z00000A^8LW000R9EC2ui03!e$000L5z=Uu}ED8YtqjJd<+B}(9bIOb$3-31_h|V>=0A{ z1Hh0#H30>fNT})^fRU_83uewx9oRr{f{Sx1Ml`t)EQ zGkHZ67&~y{W5Jpq4H_WfuLxp*3<7O}GEl;1ESe36fLNs=B0&LQM1Buf(R)qg(BRd`t1OPjI1m_q4 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/reference/native-apis/raw__dir_8h.md b/zh-cn/application-dev/reference/native-apis/raw__dir_8h.md new file mode 100644 index 0000000000..62fa049bd1 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/raw__dir_8h.md @@ -0,0 +1,37 @@ +# raw_dir.h + + +## **Overview** + +**Related Modules:** + +[Rawfile](rawfile.md) + +**Description:** + +提供rawfile目录相关功能 + +功能包括遍历和关闭rawfile目录 + +**Since:** +8 +**Version:** +1.0 + +## **Summary** + + +### Typedefs + + | Typedef Name | Description | +| -------- | -------- | +| [RawDir](rawfile.md#ga654d75f2b4badf0dac10c4127a9938c3) | typedef struct [RawDir](rawfile.md#ga654d75f2b4badf0dac10c4127a9938c3)
提供对rawfile目录的访问 | + + +### Functions + + | Function | Description | +| -------- | -------- | +| [OH_ResourceManager_GetRawFileName](rawfile.md#gaf522ad160d8ca2bd476b6ad45696e1af) ([RawDir](rawfile.md#ga654d75f2b4badf0dac10c4127a9938c3) \*rawDir, int index) | const char \*
通过索引获取rawfile文件名称 | +| [OH_ResourceManager_GetRawFileCount](rawfile.md#ga604cd2ced1bf4a0d1ace7b0fc89cb884) ([RawDir](rawfile.md#ga654d75f2b4badf0dac10c4127a9938c3) \*rawDir) | int
获取[RawDir](rawfile.md#ga654d75f2b4badf0dac10c4127a9938c3)中的rawfile数量 | +| [OH_ResourceManager_CloseRawDir](rawfile.md#ga1db0825028507d355db4067f187223de) ([RawDir](rawfile.md#ga654d75f2b4badf0dac10c4127a9938c3) \*rawDir) | void
关闭已打开的[RawDir](rawfile.md#ga654d75f2b4badf0dac10c4127a9938c3)并释放所有相关联资源 | diff --git a/zh-cn/application-dev/reference/native-apis/raw__file_8h.md b/zh-cn/application-dev/reference/native-apis/raw__file_8h.md new file mode 100644 index 0000000000..a59adf879b --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/raw__file_8h.md @@ -0,0 +1,48 @@ +# raw_file.h + + +## **Overview** + +**Related Modules:** + +[Rawfile](rawfile.md) + +**Description:** + +提供rawfile文件相关功能 + +功能包括搜索、读取和关闭rawfile文件 + +**Since:** +8 +**Version:** +1.0 + +## **Summary** + + +### Classes + + | Classe Name | Description | +| -------- | -------- | +| [RawFileDescriptor](_raw_file_descriptor.md) | 提供rawfile文件描述符信息 | + + +### Typedefs + + | Typedef Name | Description | +| -------- | -------- | +| [RawFile](rawfile.md#gacf2dc23017812d7daf535b80f1a6ab27) | typedef struct [RawFile](rawfile.md#gacf2dc23017812d7daf535b80f1a6ab27)
提供对rawfile的访问功能 | + + +### Functions + + | Function | Description | +| -------- | -------- | +| [OH_ResourceManager_ReadRawFile](rawfile.md#ga2958ba7372ae1232365358115a82c219) (const [RawFile](rawfile.md#gacf2dc23017812d7daf535b80f1a6ab27) \*rawFile, void \*buf, size_t length) | int
读取rawfile | +| [OH_ResourceManager_SeekRawFile](rawfile.md#ga7fc0d124fd184498b0a0bfad3454f45c) (const [RawFile](rawfile.md#gacf2dc23017812d7daf535b80f1a6ab27) \*rawFile, long offset, int whence) | int
基于指定的offset,在rawfile文件内搜索读写数据的位置 | +| [OH_ResourceManager_GetRawFileSize](rawfile.md#gafcc6036360466ab5193b7b4eba5eae50) ([RawFile](rawfile.md#gacf2dc23017812d7daf535b80f1a6ab27) \*rawFile) | long
获取rawfile长度,单位为int32_t | +| [OH_ResourceManager_CloseRawFile](rawfile.md#ga5cccee53550670a2111705d56a1d427b) ([RawFile](rawfile.md#gacf2dc23017812d7daf535b80f1a6ab27) \*rawFile) | void
关闭已打开的[RawFile](rawfile.md#gacf2dc23017812d7daf535b80f1a6ab27) 以及释放所有相关联资源 | +| [OH_ResourceManager_GetRawFileOffset](rawfile.md#ga57dc379d6df6b7c7f8e76303ad4957a4) (const [RawFile](rawfile.md#gacf2dc23017812d7daf535b80f1a6ab27) \*rawFile) | long
获取rawfile当前的offset,单位为int32_t | +| [OH_ResourceManager_GetRawFileDescriptor](rawfile.md#ga8313a7d4bb361a98ced485346a9be4b1) (const [RawFile](rawfile.md#gacf2dc23017812d7daf535b80f1a6ab27) \*rawFile, [RawFileDescriptor](_raw_file_descriptor.md) &descriptor) | bool
基于offset(单位为int32_t)和文件长度打开rawfile,并获取rawfile文件描述符 | +| [OH_ResourceManager_ReleaseRawFileDescriptor](rawfile.md#gabf9db7f05088a11cc311a6ef890eda6b) (const [RawFileDescriptor](_raw_file_descriptor.md) &descriptor) | bool
关闭rawfile文件描述符 | diff --git a/zh-cn/application-dev/reference/native-apis/rawfile.md b/zh-cn/application-dev/reference/native-apis/rawfile.md new file mode 100644 index 0000000000..ed058a19e6 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/rawfile.md @@ -0,0 +1,461 @@ +# Rawfile + + +## **Overview** + +**Description:** + +提供操作rawfile目录和rawfile文件的功能 + +提供操作rawfile目录和rawfile文件功能 + +功能包括遍历、打开、搜索、读取和关闭rawfile + +**Since:** + +8 + +**Version:** + +1.0 + + +## **Summary** + + +### Files + + | File Name | Description | +| -------- | -------- | +| [raw_dir.h](raw__dir_8h.md) | 提供rawfile目录相关功能 | +| [raw_file.h](raw__file_8h.md) | 提供rawfile文件相关功能 | + + +### Classes + + | Classe Name | Description | +| -------- | -------- | +| [RawFileDescriptor](_raw_file_descriptor.md) | 提供rawfile文件描述符信息 | + + +### Typedefs + + | Typedef Name | Description | +| -------- | -------- | +| RawDir | typedef struct RawDir
提供对rawfile目录的访问 | +| RawFile | typedef struct RawFile
提供对rawfile的访问功能 | +| NativeResourceManager | typedef struct NativeResourceManager
代表resource manager | + + +### Functions + + | Function | Description | +| -------- | -------- | +| OH_ResourceManager_GetRawFileName (RawDir \*rawDir, int index) | const char \*
通过索引获取rawfile文件名称 | +| OH_ResourceManager_GetRawFileCount (RawDir \*rawDir) | int
获取RawDir中的rawfile数量 | +| OH_ResourceManager_CloseRawDir (RawDir \*rawDir) | void
关闭已打开的RawDir并释放所有相关联资源 | +| OH_ResourceManager_ReadRawFile (const RawFile \*rawFile, void \*buf, size_t length) | int
读取rawfile | +| OH_ResourceManager_SeekRawFile (const RawFile \*rawFile, long offset, int whence) | int
基于指定的offset,在rawfile文件内搜索读写数据的位置 | +| OH_ResourceManager_GetRawFileSize (RawFile \*rawFile) | long
获取rawfile长度,单位为int32_t | +| OH_ResourceManager_CloseRawFile (RawFile \*rawFile) | void
关闭已打开的RawFile 以及释放所有相关联资源 | +| OH_ResourceManager_GetRawFileOffset (const RawFile \*rawFile) | long
获取rawfile当前的offset,单位为int32_t | +| OH_ResourceManager_GetRawFileDescriptor (const RawFile \*rawFile, RawFileDescriptor &descriptor) | bool
基于offset(单位为int32_t)和文件长度打开rawfile,并获取rawfile文件描述符 | +| OH_ResourceManager_ReleaseRawFileDescriptor (const RawFileDescriptor &descriptor) | bool
关闭rawfile文件描述符 | +| OH_ResourceManager_InitNativeResourceManager (napi_env env, napi_value jsResMgr) | NativeResourceManager \*
基于JavaScipt resource manager获取native resource manager | +| OH_ResourceManager_ReleaseNativeResourceManager (NativeResourceManager \*resMgr) | void
释放native resource manager | +| OH_ResourceManager_OpenRawDir (const NativeResourceManager \*mgr, const char \*dirName) | RawDir \*
打开rawfile目录 | +| OH_ResourceManager_OpenRawFile (const NativeResourceManager \*mgr, const char \*fileName) | RawFile \*
打开rawfile文件 | + + +## **Details** + + +## **Typedef** + + +### NativeResourceManager + + +``` +typedef struct NativeResourceManager NativeResourceManager +``` + +**Description:** + +代表resource manager + +此类封装了JavaScript resource manager的native实现 **ResourceManager**指针可以通过调用OH_ResourceManager_InitNativeResourceManager方法获取 + + +### RawDir + + +``` +typedef struct RawDir RawDir +``` + +**Description:** + +提供对rawfile目录的访问 + + +### RawFile + + +``` +typedef struct RawFile RawFile +``` + +**Description:** + +提供对rawfile的访问功能 + + +## **Function** + + +### OH_ResourceManager_CloseRawDir() + + +``` +void OH_ResourceManager_CloseRawDir (RawDir * rawDir) +``` + +**Description:** + +关闭已打开的RawDir并释放所有相关联资源 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| rawDir | 表示指向RawDir的指针 | + +**See also:** + +OH_ResourceManager_OpenRawDir + + +### OH_ResourceManager_CloseRawFile() + + +``` +void OH_ResourceManager_CloseRawFile (RawFile * rawFile) +``` + +**Description:** + +关闭已打开的RawFile 以及释放所有相关联资源 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| rawFile | 表示指向RawFile的指针 | + +**See also:** + +OH_ResourceManager_OpenRawFile + + +### OH_ResourceManager_GetRawFileCount() + + +``` +int OH_ResourceManager_GetRawFileCount (RawDir * rawDir) +``` + +**Description:** + +获取RawDir中的rawfile数量 + +通过此方法可以获取OH_ResourceManager_GetRawFileName中可用的索引 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| rawDir | 表示指向RawDir的指针 | + +**See also:** + +OH_ResourceManager_GetRawFileName + + +### OH_ResourceManager_GetRawFileDescriptor() + + +``` +bool OH_ResourceManager_GetRawFileDescriptor (const RawFile * rawFile, RawFileDescriptor & descriptor ) +``` + +**Description:** + +基于offset(单位为int32_t)和文件长度打开rawfile,并获取rawfile文件描述符 + +打开的文件描述符被用于读取rawfile + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| rawFile | 表示指向RawFile的指针 | +| descriptor | 显示rawfile文件描述符,以及在HAP包中的起始位置和长度 | + +**Returns:** + +返回true表示打开rawfile文件描述符成功,返回false表示rawfile不允许被访问 + + +### OH_ResourceManager_GetRawFileName() + + +``` +const char* OH_ResourceManager_GetRawFileName (RawDir * rawDir, int index ) +``` + +**Description:** + +通过索引获取rawfile文件名称 + +可以使用此方法遍历rawfile目录 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| rawDir | 表示指向RawDir的指针 | +| index | 表示文件在RawDir中的索引位置 | + +**Returns:** + +通过索引返回文件名称,此返回值可以作为OH_ResourceManager_OpenRawFile的输入参数, 如果遍历完所有文件仍未找到,则返回**NULL** + +**See also:** + +OH_ResourceManager_OpenRawFile + + +### OH_ResourceManager_GetRawFileOffset() + + +``` +long OH_ResourceManager_GetRawFileOffset (const RawFile * rawFile) +``` + +**Description:** + +获取rawfile当前的offset,单位为int32_t + +rawfile当前的offset + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| rawFile | 表示指向RawFile的指针 | + +**Returns:** + +返回rawfile当前的offset + + +### OH_ResourceManager_GetRawFileSize() + + +``` +long OH_ResourceManager_GetRawFileSize (RawFile * rawFile) +``` + +**Description:** + +获取rawfile长度,单位为int32_t + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| rawFile | 表示指向RawFile的指针 | + +**Returns:** + +Returns rawfile整体长度 + + +### OH_ResourceManager_InitNativeResourceManager() + + +``` +NativeResourceManager* OH_ResourceManager_InitNativeResourceManager (napi_env env, napi_value jsResMgr ) +``` + +**Description:** + +基于JavaScipt resource manager获取native resource manager + +通过获取resource manager来完成rawfile相关功能 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| env | 表示JavaScipt Native Interface (napi)环境指针 | +| jsResMgr | 表示JavaScipt resource manager | + +**Returns:** + +返回NativeResourceManager指针 + + +### OH_ResourceManager_OpenRawDir() + + +``` +RawDir* OH_ResourceManager_OpenRawDir (const NativeResourceManager * mgr, const char * dirName ) +``` + +**Description:** + +打开rawfile目录 + +打开rawfile目录后,可以遍历对应目录下的rawfile文件 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| mgr | 表示指向NativeResourceManager的指针,此指针是通过调用 OH_ResourceManager_InitNativeResourceManager方法获取的 | +| dirName | 表示要打开的rawfile目录名称,当传递一个空字符串时表示打开rawfile根目录 | + +**Returns:** + +返回RawDir指针。使用完此指针后,调用OH_ResourceManager_CloseRawDir释放。 + +**See also:** + +OH_ResourceManager_InitNativeResourceManager + +OH_ResourceManager_CloseRawDir + + +### OH_ResourceManager_OpenRawFile() + + +``` +RawFile* OH_ResourceManager_OpenRawFile (const NativeResourceManager * mgr, const char * fileName ) +``` + +**Description:** + +打开rawfile文件 + +当打开rawfile以后,可以读取它的数据 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| mgr | 表示指向NativeResourceManager的指针,此指针是通过调用 OH_ResourceManager_InitNativeResourceManager方法获取的 | +| fileName | 表示基于rawfile根目录的相对路径下的文件名称 | + +**Returns:** + +返回RawFile指针。当使用完此指针,调用OH_ResourceManager_CloseRawFile释放。 + +**See also:** + +OH_ResourceManager_InitNativeResourceManager + +OH_ResourceManager_CloseRawFile + + +### OH_ResourceManager_ReadRawFile() + + +``` +int OH_ResourceManager_ReadRawFile (const RawFile * rawFile, void * buf, size_t length ) +``` + +**Description:** + +读取rawfile + +从当前位置读取**指定长度**的数据 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| rawFile | 表示指向RawFile的指针 | +| buf | 用于接收读取数据的缓冲区指针 | +| length | 读取数据的字节长度 | + +**Returns:** + +返回读取的字节数,如果读取长度超过文件末尾长度,则返回**0** + + +### OH_ResourceManager_ReleaseNativeResourceManager() + + +``` +void OH_ResourceManager_ReleaseNativeResourceManager (NativeResourceManager * resMgr) +``` + +**Description:** + +释放native resource manager + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| resMgr | 表示NativeResourceManager指针 | + + +### OH_ResourceManager_ReleaseRawFileDescriptor() + + +``` +bool OH_ResourceManager_ReleaseRawFileDescriptor (const RawFileDescriptor & descriptor) +``` + +**Description:** + +关闭rawfile文件描述符 + +已打开的文件描述符在使用完以后必须释放,防止文件描述符泄露 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| descriptor | 包含rawfile文件描述符,以及在HAP包中的起始位置和长度 | + +**Returns:** + +返回true表示关闭文件描述符成功,返回false表示关闭文件描述符失败 + + +### OH_ResourceManager_SeekRawFile() + + +``` +int OH_ResourceManager_SeekRawFile (const RawFile * rawFile, long offset, int whence ) +``` + +**Description:** + +基于指定的offset,在rawfile文件内搜索读写数据的位置 + +**Parameters:** + + | Name | Description | +| -------- | -------- | +| rawFile | 表示指向RawFile的指针 | +| offset | 表示指定的offset | +| whence | 读写位置,有以下场景: **0**: 读写位置为**offset1**: 读写位置为当前位置加上**offset2**: 读写位置为文件末尾(EOF)加上**offset** | + +**Returns:** + +如果搜索成功返回新的读写位置,如果发生错误返回 **(long) -1** diff --git a/zh-cn/application-dev/reference/native-apis/total.md b/zh-cn/application-dev/reference/native-apis/total.md new file mode 100644 index 0000000000..bac5076606 --- /dev/null +++ b/zh-cn/application-dev/reference/native-apis/total.md @@ -0,0 +1,7 @@ +# 头文件和结构体 + + + +- **[头文件](files.md)** + +- **[结构体](annotated.md)** \ No newline at end of file diff --git a/zh-cn/application-dev/website.md b/zh-cn/application-dev/website.md index 9ef5c45700..5d562adff2 100644 --- a/zh-cn/application-dev/website.md +++ b/zh-cn/application-dev/website.md @@ -1,5 +1,6 @@ # OpenHarmony应用开发文档 - [应用开发导读](application-dev-guide.md) + - 快速开始 - 快速入门 @@ -10,9 +11,10 @@ - [使用JS语言开发(低代码方式)](quick-start/start-with-js-low-code.md) - 开发基础知识 - [应用包结构说明(FA模型)](quick-start/package-structure.md) - - [应用包结构说明(Stage模型)](quick-start/module-structure.md) + - [应用包结构说明(Stage模型)](quick-start/stage-structure.md) - [资源文件的分类](quick-start/basic-resource-file-categories.md) - [SysCap说明](quick-start/syscap.md) + - 开发 - Ability开发 @@ -34,6 +36,7 @@ - [WantAgent开发指导](ability/wantagent.md) - [Ability助手使用指导](ability/ability-assistant-guidelines.md) - [测试框架使用指导](ability/ability-delegator.md) + - UI开发 - [方舟开发框架(ArkUI)概述](ui/arkui-overview.md) - 基于JS扩展的类Web开发范式 @@ -179,6 +182,7 @@ - [构建食物列表List布局](ui/ui-ts-building-category-list-layout.md) - [构建食物分类Grid布局](ui/ui-ts-building-category-grid-layout.md) - [页面跳转与数据传递](ui/ui-ts-page-redirection-data-transmission.md) + - 基础功能开发 - 公共事件与通知 - [公共事件与通知概述](notification/notification-brief.md) @@ -188,6 +192,7 @@ - [通知开发指导](notification/notification.md) - 调试工具 - [调试助手使用指导](notification/assistant-guidelines.md) + - 窗口管理 - 窗口 - [窗口开发概述](windowmanager/window-overview.md) @@ -198,9 +203,11 @@ - 屏幕截图 - [屏幕截图开发概述](windowmanager/screenshot-overview.md) - [屏幕截图开发指导](windowmanager/screenshot-guidelines.md) + - WebGL - [WebGL开发概述](webgl/webgl-overview.md) - [WebGL开发指导](webgl/webgl-guidelines.md) + - 媒体 - 音频 - [音频开发概述](media/audio-overview.md) @@ -213,6 +220,7 @@ - [视频录制开发指导](media/video-recorder.md) - 图片 - [图片开发指导](media/image.md) + - 安全 - 用户认证 - [用户认证开发概述](security/userauth-overview.md) @@ -225,11 +233,13 @@ - 访问控制 - [访问控制开发概述](security/accesstoken-overview.md) - [访问控制开发指导](security/accesstoken-guidelines.md) + - 网络与连接 - IPC与RPC通信 - [IPC与RPC通信概述](connectivity/ipc-rpc-overview.md) - [IPC与RPC通信开发指导](connectivity/ipc-rpc-development-guideline.md) - [远端状态订阅开发实例](connectivity/subscribe-remote-state.md) + - 数据管理 - 分布式数据服务 - [分布式数据服务概述](database/database-mdds-overview.md) @@ -243,15 +253,19 @@ - 分布式数据对象 - [分布式数据对象概述](database/database-distributedobject-overview.md) - [分布式数据对象开发指导](database/database-distributedobject-guidelines.md) + - 后台代理提醒 - [后台代理提醒概述](background-agent-scheduled-reminder/background-agent-scheduled-reminder-overview.md) - [后台代理提醒开发指导](background-agent-scheduled-reminder/background-agent-scheduled-reminder-guide.md) + - 后台任务管理 - [后台任务概述](background-task-management/background-task-overview.md) - [后台任务开发指导](background-task-management/background-task-dev-guide.md) + - 延迟任务调度 - [延迟任务调度概述](work-scheduler/work-scheduler-overview.md) - [延迟任务调度开发指导](work-scheduler/work-scheduler-dev-guide.md) + - 设备管理 - USB服务 - [USB服务开发概述](device/usb-overview.md) @@ -266,9 +280,11 @@ - 振动 - [振动开发概述](device/vibrator-overview.md) - [振动开发指导](device/vibrator-guidelines.md) + - 设备使用信息统计 - [设备使用信息统计概述](device-usage-statistics/device-usage-statistics-overview.md) - [设备使用信息统计开发指导](device-usage-statistics/device-usage-statistics-dev-guide.md) + - DFX - 应用事件打点 - [应用事件打点概述](dfx/hiappevent-overview.md) @@ -279,15 +295,28 @@ - 分布式跟踪 - [分布式跟踪概述](dfx/hitracechain-overview.md) - [分布式跟踪开发指导](dfx/hitracechain-guidelines.md) + - 国际化 - [国际化开发概述](internationalization/international-overview.md) + - [Intl开发指导](internationalization/intl-guidelines.md) + - [I18n开发指导](internationalization/i18n-guidelines.md) + + - Native API的相关指导 + - [Native API在应用工程中的使用指导](napi/napi-guidelines.md) + - [drawing开发指导](napi/drawing-guidelines.md) + - [rawfile开发指导](napi/rawfile-guidelines.md) + + + - 工具 - [DevEco Studio(OpenHarmony)使用指南](quick-start/deveco-studio-user-guide-for-openharmony.md) + - 示例教程 - [示例代码](https://gitee.com/openharmony/app_samples/blob/master/README_zh.md) - [Codelabs](https://gitee.com/openharmony/codelabs/blob/master/README.md) + - API参考 - 组件参考(基于JS扩展的类Web开发范式) - 组件 -- GitLab