diff --git a/frameworks/bridge/arkts_frontend/ani_graphics_module.cpp b/frameworks/bridge/arkts_frontend/ani_graphics_module.cpp index c8ffce6313f0faaa3c19ddf9ad4cf8fe8e2edcaf..b82662b08366ecf11ce1582d3eb741b4590ec1a2 100644 --- a/frameworks/bridge/arkts_frontend/ani_graphics_module.cpp +++ b/frameworks/bridge/arkts_frontend/ani_graphics_module.cpp @@ -24,6 +24,8 @@ #include "core/components_ng/pattern/render_node/render_node_pattern.h" #include "core/interfaces/native/implementation/render_node_peer_impl.h" #include "core/pipeline/pipeline_base.h" +#include "core/components_ng/pattern/custom_frame_node/custom_frame_node_pattern.h" +#include "core/interfaces/native/implementation/frame_node_peer_impl.h" namespace OHOS::Ace::Framework { namespace { @@ -116,7 +118,7 @@ ani_object AniGraphicsModule::CreateDrawingContext(ani_env* env, const NG::Drawi return result; } -void AniGraphicsModule::SetDrawCallback(ani_env* env, ani_long ptr, ani_fn_object fnObj) +void AniGraphicsModule::SetDrawCallback(ani_env* env, ani_long ptr, ani_fn_object fnObj, ani_boolean isFrameNode) { if (fnObj == nullptr) { LOGE("Draw callback is undefined."); @@ -136,16 +138,25 @@ void AniGraphicsModule::SetDrawCallback(ani_env* env, ani_long ptr, ani_fn_objec env->FunctionalObject_Call( reinterpret_cast(fnObjGlobalRef), params.size(), params.data(), &fnReturnVal); }; - - auto* renderNodePeer = reinterpret_cast(ptr); - CHECK_NULL_VOID(renderNodePeer); - auto renderNode = renderNodePeer->GetFrameNode(); - auto pattern = renderNode->GetPattern(); - if (pattern) { - pattern->SetDrawCallback(drawCallbackFunc); + if (isFrameNode) { + auto* frameNodePeer = reinterpret_cast(ptr); + CHECK_NULL_VOID(frameNodePeer); + auto frameNode = FrameNodePeer::GetFrameNodeByPeer(frameNodePeer); + CHECK_NULL_VOID(frameNode); + auto pattern = frameNode->GetPattern(); + if (pattern) { + pattern->SetDrawCallback(drawCallbackFunc); + } + } else { + auto* renderNodePeer = reinterpret_cast(ptr); + CHECK_NULL_VOID(renderNodePeer); + auto renderNode = renderNodePeer->GetFrameNode(); + auto pattern = renderNode->GetPattern(); + if (pattern) { + pattern->SetDrawCallback(drawCallbackFunc); + } } } - void AniGraphicsModule::Invalidate(ani_env* env, ani_long ptr) { auto* frameNode = reinterpret_cast(ptr); diff --git a/frameworks/bridge/arkts_frontend/ani_graphics_module.h b/frameworks/bridge/arkts_frontend/ani_graphics_module.h index ccdae371c83d484aebbeccfc6e110d6621d89b69..41f9deb05d0963ae41971f8f274786302894745d 100644 --- a/frameworks/bridge/arkts_frontend/ani_graphics_module.h +++ b/frameworks/bridge/arkts_frontend/ani_graphics_module.h @@ -23,12 +23,13 @@ typedef class __ani_object* ani_object; typedef struct __ani_env ani_env; typedef int64_t ani_long; +typedef uint8_t ani_boolean; typedef class __ani_fn_object *ani_fn_object; namespace OHOS::Ace::Framework { class AniGraphicsModule final { public: - static void SetDrawCallback(ani_env* env, ani_long ptr, ani_fn_object fnObj); + static void SetDrawCallback(ani_env* env, ani_long ptr, ani_fn_object fnObj, ani_boolean isFrameNode); static void SetDrawModifier(ani_env* env, ani_long ptr, ani_object fnObj); static void Invalidate(ani_env* env, ani_long ptr); diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/FrameNode.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/FrameNode.ts index ac5a9efe3705040d3bd7bcb23e92df0518e25227..2b05633d1998857b1c1f9f1a448665a414dec2ca 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/FrameNode.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/FrameNode.ts @@ -149,7 +149,9 @@ export class FrameNode implements MaterializedBase { this._nodeId = this.getIdByFrameNode_serialize(this); ArkUIAniModule._Common_Restore_InstanceId(); FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.set(this._nodeId, this); - this.onDraw_serialize(this.onDraw); + if (this.peer !== undefined) { + ArkUIAniModule._SetDrawCallback(this.peer!.ptr, this.onDraw, true); + } } } static getFinalizer(): KPointer { diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/RenderNode.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/RenderNode.ts index 50d04bc3f897f9d027135af3509a81e71d0fbb88..ff072867bcbf30fb08efabf9a0b618d121250552 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/RenderNode.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/RenderNode.ts @@ -328,7 +328,7 @@ export class RenderNode implements MaterializedBase { } const peerId = PeerNode.nextId() const ctorPtr: KPointer = RenderNode.ctor_rendernode(peerId, this.draw) - ArkUIAniModule._SetDrawCallback(ctorPtr, this.draw) + ArkUIAniModule._SetDrawCallback(ctorPtr, this.draw, false) this.peer = new Finalizable(ctorPtr, RenderNode.getFinalizer()) this.setClipToFrame(true) } diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/arkts/ArkUIAniModule.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/arkts/ArkUIAniModule.ts index 82ac08f576a9abc012a0297930ccd7f300765f72..c06adec027a4646714e8c4a234f513fb29e9d162 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/arkts/ArkUIAniModule.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/arkts/ArkUIAniModule.ts @@ -40,7 +40,9 @@ export class ArkUIAniModule { native static _BuilderProxyNode_Construct(id: KInt): KPointer native static _ContentSlot_construct(id: KInt): KPointer native static _ContentSlotInterface_setContentSlotOptions(slot: KPointer, content: KPointer): void - native static _SetDrawCallback(ptr: KPointer, callback: ((context: DrawContext) => void)): void + + native static _SetDrawCallback(ptr: KPointer, callback: ((context: DrawContext) => void), isFrameNode:boolean): void + native static _SetDrawModifier(ptr: KPointer, drawModifier: DrawModifier): void native static _Invalidate(ptr: KPointer): void native static _SetWaterFlowOptions(ptr: KPointer, options: WaterFlowOptions): void diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/common/common_module.cpp b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/common/common_module.cpp index a2387b8b18faac7297def6fb7ab4ed114ad23aa6..849dab765dc6e02ddcb4b19a3985548f49cb9981 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/common/common_module.cpp +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/common/common_module.cpp @@ -64,13 +64,13 @@ ani_int GetCurrentInstanceId([[maybe_unused]] ani_env* env) return modifier->getCommonAniModifier()->getCurrentInstanceId(); } -void SetDrawCallback(ani_env* env, ani_object obj, ani_long ptr, ani_fn_object fnObj) +void SetDrawCallback(ani_env* env, ani_object obj, ani_long ptr, ani_fn_object fnObj, ani_boolean isFrameNode) { const auto* modifier = GetNodeAniModifier(); if (!modifier) { return; } - modifier->getCommonAniModifier()->setDrawCallback(env, ptr, fnObj); + modifier->getCommonAniModifier()->setDrawCallback(env, ptr, fnObj, isFrameNode); } void SetDrawModifier(ani_env* env, [[maybe_unused]] ani_object aniClass, ani_long ptr, ani_object drawModifier) diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/common/common_module.h b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/common/common_module.h index 6467e295cc7bb28ee4a47be329fe7d320bb8a64d..777a7e9a40898bdd6e5c732469bd568fd6b6d302 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/common/common_module.h +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/common/common_module.h @@ -23,7 +23,7 @@ ani_object GetHostContext([[maybe_unused]] ani_env* env); void SyncInstanceId(ani_env* env, ani_object obj, ani_int id); void RestoreInstanceId(ani_env* env); ani_int GetCurrentInstanceId(ani_env* env); -void SetDrawCallback(ani_env* env, ani_object obj, ani_long ptr, ani_fn_object fnObj); +void SetDrawCallback(ani_env* env, ani_object obj, ani_long ptr, ani_fn_object fnObj, ani_boolean isFameNode = false); void SetDrawModifier(ani_env* env, [[maybe_unused]] ani_object aniClass, ani_long ptr, ani_object drawModifier); void Invalidate(ani_env* env, [[maybe_unused]] ani_object aniClass, ani_long ptr); ani_long BuilderProxyNodeConstruct(ani_env* env, [[maybe_unused]] ani_object aniClass, ani_int id); diff --git a/frameworks/core/interfaces/ani/ani_api.h b/frameworks/core/interfaces/ani/ani_api.h index 2e5026cce262a0b79f61156ea32136e2dec91f7e..cbb65e0e78a7f73b2f0fea738bbaadf413956cc6 100644 --- a/frameworks/core/interfaces/ani/ani_api.h +++ b/frameworks/core/interfaces/ani/ani_api.h @@ -37,6 +37,7 @@ typedef class __ani_object* ani_object; typedef struct __ani_env ani_env; typedef int32_t ani_int; typedef int64_t ani_long; +typedef uint8_t ani_boolean; typedef class __ani_fn_object *ani_fn_object; typedef class __ani_string* ani_string; typedef _ArkUINode* ArkUINodeHandle; @@ -73,7 +74,7 @@ struct ArkUIAniCommonModifier { ani_ref* (*getHostContext)(); void (*syncInstanceId)(ArkUI_Int32 id); void (*restoreInstanceId)(); - void (*setDrawCallback)(ani_env* env, ani_long ptr, ani_fn_object fnObj); + void (*setDrawCallback)(ani_env* env, ani_long ptr, ani_fn_object fnObj, ani_boolean isFrameNode); ArkUI_Int32 (*getCurrentInstanceId)(); ani_long (*builderProxyNodeConstruct)(ArkUI_Int32 id); }; diff --git a/frameworks/core/interfaces/native/ani/common_ani_modifier.cpp b/frameworks/core/interfaces/native/ani/common_ani_modifier.cpp index c011dc050957b66720d9bc6454e4545fbda238ee..6fe3d6235a8780484c294fb8d143ada57c6c345e 100644 --- a/frameworks/core/interfaces/native/ani/common_ani_modifier.cpp +++ b/frameworks/core/interfaces/native/ani/common_ani_modifier.cpp @@ -52,9 +52,9 @@ void RestoreInstanceId() restoreInstanceIds_.pop_back(); } -void SetDrawCallback(ani_env* env, ani_long ptr, ani_fn_object fnObj) +void SetDrawCallback(ani_env* env, ani_long ptr, ani_fn_object fnObj, ani_boolean isFrameNode) { - Framework::AniGraphicsModule::SetDrawCallback(env, ptr, fnObj); + Framework::AniGraphicsModule::SetDrawCallback(env, ptr, fnObj, isFrameNode); } ArkUI_Int32 GetCurrentInstanceId()