From 915a42948fd499dc631611afeb6945c487e68248 Mon Sep 17 00:00:00 2001 From: mamingshuai Date: Wed, 2 Jun 2021 00:06:03 +0800 Subject: [PATCH] update OpenHarmony 2.0 Canary --- .gitattributes | 15 + BUILD.gn | 40 + LICENSE | 177 ++ README.en.md | 36 - README.md | 728 +++++- README_zh.md | 361 +++ figures/graphic.png | Bin 0 -> 46331 bytes frameworks/bootanimation/BUILD.gn | 61 + .../bootanimation/data/bootanimation.raw | Bin 0 -> 2199236 bytes frameworks/bootanimation/include/raw_parser.h | 72 + frameworks/bootanimation/include/util.h | 34 + frameworks/bootanimation/src/main.cpp | 189 ++ frameworks/bootanimation/src/raw_parser.cpp | 171 ++ frameworks/bootanimation/src/util.cpp | 52 + frameworks/surface/BUILD.gn | 77 + .../surface/include/buffer_client_producer.h | 57 + frameworks/surface/include/buffer_log.h | 96 + frameworks/surface/include/buffer_manager.h | 46 + frameworks/surface/include/buffer_queue.h | 104 + .../surface/include/buffer_queue_consumer.h | 46 + .../surface/include/buffer_queue_producer.h | 80 + frameworks/surface/include/buffer_utils.h | 41 + frameworks/surface/include/consumer_surface.h | 75 + frameworks/surface/include/producer_surface.h | 73 + .../surface/include/surface_buffer_impl.h | 83 + .../surface/src/buffer_client_producer.cpp | 177 ++ frameworks/surface/src/buffer_manager.cpp | 190 ++ frameworks/surface/src/buffer_queue.cpp | 504 ++++ .../surface/src/buffer_queue_consumer.cpp | 76 + .../surface/src/buffer_queue_producer.cpp | 216 ++ frameworks/surface/src/buffer_utils.cpp | 106 + frameworks/surface/src/consumer_surface.cpp | 154 ++ frameworks/surface/src/producer_surface.cpp | 192 ++ frameworks/surface/src/surface.cpp | 50 + .../surface/src/surface_buffer_impl.cpp | 277 +++ frameworks/surface/test/BUILD.gn | 18 + frameworks/surface/test/unittest/BUILD.gn | 47 + .../surface/test/unittest/environments.h | 21 + .../surface/test/unittest/local/BUILD.gn | 28 + .../unittest/local/buffer_manager/BUILD.gn | 33 + .../local_buffer_manager_test.cpp | 235 ++ .../local_buffer_manager_test.h | 19 + .../test/unittest/local/buffer_queue/BUILD.gn | 33 + .../buffer_queue/local_buffer_queue_test.cpp | 476 ++++ .../buffer_queue/local_buffer_queue_test.h | 19 + .../local/buffer_queue_consumer/BUILD.gn | 33 + .../local_buffer_queue_consumer_test.cpp | 136 ++ .../local_buffer_queue_consumer_test.h | 19 + .../local/buffer_queue_producer/BUILD.gn | 33 + .../local_buffer_queue_producer_test.cpp | 207 ++ .../local_buffer_queue_producer_test.h | 19 + .../unittest/local/consumer_surface/BUILD.gn | 33 + .../local_consumer_surface_test.cpp | 289 +++ .../local_consumer_surface_test.h | 19 + .../unittest/local/producer_surface/BUILD.gn | 33 + .../local_producer_surface_test.cpp | 279 +++ .../local_producer_surface_test.h | 19 + .../local/surface_buffer_impl/BUILD.gn | 33 + .../local_surface_buffer_impl_test.cpp | 155 ++ .../local_surface_buffer_impl_test.h | 19 + .../surface/test/unittest/remote/BUILD.gn | 23 + .../remote/buffer_client_producer/BUILD.gn | 36 + .../remote_buffer_client_producer_test.cpp | 261 +++ .../remote_buffer_client_producer_test.h | 19 + .../remote/buffer_queue_producer/BUILD.gn | 36 + .../remote_buffer_queue_producer_test.cpp | 259 +++ .../remote_buffer_queue_producer_test.h | 19 + frameworks/vsync/BUILD.gn | 121 + frameworks/vsync/include/ivsync_callback.h | 32 + frameworks/vsync/include/ivsync_manager.h | 34 + .../vsync/include/vsync_callback_proxy.h | 35 + .../vsync/include/vsync_callback_stub.h | 32 + frameworks/vsync/include/vsync_helper_impl.h | 79 + frameworks/vsync/include/vsync_log.h | 55 + frameworks/vsync/include/vsync_manager.h | 47 + .../vsync/include/vsync_manager_proxy.h | 35 + frameworks/vsync/include/vsync_module_impl.h | 61 + frameworks/vsync/src/vsync_callback_proxy.cpp | 54 + frameworks/vsync/src/vsync_callback_stub.cpp | 51 + frameworks/vsync/src/vsync_helper.cpp | 31 + frameworks/vsync/src/vsync_helper_impl.cpp | 200 ++ frameworks/vsync/src/vsync_manager.cpp | 98 + frameworks/vsync/src/vsync_manager_proxy.cpp | 67 + frameworks/vsync/src/vsync_module.cpp | 25 + frameworks/vsync/src/vsync_module_impl.cpp | 183 ++ frameworks/vsync/test/BUILD.gn | 18 + frameworks/vsync/test/unittest/BUILD.gn | 108 + .../vsync/test/unittest/vsync_helper_test.cpp | 276 +++ .../vsync/test/unittest/vsync_helper_test.h | 19 + .../unittest/vsync_manager_remote_test.cpp | 136 ++ .../test/unittest/vsync_manager_remote_test.h | 19 + .../test/unittest/vsync_manager_test.cpp | 93 + .../vsync/test/unittest/vsync_manager_test.h | 19 + .../vsync/test/unittest/vsync_module_test.cpp | 85 + .../vsync/test/unittest/vsync_module_test.h | 19 + frameworks/wm/BUILD.gn | 184 ++ frameworks/wm/Readme.md | 13 + frameworks/wm/include/client/video_window.h | 43 + .../client/window_manager_controller_client.h | 248 ++ .../wm/include/client/window_manager_proxy.h | 35 + .../wm/include/iwindow_manager_service.h | 44 + .../wm/include/server/layer_controller.h | 91 + .../wm/include/server/window_manager_server.h | 30 + .../wm/include/server/window_manager_stub.h | 29 + frameworks/wm/include/window_manager_define.h | 23 + frameworks/wm/include/window_manager_hilog.h | 54 + frameworks/wm/src/client/video_window.cpp | 150 ++ frameworks/wm/src/client/window_manager.cpp | 537 +++++ .../window_manager_controller_client.cpp | 2047 +++++++++++++++++ .../wm/src/client/window_manager_proxy.cpp | 76 + frameworks/wm/src/server/layer_controller.cpp | 417 ++++ .../wm/src/server/window_manager_server.cpp | 37 + .../wm/src/server/window_manager_service.cpp | 65 + .../wm/src/server/window_manager_stub.cpp | 64 + frameworks/wm/src/window_manager_test.cpp | 910 ++++++++ frameworks/wm/test/BUILD.gn | 18 + frameworks/wm/test/unittest/BUILD.gn | 21 + .../wm/test/unittest/wms_client/BUILD.gn | 24 + .../window_manager_proxy_test/BUILD.gn | 56 + .../window_manager_proxy_test.cpp | 68 + .../window_manager_proxy_test.h | 19 + .../wms_client/windows_manager_test/BUILD.gn | 40 + .../windows_manager_test.cpp | 294 +++ .../windows_manager_test.h | 19 + .../wm_controller_client_test/BUILD.gn | 52 + .../window_controller_client_test.cpp | 349 +++ .../window_controller_client_test.h | 19 + .../wm/test/unittest/wms_server/BUILD.gn | 21 + .../wms_server/wm_controller_test/BUILD.gn | 58 + .../wm_controller_test/wm_controller_test.cpp | 77 + .../wm_controller_test/wm_controller_test.h | 19 + .../wms_server/wm_server_test/BUILD.gn | 62 + .../wm_server_test/wm_server_test.cpp | 58 + .../wm_server_test/wm_server_test.h | 19 + graphic.rc | 26 + .../surface/ibuffer_consumer_listener.h | 30 + .../innerkits/surface/ibuffer_producer.h | 60 + interfaces/innerkits/surface/surface.h | 68 + interfaces/innerkits/surface/surface_buffer.h | 47 + interfaces/innerkits/surface/surface_type.h | 115 + .../innerkits/vsync/client/vsync_helper.h | 45 + .../innerkits/vsync/server/vsync_module.h | 33 + interfaces/innerkits/vsync/vsync_type.h | 57 + interfaces/innerkits/wm/window_manager.h | 113 + .../innerkits/wm/window_manager_common.h | 175 ++ interfaces/kits/js/declaration/BUILD.gn | 29 + .../kits/js/declaration/api/@ohos.window.d.ts | 71 + interfaces/kits/napi/BUILD.gn | 16 + interfaces/kits/napi/graphic/window/BUILD.gn | 64 + .../napi/graphic/window/native_module.cpp | 51 + .../kits/napi/graphic/window/native_module.h | 19 + .../kits/napi/graphic/window/window.cpp | 278 +++ interfaces/kits/napi/graphic/window/window.h | 24 + .../graphic/window_hap/entry/package.json | 1 + .../window_hap/entry/src/main/config.json | 60 + .../src/main/java/com/test/window/Test.java | 25 + .../java/com/test/window/TestAbility.java | 31 + .../entry/src/main/js/default/app.js | 87 + .../entry/src/main/js/default/i18n/en-US.json | 6 + .../entry/src/main/js/default/i18n/zh-CN.json | 6 + .../src/main/js/default/pages/index/index.css | 24 + .../src/main/js/default/pages/index/index.hml | 21 + .../src/main/js/default/pages/index/index.js | 24 + .../main/resources/base/element/string.json | 12 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes ohos.build | 38 + prebuilts/etcs/BUILD.gn | 43 + prebuilts/etcs/weston.ini | 32 + prebuilts/etcs/weston.rc | 27 + prebuilts/librarys/display_gralloc/BUILD.gn | 22 + utils/BUILD.gn | 35 + utils/include/buffer_handle.h | 69 + utils/include/buffer_handle_parcel.h | 40 + utils/src/buffer_handle.cpp | 213 ++ 174 files changed, 18062 insertions(+), 61 deletions(-) create mode 100644 .gitattributes create mode 100644 BUILD.gn create mode 100644 LICENSE delete mode 100644 README.en.md create mode 100644 README_zh.md create mode 100644 figures/graphic.png create mode 100644 frameworks/bootanimation/BUILD.gn create mode 100644 frameworks/bootanimation/data/bootanimation.raw create mode 100644 frameworks/bootanimation/include/raw_parser.h create mode 100644 frameworks/bootanimation/include/util.h create mode 100644 frameworks/bootanimation/src/main.cpp create mode 100644 frameworks/bootanimation/src/raw_parser.cpp create mode 100644 frameworks/bootanimation/src/util.cpp create mode 100755 frameworks/surface/BUILD.gn create mode 100644 frameworks/surface/include/buffer_client_producer.h create mode 100644 frameworks/surface/include/buffer_log.h create mode 100644 frameworks/surface/include/buffer_manager.h create mode 100644 frameworks/surface/include/buffer_queue.h create mode 100644 frameworks/surface/include/buffer_queue_consumer.h create mode 100644 frameworks/surface/include/buffer_queue_producer.h create mode 100644 frameworks/surface/include/buffer_utils.h create mode 100644 frameworks/surface/include/consumer_surface.h create mode 100644 frameworks/surface/include/producer_surface.h create mode 100644 frameworks/surface/include/surface_buffer_impl.h create mode 100644 frameworks/surface/src/buffer_client_producer.cpp create mode 100644 frameworks/surface/src/buffer_manager.cpp create mode 100644 frameworks/surface/src/buffer_queue.cpp create mode 100644 frameworks/surface/src/buffer_queue_consumer.cpp create mode 100644 frameworks/surface/src/buffer_queue_producer.cpp create mode 100644 frameworks/surface/src/buffer_utils.cpp create mode 100644 frameworks/surface/src/consumer_surface.cpp create mode 100644 frameworks/surface/src/producer_surface.cpp create mode 100644 frameworks/surface/src/surface.cpp create mode 100644 frameworks/surface/src/surface_buffer_impl.cpp create mode 100644 frameworks/surface/test/BUILD.gn create mode 100644 frameworks/surface/test/unittest/BUILD.gn create mode 100644 frameworks/surface/test/unittest/environments.h create mode 100644 frameworks/surface/test/unittest/local/BUILD.gn create mode 100755 frameworks/surface/test/unittest/local/buffer_manager/BUILD.gn create mode 100644 frameworks/surface/test/unittest/local/buffer_manager/local_buffer_manager_test.cpp create mode 100644 frameworks/surface/test/unittest/local/buffer_manager/local_buffer_manager_test.h create mode 100755 frameworks/surface/test/unittest/local/buffer_queue/BUILD.gn create mode 100644 frameworks/surface/test/unittest/local/buffer_queue/local_buffer_queue_test.cpp create mode 100644 frameworks/surface/test/unittest/local/buffer_queue/local_buffer_queue_test.h create mode 100755 frameworks/surface/test/unittest/local/buffer_queue_consumer/BUILD.gn create mode 100644 frameworks/surface/test/unittest/local/buffer_queue_consumer/local_buffer_queue_consumer_test.cpp create mode 100644 frameworks/surface/test/unittest/local/buffer_queue_consumer/local_buffer_queue_consumer_test.h create mode 100755 frameworks/surface/test/unittest/local/buffer_queue_producer/BUILD.gn create mode 100644 frameworks/surface/test/unittest/local/buffer_queue_producer/local_buffer_queue_producer_test.cpp create mode 100644 frameworks/surface/test/unittest/local/buffer_queue_producer/local_buffer_queue_producer_test.h create mode 100755 frameworks/surface/test/unittest/local/consumer_surface/BUILD.gn create mode 100644 frameworks/surface/test/unittest/local/consumer_surface/local_consumer_surface_test.cpp create mode 100644 frameworks/surface/test/unittest/local/consumer_surface/local_consumer_surface_test.h create mode 100755 frameworks/surface/test/unittest/local/producer_surface/BUILD.gn create mode 100644 frameworks/surface/test/unittest/local/producer_surface/local_producer_surface_test.cpp create mode 100644 frameworks/surface/test/unittest/local/producer_surface/local_producer_surface_test.h create mode 100755 frameworks/surface/test/unittest/local/surface_buffer_impl/BUILD.gn create mode 100644 frameworks/surface/test/unittest/local/surface_buffer_impl/local_surface_buffer_impl_test.cpp create mode 100644 frameworks/surface/test/unittest/local/surface_buffer_impl/local_surface_buffer_impl_test.h create mode 100644 frameworks/surface/test/unittest/remote/BUILD.gn create mode 100755 frameworks/surface/test/unittest/remote/buffer_client_producer/BUILD.gn create mode 100644 frameworks/surface/test/unittest/remote/buffer_client_producer/remote_buffer_client_producer_test.cpp create mode 100644 frameworks/surface/test/unittest/remote/buffer_client_producer/remote_buffer_client_producer_test.h create mode 100755 frameworks/surface/test/unittest/remote/buffer_queue_producer/BUILD.gn create mode 100644 frameworks/surface/test/unittest/remote/buffer_queue_producer/remote_buffer_queue_producer_test.cpp create mode 100644 frameworks/surface/test/unittest/remote/buffer_queue_producer/remote_buffer_queue_producer_test.h create mode 100755 frameworks/vsync/BUILD.gn create mode 100644 frameworks/vsync/include/ivsync_callback.h create mode 100644 frameworks/vsync/include/ivsync_manager.h create mode 100644 frameworks/vsync/include/vsync_callback_proxy.h create mode 100644 frameworks/vsync/include/vsync_callback_stub.h create mode 100644 frameworks/vsync/include/vsync_helper_impl.h create mode 100644 frameworks/vsync/include/vsync_log.h create mode 100644 frameworks/vsync/include/vsync_manager.h create mode 100644 frameworks/vsync/include/vsync_manager_proxy.h create mode 100644 frameworks/vsync/include/vsync_module_impl.h create mode 100644 frameworks/vsync/src/vsync_callback_proxy.cpp create mode 100644 frameworks/vsync/src/vsync_callback_stub.cpp create mode 100644 frameworks/vsync/src/vsync_helper.cpp create mode 100644 frameworks/vsync/src/vsync_helper_impl.cpp create mode 100644 frameworks/vsync/src/vsync_manager.cpp create mode 100644 frameworks/vsync/src/vsync_manager_proxy.cpp create mode 100644 frameworks/vsync/src/vsync_module.cpp create mode 100644 frameworks/vsync/src/vsync_module_impl.cpp create mode 100644 frameworks/vsync/test/BUILD.gn create mode 100755 frameworks/vsync/test/unittest/BUILD.gn create mode 100644 frameworks/vsync/test/unittest/vsync_helper_test.cpp create mode 100644 frameworks/vsync/test/unittest/vsync_helper_test.h create mode 100644 frameworks/vsync/test/unittest/vsync_manager_remote_test.cpp create mode 100644 frameworks/vsync/test/unittest/vsync_manager_remote_test.h create mode 100644 frameworks/vsync/test/unittest/vsync_manager_test.cpp create mode 100644 frameworks/vsync/test/unittest/vsync_manager_test.h create mode 100644 frameworks/vsync/test/unittest/vsync_module_test.cpp create mode 100644 frameworks/vsync/test/unittest/vsync_module_test.h create mode 100644 frameworks/wm/BUILD.gn create mode 100644 frameworks/wm/Readme.md create mode 100755 frameworks/wm/include/client/video_window.h create mode 100755 frameworks/wm/include/client/window_manager_controller_client.h create mode 100644 frameworks/wm/include/client/window_manager_proxy.h create mode 100644 frameworks/wm/include/iwindow_manager_service.h create mode 100644 frameworks/wm/include/server/layer_controller.h create mode 100644 frameworks/wm/include/server/window_manager_server.h create mode 100644 frameworks/wm/include/server/window_manager_stub.h create mode 100644 frameworks/wm/include/window_manager_define.h create mode 100644 frameworks/wm/include/window_manager_hilog.h create mode 100755 frameworks/wm/src/client/video_window.cpp create mode 100755 frameworks/wm/src/client/window_manager.cpp create mode 100755 frameworks/wm/src/client/window_manager_controller_client.cpp create mode 100644 frameworks/wm/src/client/window_manager_proxy.cpp create mode 100644 frameworks/wm/src/server/layer_controller.cpp create mode 100644 frameworks/wm/src/server/window_manager_server.cpp create mode 100644 frameworks/wm/src/server/window_manager_service.cpp create mode 100644 frameworks/wm/src/server/window_manager_stub.cpp create mode 100644 frameworks/wm/src/window_manager_test.cpp create mode 100644 frameworks/wm/test/BUILD.gn create mode 100644 frameworks/wm/test/unittest/BUILD.gn create mode 100644 frameworks/wm/test/unittest/wms_client/BUILD.gn create mode 100755 frameworks/wm/test/unittest/wms_client/window_manager_proxy_test/BUILD.gn create mode 100644 frameworks/wm/test/unittest/wms_client/window_manager_proxy_test/window_manager_proxy_test.cpp create mode 100644 frameworks/wm/test/unittest/wms_client/window_manager_proxy_test/window_manager_proxy_test.h create mode 100644 frameworks/wm/test/unittest/wms_client/windows_manager_test/BUILD.gn create mode 100644 frameworks/wm/test/unittest/wms_client/windows_manager_test/windows_manager_test.cpp create mode 100644 frameworks/wm/test/unittest/wms_client/windows_manager_test/windows_manager_test.h create mode 100755 frameworks/wm/test/unittest/wms_client/wm_controller_client_test/BUILD.gn create mode 100644 frameworks/wm/test/unittest/wms_client/wm_controller_client_test/window_controller_client_test.cpp create mode 100644 frameworks/wm/test/unittest/wms_client/wm_controller_client_test/window_controller_client_test.h create mode 100644 frameworks/wm/test/unittest/wms_server/BUILD.gn create mode 100644 frameworks/wm/test/unittest/wms_server/wm_controller_test/BUILD.gn create mode 100644 frameworks/wm/test/unittest/wms_server/wm_controller_test/wm_controller_test.cpp create mode 100644 frameworks/wm/test/unittest/wms_server/wm_controller_test/wm_controller_test.h create mode 100755 frameworks/wm/test/unittest/wms_server/wm_server_test/BUILD.gn create mode 100644 frameworks/wm/test/unittest/wms_server/wm_server_test/wm_server_test.cpp create mode 100644 frameworks/wm/test/unittest/wms_server/wm_server_test/wm_server_test.h create mode 100644 graphic.rc create mode 100644 interfaces/innerkits/surface/ibuffer_consumer_listener.h create mode 100644 interfaces/innerkits/surface/ibuffer_producer.h create mode 100644 interfaces/innerkits/surface/surface.h create mode 100644 interfaces/innerkits/surface/surface_buffer.h create mode 100644 interfaces/innerkits/surface/surface_type.h create mode 100644 interfaces/innerkits/vsync/client/vsync_helper.h create mode 100644 interfaces/innerkits/vsync/server/vsync_module.h create mode 100644 interfaces/innerkits/vsync/vsync_type.h create mode 100644 interfaces/innerkits/wm/window_manager.h create mode 100644 interfaces/innerkits/wm/window_manager_common.h create mode 100644 interfaces/kits/js/declaration/BUILD.gn create mode 100644 interfaces/kits/js/declaration/api/@ohos.window.d.ts create mode 100644 interfaces/kits/napi/BUILD.gn create mode 100755 interfaces/kits/napi/graphic/window/BUILD.gn create mode 100644 interfaces/kits/napi/graphic/window/native_module.cpp create mode 100644 interfaces/kits/napi/graphic/window/native_module.h create mode 100644 interfaces/kits/napi/graphic/window/window.cpp create mode 100644 interfaces/kits/napi/graphic/window/window.h create mode 100644 interfaces/kits/napi/graphic/window_hap/entry/package.json create mode 100644 interfaces/kits/napi/graphic/window_hap/entry/src/main/config.json create mode 100644 interfaces/kits/napi/graphic/window_hap/entry/src/main/java/com/test/window/Test.java create mode 100644 interfaces/kits/napi/graphic/window_hap/entry/src/main/java/com/test/window/TestAbility.java create mode 100644 interfaces/kits/napi/graphic/window_hap/entry/src/main/js/default/app.js create mode 100644 interfaces/kits/napi/graphic/window_hap/entry/src/main/js/default/i18n/en-US.json create mode 100644 interfaces/kits/napi/graphic/window_hap/entry/src/main/js/default/i18n/zh-CN.json create mode 100644 interfaces/kits/napi/graphic/window_hap/entry/src/main/js/default/pages/index/index.css create mode 100644 interfaces/kits/napi/graphic/window_hap/entry/src/main/js/default/pages/index/index.hml create mode 100644 interfaces/kits/napi/graphic/window_hap/entry/src/main/js/default/pages/index/index.js create mode 100644 interfaces/kits/napi/graphic/window_hap/entry/src/main/resources/base/element/string.json create mode 100644 interfaces/kits/napi/graphic/window_hap/entry/src/main/resources/base/media/icon.png create mode 100755 ohos.build create mode 100644 prebuilts/etcs/BUILD.gn create mode 100644 prebuilts/etcs/weston.ini create mode 100644 prebuilts/etcs/weston.rc create mode 100644 prebuilts/librarys/display_gralloc/BUILD.gn create mode 100644 utils/BUILD.gn create mode 100755 utils/include/buffer_handle.h create mode 100755 utils/include/buffer_handle_parcel.h create mode 100755 utils/src/buffer_handle.cpp diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..51c63e295e --- /dev/null +++ b/.gitattributes @@ -0,0 +1,15 @@ +*.tgz filter=lfs diff=lfs merge=lfs -text +*.trp filter=lfs diff=lfs merge=lfs -text +*.apk filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.mp4 filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.asm filter=lfs diff=lfs merge=lfs -text +*.8svn filter=lfs diff=lfs merge=lfs -text +*.9svn filter=lfs diff=lfs merge=lfs -text +*.dylib filter=lfs diff=lfs merge=lfs -text +*.exe filter=lfs diff=lfs merge=lfs -text +*.a filter=lfs diff=lfs merge=lfs -text +*.so filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.dll filter=lfs diff=lfs merge=lfs -text diff --git a/BUILD.gn b/BUILD.gn new file mode 100644 index 0000000000..e76a0f6f32 --- /dev/null +++ b/BUILD.gn @@ -0,0 +1,40 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build/ohos.gni") + +## Install graphic.rc to /system/etc/init/graphic.rc {{{ +ohos_prebuilt_etc("graphic.rc") { + source = "graphic.rc" + relative_install_dir = "init" + part_name = "graphic_standard" + subsystem_name = "graphic" +} + +## Install graphic.rc to /system/etc/init/graphic.rc }}} + +group("libsurface") { + public_deps = [ "frameworks/surface:surface" ] +} + +group("libvsync_client") { + public_deps = [ "frameworks/vsync:libvsync_client" ] +} + +group("libvsync_server") { + public_deps = [ "frameworks/vsync:libvsync_server" ] +} + +group("libwms_client") { + public_deps = [ "frameworks/wm:wms_client" ] +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..4947287f7b --- /dev/null +++ b/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 43e4465510..0000000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# graphic_standard - -#### Description -Window manager and compositor | 图形窗口合成器 - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md index 8eb47a9097..cf45c01755 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,715 @@ -# graphic_standard +# Graphics -#### 介绍 -Window manager and compositor | 图形窗口合成器 +- [Introduction](#section1333751883213) +- [Directory Structure](#section1882912343) +- [Constraints](#section68982123611) +- [Compilation and Building](#section671864110372) +- [Available APIs](#section197399520386) + - [WindowManager](#section5851104093816) + - [Window](#section3483122273912) + - [SubWindow](#section96481249183913) + - [Surface](#section12366161544010) + - [SurfaceBuffer](#section12001640184711) + - [VsyncHelper](#section1392116294211) -#### 软件架构 -软件架构说明 +- [Usage](#section18359134910422) + - [Transferring a Producer Surface](#section193464304411) + - [Creating a Producer Surface](#section1276823075112) + - [Producing a SurfaceBuffer](#section614545716513) + - [Consuming a SurfaceBuffer](#section315285412535) + - [Adding Custom Data to a SurfaceBuffer](#section612412125616) + - [Registering a Vsync Callback Listener](#section1148115214576) + +- [\#EN-US\_TOPIC\_0000001105482134/section1939493174420](#section1939493174420) +- [Repositories Involved](#section6488145313) + +## Introduction + +The Graphics subsystem provides graphics and window management capabilities, which can be invoked by using Java or JS APIs. It can be used for UI development for all standard-system devices. + +The following figure shows the architecture of the Graphics subsystem. + +![](figures/graphic.png) + +- Surface + + Provides APIs for managing the graphics buffer and the efficient and convenient rotation buffer. + +- Vsync + + Provides APIs for managing registration and response of all vertical sync signals. + +- WindowManager + + Provides APIs for creating and managing windows. + +- WaylandProtocols + + Provides the communication protocols between the window manager and synthesizer. + +- Compositor + + Implements synthesis of layers. + +- Renderer + + Functions as the back-end rendering module of the synthesizer. + +- Wayland protocols + + Provides Wayland inter-process communication protocols. + +- Shell + + Provides multi-window capabilities. + +- Input Manger + + Functions as the multimodal input module that receives input events. -#### 安装教程 +## Directory Structure -1. xxxx -2. xxxx -3. xxxx +``` +foundation/graphic/standard/ +├── frameworks # Framework code +│ ├── bootanimation # Boot Animation code +│ ├── surface # Surface code +│ ├── vsync # Vsync code +│ └── wm # WindowManager code +├── interfaces # External APIs +│ ├── innerkits # Native APIs +│ └── kits # JS APIs and NAPIs +└── utils # Utilities +``` -#### 使用说明 +## Constraints -1. xxxx -2. xxxx -3. xxxx +- Language version: C++ 11 or later -#### 参与贡献 +## Compilation and Building -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request +The dependent APIs include the following: + +- graphic\_standard:libwms\_client +- graphic\_standard:libsurface +- graphic\_standard:libvsync\_client + +## Available APIs + +### WindowManager + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

