From 4381663e81ef642c2c917a0403a9d7c5c6bc26fa Mon Sep 17 00:00:00 2001 From: charleeshen Date: Tue, 8 Mar 2022 15:14:40 +0800 Subject: [PATCH] feat(dom): update node size --- dom/include/dom/dom_node.h | 5 + dom/src/dom/dom_manager.cc | 7 +- dom/src/dom/dom_node.cc | 125 +++++++++++------- .../jni/include/jni/native_render_provider.h | 2 +- .../jni/src/jni/native_render_provider.cc | 31 ++++- .../renderer/NativeRenderProvider.java | 5 +- 6 files changed, 120 insertions(+), 55 deletions(-) diff --git a/dom/include/dom/dom_node.h b/dom/include/dom/dom_node.h index 404fae1c5..6368d3444 100644 --- a/dom/include/dom/dom_node.h +++ b/dom/include/dom/dom_node.h @@ -136,7 +136,12 @@ class DomNode : public std::enable_shared_from_this { void UpdateProperties(const std::unordered_map>& update_style, const std::unordered_map>& update_dom_ext); + void UpdateDomNodeStyle(const std::unordered_map>& update_style); private: + void UpdateDiff(const std::unordered_map>& update_style, + const std::unordered_map>& update_dom_ext); + void UpdateDomExt(const std::unordered_map>& update_dom_ext); + void UpdateStyle(const std::unordered_map>& update_style); void UpdateObjectStyle(DomValue& style_map, const DomValue& update_style); private: diff --git a/dom/src/dom/dom_manager.cc b/dom/src/dom/dom_manager.cc index 1f577598f..e36c6427d 100644 --- a/dom/src/dom/dom_manager.cc +++ b/dom/src/dom/dom_manager.cc @@ -428,11 +428,16 @@ void DomManager::UpdateRenderNode(const std::shared_ptr& node) { if (!render_manager) { return; } - TDF_BASE_DCHECK(node); + + // 更新 layout tree + node->ParseLayoutStyleInfo(); + + // 更新属性 std::vector> nodes; nodes.push_back(node); render_manager->UpdateRenderNode(std::move(nodes)); + Layout(); NotifyRender(); } diff --git a/dom/src/dom/dom_node.cc b/dom/src/dom/dom_node.cc index 11cf8c512..d41f0de82 100644 --- a/dom/src/dom/dom_node.cc +++ b/dom/src/dom/dom_node.cc @@ -323,55 +323,9 @@ void DomNode::UpdateProperties(const std::unordered_mapPostTask([WEAK_THIS, update_style, update_dom_ext]() { DEFINE_AND_CHECK_SELF(DomNode) - // udpate diff - auto style_diff_value = DiffUtils::DiffProps(update_style, *self->GetStyleMap()); - auto ext_diff_value = DiffUtils::DiffProps(update_style, *self->GetStyleMap()); - auto style_update = std::get<0>(style_diff_value); - auto ext_update = std::get<0>(ext_diff_value); - std::shared_ptr diff_value = std::make_shared(); - if (style_update) { - diff_value->insert(style_update->begin(), style_update->end()); - } - if (ext_update) { - diff_value->insert(ext_update->begin(), ext_update->end()); - } - self->SetDiffStyle(diff_value); - - for (const auto& v : update_style) { - if (self->style_map_ == nullptr) { - self->style_map_ = std::make_shared>>(); - } - - auto iter = self->style_map_->find(v.first); - if (iter == self->style_map_->end()) { - std::pair> pair = {v.first, std::make_shared(std::move(*v.second))}; - self->style_map_->insert(pair); - } - - if (v.second->IsObject() && iter->second->IsObject()) { - self->UpdateObjectStyle(*iter->second, *v.second); - } else { - iter->second = std::make_shared(std::move(*v.second)); - } - } - - for (const auto& v : update_dom_ext) { - if (self->dom_ext_map_ == nullptr) { - self->dom_ext_map_ = std::make_shared>>(); - } - - auto iter = self->dom_ext_map_->find(v.first); - if (iter == self->dom_ext_map_->end()) { - std::pair> pair = {v.first, std::make_shared(std::move(*v.second))}; - self->dom_ext_map_->insert(pair); - } - - if (v.second->IsObject() && iter->second->IsObject()) { - self->UpdateObjectStyle(*iter->second, *v.second); - } else { - iter->second = std::make_shared(std::move(*v.second)); - } - } + self->UpdateDiff(update_style, update_dom_ext); + self->UpdateStyle(update_style); + self->UpdateDomExt(update_dom_ext); // update Render Node auto dom_manager = self->dom_manager_.lock(); @@ -384,6 +338,79 @@ void DomNode::UpdateProperties(const std::unordered_map>& update_style) { + auto dom_manager = dom_manager_.lock(); + TDF_BASE_DCHECK(dom_manager); + if (dom_manager) { + dom_manager->PostTask([WEAK_THIS, update_style]() { + DEFINE_AND_CHECK_SELF(DomNode) + self->UpdateStyle(update_style); + }); + } +} + +void DomNode::UpdateDiff(const std::unordered_map>& update_style, + const std::unordered_map>& update_dom_ext) { + auto style_diff_value = DiffUtils::DiffProps(*this->GetStyleMap(), update_style); + auto ext_diff_value = DiffUtils::DiffProps(*this->GetStyleMap(), update_dom_ext); + auto style_update = std::get<0>(style_diff_value); + auto ext_update = std::get<0>(ext_diff_value); + std::shared_ptr diff_value = std::make_shared(); + if (style_update) { + diff_value->insert(style_update->begin(), style_update->end()); + } + if (ext_update) { + diff_value->insert(ext_update->begin(), ext_update->end()); + } + this->SetDiffStyle(diff_value); +} + +void DomNode::UpdateDomExt(const std::unordered_map>& update_dom_ext) { + if (update_dom_ext.size() == 0) return; + + for (const auto& v : update_dom_ext) { + if (this->dom_ext_map_ == nullptr) { + this->dom_ext_map_ = std::make_shared>>(); + } + + auto iter = this->dom_ext_map_->find(v.first); + if (iter == this->dom_ext_map_->end()) { + std::pair> pair = {v.first, std::make_shared(*v.second)}; + this->dom_ext_map_->insert(pair); + continue; + } + + if (v.second->IsObject() && iter->second->IsObject()) { + this->UpdateObjectStyle(*iter->second, *v.second); + } else { + iter->second = std::make_shared(*v.second); + } + } +} + +void DomNode::UpdateStyle(const std::unordered_map>& update_style) { + if (update_style.size() == 0) return; + + for (const auto& v : update_style) { + if (this->style_map_ == nullptr) { + this->style_map_ = std::make_shared>>(); + } + + auto iter = this->style_map_->find(v.first); + if (iter == this->style_map_->end()) { + std::pair> pair = {v.first, std::make_shared(*v.second)}; + this->style_map_->insert(pair); + continue; + } + + if (v.second->IsObject() && iter->second->IsObject()) { + this->UpdateObjectStyle(*iter->second, *v.second); + } else { + iter->second = std::make_shared(*v.second); + } + } +} + void DomNode::UpdateObjectStyle(DomValue& style_map, const DomValue& update_style) { TDF_BASE_DCHECK(style_map.IsObject()); TDF_BASE_DCHECK(update_style.IsObject()); diff --git a/framework/js/android/src/main/jni/include/jni/native_render_provider.h b/framework/js/android/src/main/jni/include/jni/native_render_provider.h index 944361a29..415b7d545 100644 --- a/framework/js/android/src/main/jni/include/jni/native_render_provider.h +++ b/framework/js/android/src/main/jni/include/jni/native_render_provider.h @@ -42,7 +42,7 @@ void OnDestroyNativeRenderProvider(JNIEnv* j_env, void UpdateRootSize(JNIEnv* j_env, jobject j_obj, jint j_instance_id, jfloat width, jfloat height); -void UpdateNodeSize(JNIEnv* j_env, jobject j_obj, jint j_node_id, +void UpdateNodeSize(JNIEnv* j_env, jobject j_obj, jint j_instance_id, jint j_node_id, jfloat width, jfloat height); void OnReceivedEvent(JNIEnv *j_env, jobject j_object, diff --git a/framework/js/android/src/main/jni/src/jni/native_render_provider.cc b/framework/js/android/src/main/jni/src/jni/native_render_provider.cc index 0c3893c5e..b52b87a2a 100644 --- a/framework/js/android/src/main/jni/src/jni/native_render_provider.cc +++ b/framework/js/android/src/main/jni/src/jni/native_render_provider.cc @@ -53,7 +53,7 @@ REGISTER_JNI("com/tencent/renderer/NativeRenderProvider", REGISTER_JNI("com/tencent/renderer/NativeRenderProvider", "updateNodeSize", - "(IFF)V", + "(IIFF)V", UpdateNodeSize) REGISTER_JNI("com/tencent/renderer/NativeRenderProvider", @@ -102,9 +102,36 @@ void UpdateRootSize(JNIEnv *j_env, jobject j_object, jint j_instance_id, dom_manager->DoLayout(); } -void UpdateNodeSize(JNIEnv *j_env, jobject j_object, jint j_node_id, +void UpdateNodeSize(JNIEnv *j_env, jobject j_object, jint j_instance_id, jint j_node_id, jfloat j_width, jfloat j_height) { + std::shared_ptr render_manager = HippyRenderManager::Find( + static_cast(j_instance_id)); + if (!render_manager) { + TDF_BASE_DLOG(WARNING) << "UpdateNodeSize j_instance_id invalid"; + return; + } + std::shared_ptr dom_manager = render_manager->GetDomManager(); + if (dom_manager == nullptr) { + TDF_BASE_DLOG(WARNING) << "UpdateNodeSize dom_manager is nullptr"; + return; + } + auto node = dom_manager->GetNode(hippy::base::checked_numeric_cast(j_node_id)); + if (node == nullptr) { + TDF_BASE_DLOG(WARNING) << "UpdateNodeSize DomNode not found for id: " << j_node_id; + return; + } + + std::unordered_map> update_style; + std::shared_ptr width = + std::make_shared(hippy::base::checked_numeric_cast(j_width)); + std::shared_ptr height = + std::make_shared(hippy::base::checked_numeric_cast(j_height)); + update_style.insert({"width", width}); + update_style.insert({"height", height}); + + node->UpdateDomNodeStyle(update_style); + node->ParseLayoutStyleInfo(); } void DoCallBack(JNIEnv *j_env, jobject j_object, diff --git a/renderer/native/android/src/main/java/com/tencent/renderer/NativeRenderProvider.java b/renderer/native/android/src/main/java/com/tencent/renderer/NativeRenderProvider.java index c0dad77c7..2eb756b2d 100644 --- a/renderer/native/android/src/main/java/com/tencent/renderer/NativeRenderProvider.java +++ b/renderer/native/android/src/main/java/com/tencent/renderer/NativeRenderProvider.java @@ -278,7 +278,7 @@ public class NativeRenderProvider { } public void onSizeChanged(int nodeId, int width, int height) { - updateNodeSize(nodeId, PixelUtil.px2dp(width), PixelUtil.px2dp(height)); + updateNodeSize(mInstanceId, nodeId, PixelUtil.px2dp(width), PixelUtil.px2dp(height)); } /** @@ -361,11 +361,12 @@ public class NativeRenderProvider { * Updates the size to the specified node, such as modal node, should set new window size before * layout. * + * @param instanceId the unique id of native (C++) render manager * @param nodeId the dom node id * @param width new width of node, use dp unit * @param height new height of node, use dp unit */ - private native void updateNodeSize(int nodeId, float width, float height); + private native void updateNodeSize(int instanceId, int nodeId, float width, float height); /** * Dispatch event generated by native renderer to (C++) dom manager.