Repository: incubator-weex Updated Branches: refs/heads/master 361df724c -> d0cf4337e
[WEEX-442][Core] Fix setViewPort Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/d0cf4337 Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/d0cf4337 Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/d0cf4337 Branch: refs/heads/master Commit: d0cf4337e0cd25c6e062e48ad720aa57749631e8 Parents: 361df72 Author: miomin <miomin...@foxmail.com> Authored: Tue Jun 26 16:51:25 2018 +0800 Committer: YorkShen <shenyua...@gmail.com> Committed: Tue Jun 26 18:38:31 2018 +0800 ---------------------------------------------------------------------- .../core/render/manager/render_manager.cpp | 33 ++++++++++++++++---- .../Source/core/render/manager/render_manager.h | 24 ++++++-------- .../Source/core/render/node/render_list.cpp | 12 +++---- .../Source/core/render/node/render_mask.cpp | 4 +-- .../Source/core/render/node/render_object.cpp | 2 +- .../Source/core/render/page/render_page.cpp | 1 + weex_core/Source/core/render/page/render_page.h | 7 +++++ 7 files changed, 54 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d0cf4337/weex_core/Source/core/render/manager/render_manager.cpp ---------------------------------------------------------------------- diff --git a/weex_core/Source/core/render/manager/render_manager.cpp b/weex_core/Source/core/render/manager/render_manager.cpp index 699c29f..5934619 100644 --- a/weex_core/Source/core/render/manager/render_manager.cpp +++ b/weex_core/Source/core/render/manager/render_manager.cpp @@ -44,6 +44,13 @@ bool RenderManager::CreatePage(std::string page_id, const char *data) { RenderPage *page = new RenderPage(page_id); this->pages_.insert(std::pair<std::string, RenderPage *>(page_id, page)); + std::map<std::string, float>::iterator iter = + this->viewports_.find(page_id); + if (iter != this->viewports_.end()) { + RenderManager::GetInstance()->set_viewport_width(page_id, iter->second); + this->viewports_.erase(page_id); + } + int64_t start_time = getCurrentTime(); RenderObject *root = Wson2RenderObject(data, page_id); page->ParseJsonTime(getCurrentTime() - start_time); @@ -186,15 +193,15 @@ bool RenderManager::CreateFinish(const std::string &page_id) { return page->CreateFinish(); } -bool RenderManager::CallNativeModule(const char *pageId, const char *module, const char *method, - const char *arguments, int argumentsLength, - const char *options, int optionsLength) { +bool RenderManager::CallNativeModule(const char *page_id, const char *module, const char *method, + const char *arguments, int arguments_length, + const char *options, int options_length) { if (strcmp(module, "meta") == 0) { - CallMetaModule(method, arguments); + CallMetaModule(page_id, method, arguments); } } -bool RenderManager::CallMetaModule(const char *method, const char *arguments) { +bool RenderManager::CallMetaModule(const char *page_id, const char *method, const char *arguments) { if (strcmp(method, "setViewport") == 0) { wson_parser parser(arguments); @@ -208,7 +215,7 @@ bool RenderManager::CallMetaModule(const char *method, const char *arguments) { std::string key = parser.nextMapKeyUTF8(); std::string value = parser.nextStringUTF8(parser.nextType()); if (strcmp(key.c_str(), WIDTH) == 0) { - RenderManager::GetInstance()->set_viewport_width(getFloat(value.c_str())); + viewports_.insert(std::pair<std::string, float>(page_id, getFloat(value.c_str()))); } } } @@ -240,6 +247,20 @@ bool RenderManager::ClosePage(const std::string &page_id) { page = nullptr; } +float RenderManager::viewport_width(const std::string &page_id) { + RenderPage *page = GetPage(page_id); + if (page == nullptr) return kDefaultViewPortWidth; + + return page->viewport_width(); +} + +void RenderManager::set_viewport_width(const std::string &page_id, float viewport_width) { + RenderPage *page = GetPage(page_id); + if (page == nullptr) return; + + page->set_viewport_width(viewport_width); +} + void RenderManager::Batch(const std::string &page_id) { RenderPage *page = this->GetPage(page_id); if (page == nullptr) return; http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d0cf4337/weex_core/Source/core/render/manager/render_manager.h ---------------------------------------------------------------------- diff --git a/weex_core/Source/core/render/manager/render_manager.h b/weex_core/Source/core/render/manager/render_manager.h index e7e0f44..c626b2b 100644 --- a/weex_core/Source/core/render/manager/render_manager.h +++ b/weex_core/Source/core/render/manager/render_manager.h @@ -30,9 +30,7 @@ class RenderPage; class RenderManager { private: - RenderManager() { - this->viewport_width_ = kDefaultViewPortWidth; - } + RenderManager() {} ~RenderManager() {} @@ -79,16 +77,20 @@ class RenderManager { bool CreateFinish(const std::string &page_id); - bool CallNativeModule(const char *pageId, const char *module, const char *method, - const char *arguments, int argumentsLength, const char *options, - int optionsLength); + bool CallNativeModule(const char *page_id, const char *module, const char *method, + const char *arguments, int arguments_length, const char *options, + int options_length); - bool CallMetaModule(const char *method, const char *arguments); + bool CallMetaModule(const char *page_id, const char *method, const char *arguments); RenderPage *GetPage(const std::string &page_id); bool ClosePage(const std::string &page_id); + float viewport_width(const std::string &page_id); + + void set_viewport_width(const std::string &page_id, float viewport_width); + static RenderManager *GetInstance() { if (!g_pInstance) { g_pInstance = new RenderManager(); @@ -96,16 +98,10 @@ class RenderManager { return g_pInstance; } - inline float viewport_width() const { return this->viewport_width_; } - - inline void set_viewport_width(float viewport_width) { - this->viewport_width_ = viewport_width; - } - private: static RenderManager *g_pInstance; std::map<std::string, RenderPage *> pages_; - float viewport_width_ = -1; + std::map<std::string, float> viewports_; }; } // namespace WeexCore http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d0cf4337/weex_core/Source/core/render/node/render_list.cpp ---------------------------------------------------------------------- diff --git a/weex_core/Source/core/render/node/render_list.cpp b/weex_core/Source/core/render/node/render_list.cpp index bce9384..cdcee32 100644 --- a/weex_core/Source/core/render/node/render_list.cpp +++ b/weex_core/Source/core/render/node/render_list.cpp @@ -113,8 +113,8 @@ void RenderList::PreCalculateCellWidth() { this->available_width_ = TakeStyleWidth() - - getWebPxByWidth(getPaddingLeft(), RenderManager::GetInstance()->viewport_width()) - - getWebPxByWidth(getPaddingRight(), RenderManager::GetInstance()->viewport_width()); + getWebPxByWidth(getPaddingLeft(), RenderManager::GetInstance()->viewport_width(page_id())) - + getWebPxByWidth(getPaddingRight(), RenderManager::GetInstance()->viewport_width(page_id())); if (AUTO_VALUE == this->column_count_ && AUTO_VALUE == this->column_width_) { @@ -217,19 +217,19 @@ std::string RenderList::CalculateSpanOffset() { float RenderList::TakeStyleWidth() { float width = - getWebPxByWidth(getLayoutWidth(), RenderManager::GetInstance()->viewport_width()); + getWebPxByWidth(getLayoutWidth(), RenderManager::GetInstance()->viewport_width(page_id())); if (isnan(width) || width <= 0) { if (getParent() != nullptr) { width = getWebPxByWidth(getParent()->getLayoutWidth(), - RenderManager::GetInstance()->viewport_width()); + RenderManager::GetInstance()->viewport_width(page_id())); } if (isnan(width) || width <= 0) { width = getWebPxByWidth(RenderObject::getStyleWidth(), - RenderManager::GetInstance()->viewport_width()); + RenderManager::GetInstance()->viewport_width(page_id())); } } if (isnan(width) || width <= 0) { - width = RenderManager::GetInstance()->viewport_width(); + width = RenderManager::GetInstance()->viewport_width(page_id()); } return width; } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d0cf4337/weex_core/Source/core/render/node/render_mask.cpp ---------------------------------------------------------------------- diff --git a/weex_core/Source/core/render/node/render_mask.cpp b/weex_core/Source/core/render/node/render_mask.cpp index 8c80d0b..7cb5238 100644 --- a/weex_core/Source/core/render/node/render_mask.cpp +++ b/weex_core/Source/core/render/node/render_mask.cpp @@ -55,9 +55,9 @@ std::map<std::string, std::string> *RenderMask::GetDefaultStyle() { style->insert(std::pair<std::string, std::string>(POSITION, "absolute")); style->insert(std::pair<std::string, std::string>( - WIDTH, to_string(getWebPxByWidth(width, RenderManager::GetInstance()->viewport_width())))); + WIDTH, to_string(getWebPxByWidth(width, RenderManager::GetInstance()->viewport_width(page_id()))))); style->insert(std::pair<std::string, std::string>( - HEIGHT, to_string(getWebPxByWidth(height, RenderManager::GetInstance()->viewport_width())))); + HEIGHT, to_string(getWebPxByWidth(height, RenderManager::GetInstance()->viewport_width(page_id()))))); style->insert(std::pair<std::string, std::string>(TOP, "0")); return style; } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d0cf4337/weex_core/Source/core/render/node/render_object.cpp ---------------------------------------------------------------------- diff --git a/weex_core/Source/core/render/node/render_object.cpp b/weex_core/Source/core/render/node/render_object.cpp index 97f9287..81d36b2 100644 --- a/weex_core/Source/core/render/node/render_object.cpp +++ b/weex_core/Source/core/render/node/render_object.cpp @@ -347,7 +347,7 @@ bool RenderObject::UpdateStyleInternal(const std::string key, functor(fallback); ret = true; } else { - float fvalue = getFloatByViewport(value, RenderManager::GetInstance()->viewport_width()); + float fvalue = getFloatByViewport(value, RenderManager::GetInstance()->viewport_width(page_id())); if (!isnan(fvalue)) { functor(fvalue); ret = true; http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d0cf4337/weex_core/Source/core/render/page/render_page.cpp ---------------------------------------------------------------------- diff --git a/weex_core/Source/core/render/page/render_page.cpp b/weex_core/Source/core/render/page/render_page.cpp index c5be5e2..4c6f25f 100644 --- a/weex_core/Source/core/render/page/render_page.cpp +++ b/weex_core/Source/core/render/page/render_page.cpp @@ -52,6 +52,7 @@ RenderPage::RenderPage(std::string page_id) { this->render_page_size_.first = WXCoreEnvironment::getInstance()->DeviceWidth(); this->render_page_size_.second = NAN; + this->viewport_width_ = kDefaultViewPortWidth; } RenderPage::~RenderPage() { http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d0cf4337/weex_core/Source/core/render/page/render_page.h ---------------------------------------------------------------------- diff --git a/weex_core/Source/core/render/page/render_page.h b/weex_core/Source/core/render/page/render_page.h index 4fe91c1..e6803d1 100644 --- a/weex_core/Source/core/render/page/render_page.h +++ b/weex_core/Source/core/render/page/render_page.h @@ -155,6 +155,12 @@ public: return this->is_render_container_width_wrap_content_.load(); } + inline float viewport_width() const { return this->viewport_width_; } + + inline void set_viewport_width(float viewport_width) { + this->viewport_width_ = viewport_width; + } + public: static constexpr bool kUseVSync = true; std::atomic_bool need_layout_{false}; @@ -169,6 +175,7 @@ public: std::atomic_bool is_dirty_{true}; std::atomic_bool is_render_container_width_wrap_content_{false}; std::atomic_bool is_render_container_height_wrap_content_{false}; + float viewport_width_ = -1; }; } // namespace WeexCore