API

+

Description

+

GetInstance

+

Obtains the pointer to a singleton WindowManager instance.

+

GetMaxWidth

+

Obtains the width of the screen.

+

GetMaxHeight

+

Obtains the height of the screen.

+

CreateWindow

+

Creates a standard window.

+

CreateSubWindow

+

Creates a child window.

+

StartShotScreen

+

Takes a screenshot.

+

StartShotWindow

+

Captures a window.

+

SwitchTop

+

Moves the specified window to the top.

+
+ +### Window + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

API

+

Description

+

Show

+

Displays the current window.

+

Hide

+

Hides the current window.

+

Move

+

Moves the current window to a specified position.

+

SwitchTop

+

Moves the current window to the top.

+

ChangeWindowType

+

Changes the type of the current window.

+

ReSize

+

Resizes the current window.

+

Rotate

+

Rotates the current window.

+

RegistPointerButtonCb

+

Registers the callback for Button events of the mouse.

+

RegistPointerEnterCb

+

Registers the callback for Enter events of the mouse.

+

RegistPointerLeaveCb

+

Registers the callback for Leave events of the mouse.

+

RegistPointerMotionCb

+

Registers the callback for Motion events of the mouse.

+

RegistPointerAxisDiscreteCb

+

Registers the callback for AxisDiscrete events of the mouse.

