From d196cf7d82a956aaaf2291f9187b929c48d52887 Mon Sep 17 00:00:00 2001 From: xuyuqiong Date: Tue, 11 Jan 2022 16:08:29 +0800 Subject: [PATCH] add backlight interface to ScreenManager Signed-off-by: xuyuqiong Change-Id: I192afbb3d217df353d90666070d2b1f341bc5de5 --- .../core/pipeline/rs_render_service.cpp | 20 +++ .../core/pipeline/rs_render_service.h | 4 + .../core/screen_manager/rs_screen.cpp | 16 +++ .../core/screen_manager/rs_screen.h | 4 + .../core/screen_manager/rs_screen_manager.cpp | 27 ++++ .../core/screen_manager/rs_screen_manager.h | 9 ++ .../transaction/rs_render_service_stub.cpp | 22 +++ .../platform/ohos/rs_irender_service.h | 5 + .../include/screen_manager/screen_types.h | 2 + .../transaction/rs_render_service_client.h | 4 + .../ohos/rs_render_service_client.cpp | 20 +++ .../platform/ohos/rs_render_service_proxy.cpp | 35 +++++ .../platform/ohos/rs_render_service_proxy.h | 4 + .../core/transaction/rs_interfaces.cpp | 10 ++ .../core/transaction/rs_interfaces.h | 4 + .../render_service_client/test/BUILD.gn | 1 + .../test/virtual_display_test.cpp | 129 ++++++++++++++++-- 17 files changed, 301 insertions(+), 15 deletions(-) diff --git a/rosen/modules/render_service/core/pipeline/rs_render_service.cpp b/rosen/modules/render_service/core/pipeline/rs_render_service.cpp index 676ab57a39..1cc9a81752 100644 --- a/rosen/modules/render_service/core/pipeline/rs_render_service.cpp +++ b/rosen/modules/render_service/core/pipeline/rs_render_service.cpp @@ -277,5 +277,25 @@ RSScreenData RSRenderService::GetScreenData(ScreenId id) return screenManager_->GetScreenData(id); }).get(); } + +int32_t RSRenderService::GetScreenBacklight(ScreenId id) +{ + if (screenManager_ == nullptr) { + return INVALID_BACKLIGHT_VALUE; + } + return mainThread_->ScheduleTask([=]() { + return screenManager_->GetScreenBacklight(id); + }).get(); +} + +void RSRenderService::SetScreenBacklight(ScreenId id, uint32_t level) +{ + if (screenManager_ == nullptr) { + return; + } + mainThread_->ScheduleTask([=]() { + screenManager_->SetScreenBacklight(id, level); + }).wait(); +} } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service/core/pipeline/rs_render_service.h b/rosen/modules/render_service/core/pipeline/rs_render_service.h index a8986fbdd2..afc26a504c 100644 --- a/rosen/modules/render_service/core/pipeline/rs_render_service.h +++ b/rosen/modules/render_service/core/pipeline/rs_render_service.h @@ -75,6 +75,10 @@ private: RSScreenData GetScreenData(ScreenId id) override; + int32_t GetScreenBacklight(ScreenId id) override; + + void SetScreenBacklight(ScreenId id, uint32_t level) override; + RSMainThread* mainThread_ = nullptr; sptr screenManager_; diff --git a/rosen/modules/render_service/core/screen_manager/rs_screen.cpp b/rosen/modules/render_service/core/screen_manager/rs_screen.cpp index 289fa90805..e3317d2f72 100644 --- a/rosen/modules/render_service/core/screen_manager/rs_screen.cpp +++ b/rosen/modules/render_service/core/screen_manager/rs_screen.cpp @@ -331,6 +331,22 @@ void RSScreen::SurfaceDump(int32_t screenIndex, std::string& dumpString) { //hdiOutput_->Dump(dumpString); } + +void RSScreen::SetScreenBacklight(uint32_t level) +{ + if (hdiScreen_->SetScreenBacklight(level) < 0) { + return; + } +} + +int32_t RSScreen::GetScreenBacklight() const +{ + uint32_t level = 0; + if (hdiScreen_->GetScreenBacklight(level) < 0) { + return INVALID_BACKLIGHT_VALUE; + } + return static_cast(level); +} } // namespace impl } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service/core/screen_manager/rs_screen.h b/rosen/modules/render_service/core/screen_manager/rs_screen.h index f0f9029745..0c68f2c3f1 100644 --- a/rosen/modules/render_service/core/screen_manager/rs_screen.h +++ b/rosen/modules/render_service/core/screen_manager/rs_screen.h @@ -60,6 +60,8 @@ public: virtual sptr GetProducerSurface() const = 0; virtual void DisplayDump(int32_t screenIndex, std::string& dumpString) = 0; virtual void SurfaceDump(int32_t screenIndex, std::string& dumpString) = 0; + virtual void SetScreenBacklight(uint32_t level) = 0; + virtual int32_t GetScreenBacklight() const = 0; }; namespace impl { @@ -94,6 +96,8 @@ public: sptr GetProducerSurface() const override; void DisplayDump(int32_t screenIndex, std::string& dumpString) override; void SurfaceDump(int32_t screenIndex, std::string& dumpString) override; + void SetScreenBacklight(uint32_t level) override; + int32_t GetScreenBacklight() const override; private: // TODO: fixme -- domain 0 only for debug. diff --git a/rosen/modules/render_service/core/screen_manager/rs_screen_manager.cpp b/rosen/modules/render_service/core/screen_manager/rs_screen_manager.cpp index c1c57af69c..df363fd281 100644 --- a/rosen/modules/render_service/core/screen_manager/rs_screen_manager.cpp +++ b/rosen/modules/render_service/core/screen_manager/rs_screen_manager.cpp @@ -421,6 +421,33 @@ RSScreenData RSScreenManager::GetScreenData(ScreenId id) const return screenData; } +int32_t RSScreenManager::GetScreenBacklight(ScreenId id) +{ + std::lock_guard lock(mutex_); + return GetScreenBacklightlocked(id); +} + +int32_t RSScreenManager::GetScreenBacklightlocked(ScreenId id) const +{ + if (screens_.count(id) == 0) { + HiLog::Error(LOG_LABEL, "%{public}s: There is no screen for id %{public}" PRIu64 ".\n", __func__, id); + return INVALID_BACKLIGHT_VALUE; + } + + int32_t level = screens_.at(id)->GetScreenBacklight(); + return level; +} + +void RSScreenManager::SetScreenBacklight(ScreenId id, uint32_t level) +{ + std::lock_guard lock(mutex_); + if (screens_.count(id) == 0) { + HiLog::Error(LOG_LABEL, "%{public}s: There is no screen for id %{public}" PRIu64 ".\n", __func__, id); + return; + } + screens_.at(id)->SetScreenBacklight(level); +} + ScreenInfo RSScreenManager::QueryScreenInfo(ScreenId id) const { std::lock_guard lock(mutex_); diff --git a/rosen/modules/render_service/core/screen_manager/rs_screen_manager.h b/rosen/modules/render_service/core/screen_manager/rs_screen_manager.h index 672b5a892f..a34bed2187 100644 --- a/rosen/modules/render_service/core/screen_manager/rs_screen_manager.h +++ b/rosen/modules/render_service/core/screen_manager/rs_screen_manager.h @@ -107,6 +107,10 @@ public: virtual void DisplayDump(std::string& dumpString) = 0; virtual void SurfaceDump(std::string& dumpString) = 0; + + virtual int32_t GetScreenBacklight(ScreenId id) = 0; + + virtual void SetScreenBacklight(ScreenId id, uint32_t level) = 0; }; sptr CreateOrGetScreenManager(); @@ -176,6 +180,10 @@ public: void SurfaceDump(std::string& dumpString) override; + int32_t GetScreenBacklight(ScreenId id) override; + + void SetScreenBacklight(ScreenId id, uint32_t level) override; + private: RSScreenManager(); ~RSScreenManager() noexcept override; @@ -194,6 +202,7 @@ private: std::vector GetScreenSupportedModesLocked(ScreenId id) const; RSScreenCapability GetScreenCapabilityLocked(ScreenId id) const; ScreenPowerStatus GetScreenPowerStatuslocked(ScreenId id) const; + int32_t GetScreenBacklightlocked(ScreenId id) const; void RemoveVirtualScreenLocked(ScreenId id); ScreenId GenerateVirtualScreenIdLocked(); diff --git a/rosen/modules/render_service/core/transaction/rs_render_service_stub.cpp b/rosen/modules/render_service/core/transaction/rs_render_service_stub.cpp index 83d24b45b4..5047154da7 100644 --- a/rosen/modules/render_service/core/transaction/rs_render_service_stub.cpp +++ b/rosen/modules/render_service/core/transaction/rs_render_service_stub.cpp @@ -222,6 +222,28 @@ int RSRenderServiceStub::OnRemoteRequest(uint32_t code, MessageParcel& data, Mes } break; } + case GET_SCREEN_BACK_LIGHT: { + auto token = data.ReadInterfaceToken(); + if (token != RSIRenderService::GetDescriptor()) { + ret = ERR_INVALID_STATE; + break; + } + ScreenId id = data.ReadUint64(); + int32_t level = GetScreenBacklight(id); + reply.WriteInt32(level); + break; + } + case SET_SCREEN_BACK_LIGHT: { + auto token = data.ReadInterfaceToken(); + if (token != RSIRenderService::GetDescriptor()) { + ret = ERR_INVALID_STATE; + break; + } + ScreenId id = data.ReadUint64(); + uint32_t level = data.ReadUint32(); + SetScreenBacklight(id, level); + break; + } default: break; } diff --git a/rosen/modules/render_service_base/include/platform/ohos/rs_irender_service.h b/rosen/modules/render_service_base/include/platform/ohos/rs_irender_service.h index 1bb35dc258..74c0df8e2c 100644 --- a/rosen/modules/render_service_base/include/platform/ohos/rs_irender_service.h +++ b/rosen/modules/render_service_base/include/platform/ohos/rs_irender_service.h @@ -53,12 +53,14 @@ public: SET_SCREEN_ACTIVE_MODE, SET_SCREEN_POWER_STATUS, TAKE_SURFACE_CAPTURE, + SET_SCREEN_BACK_LIGHT, GET_SCREEN_ACTIVE_MODE, GET_SCREEN_SUPPORTED_MODES, GET_SCREEN_CAPABILITY, GET_SCREEN_POWER_STATUS, GET_SCREEN_DATA, EXECUTE_SYNCHRONOUS_TASK, + GET_SCREEN_BACK_LIGHT, }; virtual void CommitTransaction(std::unique_ptr& transactionData) = 0; @@ -98,6 +100,9 @@ public: virtual RSScreenData GetScreenData(ScreenId id) = 0; + virtual int32_t GetScreenBacklight(ScreenId id) = 0; + + virtual void SetScreenBacklight(ScreenId id, uint32_t level) = 0; }; } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_base/include/screen_manager/screen_types.h b/rosen/modules/render_service_base/include/screen_manager/screen_types.h index df23985a26..5f4f362d9e 100644 --- a/rosen/modules/render_service_base/include/screen_manager/screen_types.h +++ b/rosen/modules/render_service_base/include/screen_manager/screen_types.h @@ -29,6 +29,8 @@ using ScreenPhysicalId = uint32_t; constexpr ScreenId INVALID_SCREEN_ID = ~(static_cast(0)); +constexpr int32_t INVALID_BACKLIGHT_VALUE = -1; + inline constexpr ScreenId ToScreenId(ScreenPhysicalId physicalId) { return static_cast(physicalId); diff --git a/rosen/modules/render_service_base/include/transaction/rs_render_service_client.h b/rosen/modules/render_service_base/include/transaction/rs_render_service_client.h index 0f25548fa2..0d14defe56 100644 --- a/rosen/modules/render_service_base/include/transaction/rs_render_service_client.h +++ b/rosen/modules/render_service_base/include/transaction/rs_render_service_client.h @@ -87,6 +87,10 @@ public: RSScreenData GetScreenData(ScreenId id); + int32_t GetScreenBacklight(ScreenId id); + + void SetScreenBacklight(ScreenId id, uint32_t level); + private: void TriggerSurfaceCaptureCallback(NodeId id, Media::PixelMap* pixelmap); friend class SurfaceCaptureCallbackDirector; diff --git a/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_client.cpp b/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_client.cpp index 96b5096d6f..c88d10842d 100644 --- a/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_client.cpp +++ b/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_client.cpp @@ -253,5 +253,25 @@ RSScreenData RSRenderServiceClient::GetScreenData(ScreenId id) return renderService->GetScreenData(id); } + +int32_t RSRenderServiceClient::GetScreenBacklight(ScreenId id) +{ + auto renderService = RSRenderServiceConnect::GetRenderService(); + if (renderService == nullptr) { + return INVALID_BACKLIGHT_VALUE; + } + + return renderService->GetScreenBacklight(id); +} + +void RSRenderServiceClient::SetScreenBacklight(ScreenId id, uint32_t level) +{ + auto renderService = RSRenderServiceConnect::GetRenderService(); + if (renderService == nullptr) { + return; + } + + renderService->SetScreenBacklight(id, level); +} } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_proxy.cpp b/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_proxy.cpp index 3085cae566..891a28bf15 100644 --- a/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_proxy.cpp +++ b/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_proxy.cpp @@ -361,5 +361,40 @@ int RSRenderServiceProxy::Dump(int fd, const std::vector &args) { return Remote()->Dump(fd, args); } + +int32_t RSRenderServiceProxy::GetScreenBacklight(ScreenId id) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!data.WriteInterfaceToken(RSIRenderService::GetDescriptor())) { + return INVALID_BACKLIGHT_VALUE; + } + option.SetFlags(MessageOption::TF_SYNC); + data.WriteUint64(id); + int32_t err = Remote()->SendRequest(RSIRenderService::GET_SCREEN_BACK_LIGHT, data, reply, option); + if (err != NO_ERROR) { + return INVALID_BACKLIGHT_VALUE; + } + int32_t level = reply.ReadInt32(); + return level; +} + +void RSRenderServiceProxy::SetScreenBacklight(ScreenId id, uint32_t level) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!data.WriteInterfaceToken(RSIRenderService::GetDescriptor())) { + return; + } + option.SetFlags(MessageOption::TF_SYNC); + data.WriteUint64(id); + data.WriteUint32(level); + int32_t err = Remote()->SendRequest(RSIRenderService::SET_SCREEN_BACK_LIGHT, data, reply, option); + if (err != NO_ERROR) { + return; + } +} } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_proxy.h b/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_proxy.h index 0f278d9c3e..ec286fbf54 100644 --- a/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_proxy.h +++ b/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_proxy.h @@ -70,6 +70,10 @@ public: int Dump(int fd, const std::vector &args); + int32_t GetScreenBacklight(ScreenId id) override; + + void SetScreenBacklight(ScreenId id, uint32_t level) override; + private: static inline BrokerDelegator delegator_; }; diff --git a/rosen/modules/render_service_client/core/transaction/rs_interfaces.cpp b/rosen/modules/render_service_client/core/transaction/rs_interfaces.cpp index 3ef41a01c3..79358203e4 100644 --- a/rosen/modules/render_service_client/core/transaction/rs_interfaces.cpp +++ b/rosen/modules/render_service_client/core/transaction/rs_interfaces.cpp @@ -97,5 +97,15 @@ RSScreenData RSInterfaces::GetScreenData(ScreenId id) { return renderServiceClient_->GetScreenData(id); } + +int32_t RSInterfaces::GetScreenBacklight(ScreenId id) +{ + return renderServiceClient_->GetScreenBacklight(id); +} + +void RSInterfaces::SetScreenBacklight(ScreenId id, uint32_t level) +{ + renderServiceClient_->SetScreenBacklight(id, level); +} } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_client/core/transaction/rs_interfaces.h b/rosen/modules/render_service_client/core/transaction/rs_interfaces.h index 737699eb8a..ee09407b60 100644 --- a/rosen/modules/render_service_client/core/transaction/rs_interfaces.h +++ b/rosen/modules/render_service_client/core/transaction/rs_interfaces.h @@ -60,6 +60,10 @@ public: RSScreenData GetScreenData(ScreenId id); + int32_t GetScreenBacklight(ScreenId id); + + void SetScreenBacklight(ScreenId id, uint32_t level); + private: RSInterfaces(); ~RSInterfaces() noexcept; diff --git a/rosen/modules/render_service_client/test/BUILD.gn b/rosen/modules/render_service_client/test/BUILD.gn index cf3401ef60..0d5ff65020 100644 --- a/rosen/modules/render_service_client/test/BUILD.gn +++ b/rosen/modules/render_service_client/test/BUILD.gn @@ -88,6 +88,7 @@ ohos_executable("virtual_display_demo") { "//foundation/graphic/standard/rosen/modules/render_service_base:librender_service_base", "//foundation/graphic/standard/rosen/modules/render_service_client:librender_service_client", "//foundation/multimedia/image_standard/interfaces/innerkits:image_native", + "//third_party/libpng:libpng", "//third_party/zlib:libz", ] diff --git a/rosen/modules/render_service_client/test/virtual_display_test.cpp b/rosen/modules/render_service_client/test/virtual_display_test.cpp index 385b0a86f2..838e5b4f99 100644 --- a/rosen/modules/render_service_client/test/virtual_display_test.cpp +++ b/rosen/modules/render_service_client/test/virtual_display_test.cpp @@ -32,7 +32,9 @@ #include "include/core/SkImageInfo.h" #include "pipeline/rs_render_result.h" #include "pipeline/rs_render_thread.h" +#include "png.h" #include "render_context/render_context.h" +#include "string_ex.h" #include "surface_buffer.h" #include "ui/rs_node.h" #include "ui/rs_surface_extractor.h" @@ -45,7 +47,6 @@ #include "foundation/graphic/standard/rosen/modules/render_service_base/src/platform/ohos/rs_surface_frame_ohos.h" #include "foundation/graphic/standard/rosen/modules/render_service_base/src/platform/ohos/rs_surface_ohos.h" -#define ACE_ENABLE_GL using namespace OHOS; using namespace OHOS::Rosen; @@ -55,6 +56,9 @@ namespace detail { constexpr int MILLI_SECS_PER_SECOND = 1000; constexpr int MICRO_SECS_PER_MILLISECOND = 1000; constexpr int MICRO_SECS_PER_SECOND = MICRO_SECS_PER_MILLISECOND * MILLI_SECS_PER_SECOND; +constexpr uint8_t BIT_DEPTH_VALUE = 8; +constexpr int SLEEP_TIME = 20; +constexpr int MAX_BACKLIGHT = 100; RenderContext* renderContext = nullptr; @@ -62,6 +66,61 @@ template using SysTime = std::chrono::time_point; using SysMicroSeconds = SysTime; +using WriteToPngParam = struct { + uint32_t width; + uint32_t height; + uint32_t stride; + uint32_t bitDepth; + const uint8_t *data; +}; + +bool WriteToPng(const std::string &fileName, const WriteToPngParam ¶m) +{ + png_structp pngStruct = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); + if (pngStruct == nullptr) { + std::cout << "png_create_write_struct error, nullptr!" << std::endl; + return false; + } + png_infop pngInfo = png_create_info_struct(pngStruct); + if (pngInfo == nullptr) { + std::cout << "png_create_info_struct error, nullptr!" << std::endl; + png_destroy_write_struct(&pngStruct, nullptr); + return false; + } + FILE *fp = fopen(fileName.c_str(), "wb"); + if (fp == nullptr) { + std::cout << "open file error, nullptr!" << std::endl; + png_destroy_write_struct(&pngStruct, &pngInfo); + return false; + } + png_init_io(pngStruct, fp); + + // set png header + png_set_IHDR(pngStruct, pngInfo, + param.width, param.height, + param.bitDepth, + PNG_COLOR_TYPE_RGBA, + PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, + PNG_FILTER_TYPE_BASE); + png_set_packing(pngStruct); // set packing info + png_write_info(pngStruct, pngInfo); // write to header + + for (uint32_t i = 0; i < param.height; i++) { + png_write_row(pngStruct, param.data + (i * param.stride)); + } + + png_write_end(pngStruct, pngInfo); + + // free + png_destroy_write_struct(&pngStruct, &pngInfo); + int ret = fclose(fp); + if (ret != 0) { + std::cout << "close fp failed" << std::endl; + } + return true; +} + uint64_t MicroSecondsSinceEpoch() { SysMicroSeconds tmp = std::chrono::system_clock::now(); @@ -223,6 +282,26 @@ public: return displayId; } + int32_t GetDisplayBacklight(DisplayId id) + { + std::lock_guard lock(mutex_); + if (displays_.count(id) == 0) { + cout << "MyDMS: No display " << id << "!" << endl; + return -1; + } + return rsInterface_.GetScreenBacklight(id); + } + + void SetDisplayBacklight(DisplayId id, uint32_t level) + { + std::lock_guard lock(mutex_); + if (displays_.count(id) == 0) { + cout << "MyDMS: No display " << id << "!" << endl; + return; + } + return rsInterface_.SetScreenBacklight(id, level); + } + std::optional GetDisplayActiveMode(DisplayId id) const { std::lock_guard lock(mutex_); @@ -312,24 +391,36 @@ private: void DumpBuffer(const sptr &buf) { + BufferHandle *bufferHandle = buf->GetBufferHandle(); + if (bufferHandle == nullptr) { + printf("bufferHandle nullptr!\n"); + return; + } + + uint32_t width = bufferHandle->width; + uint32_t height = bufferHandle->height; + uint32_t stride = bufferHandle->stride; + uint8_t *addr = (uint8_t *)buf->GetVirAddr(); + + detail::WriteToPngParam param; + param.width = width; + param.height = height; + param.data = addr; + param.stride = stride; + param.bitDepth = detail::BIT_DEPTH_VALUE; + if (access("/data", F_OK) < 0) { std::cout << "ImageReader::DumpBuffer(): Can't access data directory!" << std::endl; return; } std::string timeStamp = detail::FormattedTimeStamp(); - std::string dumpFileName = "/data/dumpImg-" + std::to_string(getpid()) + "-" + timeStamp + ".raw"; + std::string dumpFileName = "/data/dumpImg-" + std::to_string(getpid()) + "-" + timeStamp + ".png"; - std::ofstream file(dumpFileName, std::ofstream::binary); - if (!file.good()) { - std::cout << "ImageReader::DumpBuffer(): Init output file failed!" << std::endl; - file.close(); - return; + bool ret = WriteToPng(dumpFileName, param); + if (ret) { + std::cout << "ImageReader::Dumpbuffer(): dump" << dumpFileName << std::endl; } - - file.write(static_cast(buf->GetVirAddr()), buf->GetSize()); - file.close(); - std::cout << "ImageReader::DumpBuffer(): dump " << dumpFileName << " succeed." << std::endl; } void OnVsync() @@ -370,6 +461,15 @@ private: int main() { + DisplayId id = g_dms.GetDefaultDisplayId(); + std::cout << "level =" << g_dms.GetDisplayBacklight(id) << std::endl; + int lightValue = 0; + g_dms.SetDisplayBacklight(id, lightValue); + std::cout << "after set to 0, level =" << g_dms.GetDisplayBacklight(id) << std::endl; + lightValue = detail::MAX_BACKLIGHT; + g_dms.SetDisplayBacklight(id, lightValue); + std::cout << "after set to 100, level =" << g_dms.GetDisplayBacklight(id) << std::endl; + ImageReader imgReader; if (!imgReader.Init()) { cout << "ImgReader init failed!" << endl; @@ -384,13 +484,12 @@ int main() auto surfaceNode = CreateSurface(); DrawSurface(SkRect::MakeXYWH(0, 0, 200, 200), 0xffa10f1b, SkRect::MakeXYWH(0, 0, 200, 200), surfaceNode); displayNode->AddChild(surfaceNode, -1); - RSTransactionProxy::GetInstance().FlushImplicitTransaction(); + RSTransactionProxy::GetInstance()->FlushImplicitTransaction(); sleep(4); - while (1) { DrawSurface(SkRect::MakeXYWH(0, 0, 200, 200), 0xffa10f1b, SkRect::MakeXYWH(0, 0, 200, 200), surfaceNode); - RSTransactionProxy::GetInstance().FlushImplicitTransaction(); - sleep(2); + RSTransactionProxy::GetInstance()->FlushImplicitTransaction(); + sleep(detail::SLEEP_TIME); } return 0; -- Gitee