+

RegistPointerAxisSourceCb

+

Registers the callback for AxisSource events of the mouse.

+

RegistPointerAxisStopCb

+

Registers the callback for AxisStop events of the mouse.

+

RegistPointerAxisCb

+

Registers the callback for Axis events of the mouse.

+

RegistTouchUpCb

+

Registers the callback for TouchUp events.

+

RegistTouchDownCb

+

Registers the callback for TouchDown events.

+

RegistTouchEmotionCb

+

Registers the callback for TouchEmotion events.

+

RegistTouchFrameCb

+

Registers the callback for TouchFrame events.

+

RegistTouchCancelCb

+

Registers the callback for TouchCancel events.

+

RegistTouchShapeCb

+

Registers the callback for TouchShape events.

+

RegistTouchOrientationCb

+

Registers the callback for TouchOrientation events.

+

RegistKeyboardKeyCb

+

Registers the callback for Key events of the keyboard.

+

RegistKeyboardKeyMapCb

+

Registers the callback for KeyMap events of the keyboard.

+

RegistKeyboardLeaveCb

+

Registers the callback for Leave events of the keyboard.

+

RegistKeyboardEnterCb

+

Registers the callback for Enter events of the keyboard.

+

RegistKeyboardRepeatInfoCb

+

Registers the callback for RepeatInfo events of the keyboard.

+
+ +### SubWindow + + + + + + + + + + + + + +

API

+

Description

+

Move

+

Moves the current child window.

+

SetSubWindowSize

+

Sets the size of the current child window.

+
+ +### Surface + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

API

+

Description

+

CreateSurfaceAsConsumer

+

Creates a surface for the buffer consumer.

+

CreateSurfaceAsProducer

+

Creates a surface for the buffer producer. Only production-related APIs can be used.

+

GetProducer

+

Obtains an internal IBufferProducer object of Surface.

+

RequestBuffer

+

Requests a SurfaceBuffer object to be produced.

+

CancelBuffer

+

Cancels a SurfaceBuffer object to be produced.

+

FlushBuffer

+

Flushes a produced SurfaceBuffer object with certain information.

+

AcquireBuffer

+

Requests a SurfaceBuffer object to be consumed.

+

ReleaseBuffer

+

Returns a consumed SurfaceBuffer object.

+

GetQueueSize

+

Obtains the number of concurrent buffers.

+

SetQueueSize

+

Sets the number of concurrent buffers.

+

SetDefaultWidthAndHeight

+

Sets the default width and height.

+

GetDefaultWidth

+

Obtains the default width.

+

GetDefaultHeight

+

Obtains the default height.

+

SetUserData

+

Stores string data, which will not be transferred through IPC.

+

GetUserData

+

Obtains string data.

+

RegisterConsumerListener

+

Registers a consumer listener to listen for buffer flush events.

+

UnregisterConsumerListener

+

Unregiseters a consumer listener.

+
+ +### SurfaceBuffer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

API

+

Description

+

GetBufferHandle

+

Obtains the BufferHandle pointer to the SurfaceBuffer object.

+

GetWidth

+

Obtains the width of the SurfaceBuffer object.

+

GetHeight

+

Obtains the height of the SurfaceBuffer object.

+

GetFormat

+

Obtains the color format of the SurfaceBuffer object.

+

GetUsage

+

Obtains the usage of the SurfaceBuffer object.

+

GetPhyAddr

+

Obtains the physical address of the SurfaceBuffer object.

+

GetKey

+

Obtains the key of the SurfaceBuffer object.

+

GetVirAddr

+

Obtains the virtual address of the SurfaceBuffer object.

+

GetSize

+

Obtains the size of the SurfaceBuffer object.

+

SetInt32

+

Sets the 32-bit integer for the SurfaceBuffer object.

+

GetInt32

+

Obtains the 32-bit integer for the SurfaceBuffer object.

+

SetInt64

+

Sets the 64-bit integer for the SurfaceBuffer object.

+

GetInt64

+

Obtains the 64-bit integer for the SurfaceBuffer object.

+
+ +### VsyncHelper + + + + + + + + + + + + + + + + +

API

+

Description

+

Current

+

Obtains the VsyncHelper object of the current runner.

+

VsyncHelper

+

Constructs a VsyncHelper object using an EventHandler object.

+

RequestFrameCallback

+

Registers a frame callback.

+
+ +## Usage + +### Transferring a Producer Surface + +1. Named service + - Service registration: + + ``` + // Obtain a consumer surface. + sptr surface = Surface::CreateSurfaceAsConsumer(); + // Extract the producer object. + sptr producer = surface->GetProducer(); + // Register the service. + auto sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + sm->AddSystemAbility(IPC_SA_ID, producer->AsObject()); + ``` + + - Construction of a producer surface: + + ``` + // Obtain a producer object. + auto sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + sptr robj = sm->GetSystemAbility(IPC_SA_ID); + // Construct a surface. + sptr bp = iface_cast(robj); + sptr surface = Surface::CreateSurfaceAsProducer(bp); + ``` -#### 特技 +2. Anonymous service + - Sending of a surface: + + ``` + // Obtain a consumer surface. + sptr surface = CreateSurfaceAsConsumer(); + // Extract the producer object. + sptr producer = surface->GetProducer(); + // Return the producer object to the client. + parcel.WriteRemoteObject(producer); + ``` + + + +### Creating a Producer Surface + +``` +// Obtain a producer object. +sptr remoteObject = parcel.ReadRemoteObject(); +// Construct a surface. +sptr bp = iface_cast(robj); +sptr surface = Surface::CreateSurfaceAsProducer(bp); +``` + +### Producing a SurfaceBuffer + +``` +// Prerequisite: a producer surface +BufferRequestConfig requestConfig = { + .width = 1920, // Screen width + .height = 1080, // Screen height + .strideAlignment = 8, // Stride alignment byte + .format = PIXEL_FMT_RGBA_8888, // Color format + .usage = HBM_USE_CPU_READ | HBM_USE_CPU_WRITE | HBM_USE_MEM_DMA, // Usage + .timeout = 0, // Delay +}; + +sptr buffer; +int32_t releaseFence; + +SurfaceError ret = surface->RequestBuffer(buffer, releaseFence, requestConfig); +if (ret != SURFACE_ERROR_OK) { + // failed +} + +BufferFlushConfig flushConfig = { + .damage = { // Redrawing buffer zone + .x = 0, // Horizontal coordinate of the start point + .y = 0, // Vertical coordinate of the start point + .w = buffer->GetWidth(), // Width of the buffer zone + .h = buffer->GetHeight(), // Height of the buffer zone + }, + .timestamp = 0 // Time displayed to consumers. Value 0 indicates the current time. +}; + +ret = surface->FlushBuffer(buffer, -1, flushConfig); +if (ret != SURFACE_ERROR_OK) { + // failed +} +``` + +### Consuming a SurfaceBuffer + +``` +// Prerequisite: a consumer surface +class TestConsumerListener : public IBufferConsumerListener { +public: + void OnBufferAvailable() override { + sptr buffer; + int32_t flushFence; + SurfaceError ret = surface->AcquireBuffer(buffer, flushFence, timestamp, damage); + if (ret != SURFACE_ERROR_OK) { + // failed + } + // ... + ret = surface->ReleaseBuffer(buffer, -1); + if (ret != SURFACE_ERROR_OK) { + // failed + } + } +}; + +sptr listener = new TestConsumerListener(); +SurfaceError ret = surface->RegisterConsumerListener(listener); +if (ret != SURFACE_ERROR_OK) { + // failed +} +``` + +### Adding Custom Data to a SurfaceBuffer + +``` +sptr buffer; +SurfaceError ret = buffer->SetInt32(1, 3); +if (ret != SURFACE_ERROR_OK) { +// failed +} + +int32_t val; +ret = buffer->GetInt32(1, val); +if (ret != SURFACE_ERROR_OK) { +// failed +} +``` + +### Registering a Vsync Callback Listener + +1. Construct a **VsyncHelper** object using **handler**. + + ``` + auto runner = AppExecFwk::EventRunner::Create(true); + auto handler = std::make_shared(runner); + auto helper = new VsyncHelper(handler); + runner->Run(); + + struct FrameCallback cb = { + .timestamp_ = 0, + .userdata_ = nullptr, + .callback_ = [](int64_t timestamp, void* userdata) { + }, + }; + + VsyncError ret = helper->RequestFrameCallback(cb); + if (ret != VSYNC_ERROR_OK) { + // failed + } + ``` + +2. Use **Current** in **handler**. + + ``` + auto runner = AppExecFwk::EventRunner::Create(true); + auto handler = std::make_shared(runner); + handler->PostTask([]() { + auto helper = VsyncHelper::Current(); + struct FrameCallback cb = { + .timestamp_ = 0, + .userdata_ = nullptr, + .callback_ = [](int64_t timestamp, void* userdata) { + }, + }; + VsyncError ret = helper->RequestFrameCallback(cb); + if (ret != VSYNC_ERROR_OK) { + // failed + } + }); + + runner->Run(); + ``` + + +## Repositories Involved + +Graphics subsystem + +**graphic\_standard** + +ace\_ace\_engine + +aafwk\_L2 + +multimedia\_media\_standard + +multimedia\_camera\_standard -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 0000000000..3ffb0ca2f2 --- /dev/null +++ b/README_zh.md @@ -0,0 +1,361 @@ +# graphic_standard + +- [简介](#简介) +- [目录](#目录) +- [约束](#约束) +- [编译构建](#编译构建) +- [接口说明](#接口说明) +- [使用说明](#使用说明) +- [相关仓](#相关仓) + +## 简介 + +**Graphic子系统** 提供了图形接口能力和窗口管理接口能力, + +其主要的结构如下图所示: + +![Graphic子系统架构图](./figures/graphic.png) + +- **Surface** + + 图形缓冲区管理接口,负责管理图形缓冲区和高效便捷的轮转缓冲区。 + +- **Vsync** + + 垂直同步信号管理接口,负责管理所有垂直同步信号注册和响应。 + +- **WindowManager** + + 窗口管理器接口,负责创建和管理窗口。 + +- **WaylandProtocols** + + 窗口管理器和合成器的通信协议。 + +- **Compositor** + + 合成器,负责合成各个图层。 + +- **Renderer** + + 合成器的后端渲染模块。 + +- **Wayland protocols** + + Wayland 进程间通信协议 + +- **Shell** + + 提供多窗口能力 + +- **Input Manger** + + 多模输入模块,负责接收事件输入 + + +## 目录 +``` +foundation/graphic/standard/ +├── frameworks # 框架代码目录 +│ ├── bootanimation # 开机动画目录 +│   ├── surface # Surface代码 +│   ├── vsync # Vsync代码 +│   └── wm # WindowManager代码 +├── interfaces # 对外接口存放目录 +│   ├── innerkits # native接口存放目录 +│   └── kits # js/napi接口存放目录 +└── utils # 小部件存放目录 +``` + +## 约束 +- 语言版本 + - C++11或以上 + +## 编译构建 +可以依赖的接口有: +- graphic_standard:libwms_client +- graphic_standard:libsurface +- graphic_standard:libvsync_client + +## 接口说明 + +### WindowManager + +| 接口名 | 职责 | +|-----------------|-----------------------------| +| GetInstance | 获取WindowManager的单例指针 | +| GetMaxWidth | 获取当前屏幕宽度 | +| GetMaxHeight | 获取当前屏幕高度 | +| CreateWindow | 创建一个标准窗口 | +| CreateSubWindow | 创建一个子窗口 | +| StartShotScreen | 截屏操作 | +| StartShotWindow | 截取窗口操作 | +| SwitchTop | 将指定窗口调整至最上层显示 | + +### Window +| 接口名 | 职责 | +|-----------------------------|------------------------------| +| Show | 显示当前窗口 | +| Hide | 隐藏当前窗口 | +| Move | 移动当前窗口至指定位置 | +| SwitchTop | 将当前窗口调整到最上层显示 | +| ChangeWindowType | 更改当前窗口类型 | +| ReSize | 调整当前窗口至指定大小 | +| Rotate | 旋转当前窗口 | +| RegistPointerButtonCb | 注册鼠标Button事件回调 | +| RegistPointerEnterCb | 注册鼠标Enter事件回调 | +| RegistPointerLeaveCb | 注册鼠标Leave事件回调 | +| RegistPointerMotionCb | 注册鼠标Motion事件回调 | +| RegistPointerAxisDiscreteCb | 注册鼠标AxisDiscrete事件回调 | +| RegistPointerAxisSourceCb | 注册鼠标AxisSource事件回调 | +| RegistPointerAxisStopCb | 注册鼠标AxisStop事件回调 | +| RegistPointerAxisCb | 注册鼠标Axis事件回调 | +| RegistTouchUpCb | 注册TouchUp事件回调 | +| RegistTouchDownCb | 注册TouchDown事件回调 | +| RegistTouchEmotionCb | 注册TouchEmotion事件回调 | +| RegistTouchFrameCb | 注册TouchFrame事件回调 | +| RegistTouchCancelCb | 注册TouchCancel事件回调 | +| RegistTouchShapeCb | 注册TouchShape事件回调 | +| RegistTouchOrientationCb | 注册TouchOrientation事件回调 | +| RegistKeyboardKeyCb | 注册键盘Key事件回调 | +| RegistKeyboardKeyMapCb | 注册键盘KeyMap事件回调 | +| RegistKeyboardLeaveCb | 注册键盘Leave事件回调 | +| RegistKeyboardEnterCb | 注册键盘Enter事件回调 | +| RegistKeyboardRepeatInfoCb | 注册键盘RepeatInfo事件回调 | + +### SubWindow +| 接口名 | 职责 | +|------------------|--------------------| +| Move | 移动当前子窗口 | +| SetSubWindowSize | 调整当前子窗口位置 | + +### Surface +| 接口名 | 职责 | +|----------------------------|-------------------------------------------------------------------| +| CreateSurfaceAsConsumer | Buffer的消费者来使用该函数创建一个Surface | +| CreateSurfaceAsProducer | Buffer的生产者使用该函数创建一个Surface,只能使用与生产相关的接口 | +| GetProducer | 获得一个Surface内部的IBufferProducer对象 | +| RequestBuffer | 请求一个待生产的SurfaceBuffer对象 | +| CancelBuffer | 取消、归还一个待生产的SurfaceBuffer对象 | +| FlushBuffer | 归还一个生产好的SurfaceBuffer对象并携带一些信息 | +| AcquireBuffer | 请求一个待消费的SurfaceBuffer对象 | +| ReleaseBuffer | 归还一个已消费的SurfaceBuffer对象 | +| GetQueueSize | 获得当前同时能并存buffer的数量 | +| SetQueueSize | 设置当前同时能并存buffer的数量 | +| SetDefaultWidthAndHeight | 设置默认宽和高 | +| GetDefaultWidth | 获得默认宽度 | +| GetDefaultHeight | 获得默认高度 | +| SetUserData | 存贮字符串数据,不随着IPC传递 | +| GetUserData | 取出字符串数据 | +| RegisterConsumerListener | 注册一个消费监听器,监听Buffer的Flush事件 | +| UnregisterConsumerListener | 取消监听 | + +### SurfaceBuffer +| 接口名 | 职责 | +|-----------------|-------------------------------------| +| GetBufferHandle | 获得SurfaceBuffer的BufferHandle指针 | +| GetWidth | 获得SurfaceBuffer的宽度 | +| GetHeight | 获得SurfaceBuffer的高度 | +| GetFormat | 获得SurfaceBuffer的颜色格式 | +| GetUsage | 获得SurfaceBuffer的用途 | +| GetPhyAddr | 获得SurfaceBuffer的物理地址 | +| GetKey | 获得SurfaceBuffer的key | +| GetVirAddr | 获得SurfaceBuffer的虚拟地址 | +| GetSize | 获得SurfaceBuffer的文件句柄 | +| SetInt32 | 获得SurfaceBuffer的缓冲区大小 | +| GetInt32 | 设置SurfaceBuffer的32位整数 | +| SetInt64 | 获得SurfaceBuffer的32位整数 | +| GetInt64 | 设置SurfaceBuffer的64位整数 | + +### VsyncHelper +| 接口名 | 职责 | +|----------------------|-----------------------------------| +| Current | 获取当前runner对应的VsyncHelper | +| VsyncHelper | 用EventHandler对象构造VsyncHelper | +| RequestFrameCallback | 注册一个帧回调 | + +## 使用说明 + +### 具名服务-传递一个生产型Surface + +#### 注册 +```cpp +// 拿到一个消费型Surface +sptr surface = Surface::CreateSurfaceAsConsumer(); + +// 拿出里面的生产者对象 +sptr producer = surface->GetProducer(); + +// 注册服务 +auto sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); +sm->AddSystemAbility(IPC_SA_ID, producer->AsObject()); +``` + +#### 客户端获得生产型Surface +```cpp +// 获得远程对象 +auto sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); +sptr robj = sm->GetSystemAbility(IPC_SA_ID); + +// 构造Surface +sptr bp = iface_cast(robj); +sptr surface = Surface::CreateSurfaceAsProducer(bp); +``` + +### 匿名服务-传递一个生产型Surface +场景: 在一次IPC过程中 + +#### 发送 +```cpp +// 拿到一个消费型Surface +sptr surface = CreateSurfaceAsConsumer(); + +// 拿出里面的生产者对象 +sptr producer = surface->GetProducer(); + +// 返回给客户端 +parcel.WriteRemoteObject(producer); +``` + +#### 接受并获得生产型Surface +```cpp +// 获得远程对象 +sptr remoteObject = parcel.ReadRemoteObject(); + +// 构造Surface +sptr bp = iface_cast(robj); +sptr surface = Surface::CreateSurfaceAsProducer(bp); +``` + +### 生产一个SurfaceBuffer +条件: 一个生产型Surface + +```cpp +BufferRequestConfig requestConfig = { + .width = 1920, // 屏幕宽度 + .height = 1080, // 屏幕高度 + .strideAlignment = 8, // stride对齐字节 + .format = PIXEL_FMT_RGBA_8888, // 颜色格式 + .usage = HBM_USE_CPU_READ | HBM_USE_CPU_WRITE | HBM_USE_MEM_DMA, // 用法 + .timeout = 0, // 时延 +}; + +sptr buffer; +int32_t releaseFence; + +SurfaceError ret = surface->RequestBuffer(buffer, releaseFence, requestConfig); +if (ret != SURFACE_ERROR_OK) { + // failed +} + +BufferFlushConfig flushConfig = { + .damage = { // 重绘区域 + .x = 0, // 起点横坐标 + .y = 0, // 起点纵坐标 + .w = buffer->GetWidth(), // 区域宽度 + .h = buffer->GetHeight(), // 区域高度 + }, + .timestamp = 0 // 给消费者看的时间,0为使用当前时间 +}; + +ret = surface->FlushBuffer(buffer, -1, flushConfig); +if (ret != SURFACE_ERROR_OK) { + // failed +} +``` + +### 消费一个SurfaceBuffer +条件: 一个消费型Surface + +```cpp +class TestConsumerListener : public IBufferConsumerListener { +public: + void OnBufferAvailable() override { + sptr buffer; + int32_t flushFence; + + SurfaceError ret = surface->AcquireBuffer(buffer, flushFence, timestamp, damage); + if (ret != SURFACE_ERROR_OK) { + // failed + } + + // ... + + ret = surface->ReleaseBuffer(buffer, -1); + if (ret != SURFACE_ERROR_OK) { + // failed + } + } +}; + +sptr listener = new TestConsumerListener(); +SurfaceError ret = surface->RegisterConsumerListener(listener); +if (ret != SURFACE_ERROR_OK) { + // failed +} +``` + +### 给SurfaceBuffer带上自定义数据 +```cpp +sptr buffer; +SurfaceError ret = buffer->SetInt32(1, 3); +if (ret != SURFACE_ERROR_OK) { + // failed +} + +int32_t val; +ret = buffer->GetInt32(1, val); +if (ret != SURFACE_ERROR_OK) { + // failed +} +``` + +### 注册一个Vsync回调事件 +#### 用handler构造VsyncHelper +```cpp +auto runner = AppExecFwk::EventRunner::Create(true); +auto handler = std::make_shared(runner); +auto helper = new VsyncHelper(handler); +runner->Run(); + +struct FrameCallback cb = { + .timestamp_ = 0, + .userdata_ = nullptr, + .callback_ = [](int64_t timestamp, void* userdata) { + }, +}; + +VsyncError ret = helper->RequestFrameCallback(cb); +if (ret != VSYNC_ERROR_OK) { + // failed +} +``` + +#### 在handler里用Current +```cpp +auto runner = AppExecFwk::EventRunner::Create(true); +auto handler = std::make_shared(runner); +handler->PostTask([]() { + auto helper = VsyncHelper::Current(); + struct FrameCallback cb = { + .timestamp_ = 0, + .userdata_ = nullptr, + .callback_ = [](int64_t timestamp, void* userdata) { + }, + }; + + VsyncError ret = helper->RequestFrameCallback(cb); + if (ret != VSYNC_ERROR_OK) { + // failed + } +}); + +runner->Run(); +``` + +## 相关仓 +- **graphic_standard** +- ace_ace_engine +- aafwk_standard +- multimedia_media_standard +- multimedia_camera_standard diff --git a/figures/graphic.png b/figures/graphic.png new file mode 100644 index 0000000000000000000000000000000000000000..b72003f5221553d66ae4b4183f92bcfcac595bc2 GIT binary patch literal 46331 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