1a3e0fd82Sopenharmony_ci/* 2a3e0fd82Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd. 3a3e0fd82Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4a3e0fd82Sopenharmony_ci * you may not use this file except in compliance with the License. 5a3e0fd82Sopenharmony_ci * You may obtain a copy of the License at 6a3e0fd82Sopenharmony_ci * 7a3e0fd82Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8a3e0fd82Sopenharmony_ci * 9a3e0fd82Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10a3e0fd82Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11a3e0fd82Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12a3e0fd82Sopenharmony_ci * See the License for the specific language governing permissions and 13a3e0fd82Sopenharmony_ci * limitations under the License. 14a3e0fd82Sopenharmony_ci */ 15a3e0fd82Sopenharmony_ci 16a3e0fd82Sopenharmony_ci#include "window/window_impl.h" 17a3e0fd82Sopenharmony_ci#include "core/render_manager.h" 18a3e0fd82Sopenharmony_ci#include "gfx_utils/graphic_log.h" 19a3e0fd82Sopenharmony_ci#include "iwindows_manager.h" 20a3e0fd82Sopenharmony_ci 21a3e0fd82Sopenharmony_cinamespace OHOS { 22a3e0fd82Sopenharmony_ciWindowImpl::WindowImpl() : rootView_(nullptr), iWindow_(nullptr), isShow_(false), gfxAlloc_({}) {} 23a3e0fd82Sopenharmony_ci 24a3e0fd82Sopenharmony_ciWindowImpl::~WindowImpl() {} 25a3e0fd82Sopenharmony_ci 26a3e0fd82Sopenharmony_cibool WindowImpl::Create(const WindowConfig& config) 27a3e0fd82Sopenharmony_ci{ 28a3e0fd82Sopenharmony_ci GRAPHIC_LOGI("Create"); 29a3e0fd82Sopenharmony_ci if (iWindow_ == nullptr) { 30a3e0fd82Sopenharmony_ci config_ = config; 31a3e0fd82Sopenharmony_ci LiteWinConfig liteConfig; 32a3e0fd82Sopenharmony_ci liteConfig.rect = config.rect; 33a3e0fd82Sopenharmony_ci liteConfig.pixelFormat = IMAGE_PIXEL_FORMAT_ARGB8888; 34a3e0fd82Sopenharmony_ci liteConfig.opacity = config.opacity; 35a3e0fd82Sopenharmony_ci liteConfig.isModal = config.isModal; 36a3e0fd82Sopenharmony_ci liteConfig.compositeMode = static_cast<LiteWinConfig::CompositeMode>(config.compositeMode); 37a3e0fd82Sopenharmony_ci iWindow_ = IWindowsManager::GetInstance()->CreateWindow(liteConfig); 38a3e0fd82Sopenharmony_ci if (iWindow_ == nullptr) { 39a3e0fd82Sopenharmony_ci return false; 40a3e0fd82Sopenharmony_ci } 41a3e0fd82Sopenharmony_ci } 42a3e0fd82Sopenharmony_ci return true; 43a3e0fd82Sopenharmony_ci} 44a3e0fd82Sopenharmony_ci 45a3e0fd82Sopenharmony_civoid WindowImpl::Destroy() 46a3e0fd82Sopenharmony_ci{ 47a3e0fd82Sopenharmony_ci Flush(); 48a3e0fd82Sopenharmony_ci if (iWindow_ != nullptr) { 49a3e0fd82Sopenharmony_ci IWindowsManager::GetInstance()->RemoveWindow(iWindow_); 50a3e0fd82Sopenharmony_ci iWindow_ = nullptr; 51a3e0fd82Sopenharmony_ci } 52a3e0fd82Sopenharmony_ci} 53a3e0fd82Sopenharmony_ci 54a3e0fd82Sopenharmony_civoid WindowImpl::AddToDisplay() 55a3e0fd82Sopenharmony_ci{ 56a3e0fd82Sopenharmony_ci GRAPHIC_LOGI("AddToDisplay"); 57a3e0fd82Sopenharmony_ci RenderManager::GetInstance().AddToDisplay(this); 58a3e0fd82Sopenharmony_ci} 59a3e0fd82Sopenharmony_ci 60a3e0fd82Sopenharmony_civoid WindowImpl::RemoveFromDisplay() 61a3e0fd82Sopenharmony_ci{ 62a3e0fd82Sopenharmony_ci GRAPHIC_LOGI("RemoveFromDisplay"); 63a3e0fd82Sopenharmony_ci RenderManager::GetInstance().RemoveFromDisplay(this); 64a3e0fd82Sopenharmony_ci} 65a3e0fd82Sopenharmony_ci 66a3e0fd82Sopenharmony_civoid WindowImpl::BindRootView(RootView* rootView) 67a3e0fd82Sopenharmony_ci{ 68a3e0fd82Sopenharmony_ci if (rootView == nullptr) { 69a3e0fd82Sopenharmony_ci return; 70a3e0fd82Sopenharmony_ci } 71a3e0fd82Sopenharmony_ci UnbindRootView(); 72a3e0fd82Sopenharmony_ci GRAPHIC_LOGI("BindRootView"); 73a3e0fd82Sopenharmony_ci rootView_ = rootView; 74a3e0fd82Sopenharmony_ci rootView_->boundWindow_ = this; 75a3e0fd82Sopenharmony_ci} 76a3e0fd82Sopenharmony_ci 77a3e0fd82Sopenharmony_civoid WindowImpl::UnbindRootView() 78a3e0fd82Sopenharmony_ci{ 79a3e0fd82Sopenharmony_ci GRAPHIC_LOGI("UnbindRootView"); 80a3e0fd82Sopenharmony_ci if (rootView_ != nullptr) { 81a3e0fd82Sopenharmony_ci rootView_->boundWindow_ = nullptr; 82a3e0fd82Sopenharmony_ci rootView_ = nullptr; 83a3e0fd82Sopenharmony_ci } 84a3e0fd82Sopenharmony_ci} 85a3e0fd82Sopenharmony_ci 86a3e0fd82Sopenharmony_ciRootView* WindowImpl::GetRootView() 87a3e0fd82Sopenharmony_ci{ 88a3e0fd82Sopenharmony_ci return rootView_; 89a3e0fd82Sopenharmony_ci} 90a3e0fd82Sopenharmony_ci 91a3e0fd82Sopenharmony_ciRect WindowImpl::GetRect() 92a3e0fd82Sopenharmony_ci{ 93a3e0fd82Sopenharmony_ci return config_.rect; 94a3e0fd82Sopenharmony_ci} 95a3e0fd82Sopenharmony_ci 96a3e0fd82Sopenharmony_civoid WindowImpl::Show() 97a3e0fd82Sopenharmony_ci{ 98a3e0fd82Sopenharmony_ci if (iWindow_ == nullptr) { 99a3e0fd82Sopenharmony_ci return; 100a3e0fd82Sopenharmony_ci } 101a3e0fd82Sopenharmony_ci 102a3e0fd82Sopenharmony_ci if (!isShow_) { 103a3e0fd82Sopenharmony_ci isShow_ = true; 104a3e0fd82Sopenharmony_ci Render(); 105a3e0fd82Sopenharmony_ci iWindow_->Show(); 106a3e0fd82Sopenharmony_ci } 107a3e0fd82Sopenharmony_ci} 108a3e0fd82Sopenharmony_ci 109a3e0fd82Sopenharmony_civoid WindowImpl::Hide() 110a3e0fd82Sopenharmony_ci{ 111a3e0fd82Sopenharmony_ci if (iWindow_ == nullptr) { 112a3e0fd82Sopenharmony_ci return; 113a3e0fd82Sopenharmony_ci } 114a3e0fd82Sopenharmony_ci 115a3e0fd82Sopenharmony_ci if (isShow_) { 116a3e0fd82Sopenharmony_ci isShow_ = false; 117a3e0fd82Sopenharmony_ci iWindow_->Hide(); 118a3e0fd82Sopenharmony_ci } 119a3e0fd82Sopenharmony_ci} 120a3e0fd82Sopenharmony_ci 121a3e0fd82Sopenharmony_civoid WindowImpl::MoveTo(int16_t x, int16_t y) 122a3e0fd82Sopenharmony_ci{ 123a3e0fd82Sopenharmony_ci GRAPHIC_LOGI("MoveTo"); 124a3e0fd82Sopenharmony_ci config_.rect.SetPosition(x, y); 125a3e0fd82Sopenharmony_ci if (iWindow_ != nullptr) { 126a3e0fd82Sopenharmony_ci iWindow_->MoveTo(x, y); 127a3e0fd82Sopenharmony_ci } 128a3e0fd82Sopenharmony_ci} 129a3e0fd82Sopenharmony_ci 130a3e0fd82Sopenharmony_civoid WindowImpl::Resize(int16_t width, int16_t height) 131a3e0fd82Sopenharmony_ci{ 132a3e0fd82Sopenharmony_ci GRAPHIC_LOGI("Resize"); 133a3e0fd82Sopenharmony_ci if ((width == config_.rect.GetWidth()) && (height == config_.rect.GetHeight())) { 134a3e0fd82Sopenharmony_ci return; 135a3e0fd82Sopenharmony_ci } 136a3e0fd82Sopenharmony_ci 137a3e0fd82Sopenharmony_ci config_.rect.Resize(width, height); 138a3e0fd82Sopenharmony_ci Flush(); 139a3e0fd82Sopenharmony_ci if (iWindow_ != nullptr) { 140a3e0fd82Sopenharmony_ci iWindow_->Resize(width, height); 141a3e0fd82Sopenharmony_ci } 142a3e0fd82Sopenharmony_ci 143a3e0fd82Sopenharmony_ci if (rootView_ != nullptr) { 144a3e0fd82Sopenharmony_ci rootView_->Invalidate(); 145a3e0fd82Sopenharmony_ci } 146a3e0fd82Sopenharmony_ci} 147a3e0fd82Sopenharmony_ci 148a3e0fd82Sopenharmony_civoid WindowImpl::RaiseToTop() 149a3e0fd82Sopenharmony_ci{ 150a3e0fd82Sopenharmony_ci GRAPHIC_LOGI("RaiseToTop"); 151a3e0fd82Sopenharmony_ci if (iWindow_ != nullptr) { 152a3e0fd82Sopenharmony_ci iWindow_->RaiseToTop(); 153a3e0fd82Sopenharmony_ci } 154a3e0fd82Sopenharmony_ci} 155a3e0fd82Sopenharmony_ci 156a3e0fd82Sopenharmony_civoid WindowImpl::LowerToBottom() 157a3e0fd82Sopenharmony_ci{ 158a3e0fd82Sopenharmony_ci GRAPHIC_LOGI("LowerToBottom"); 159a3e0fd82Sopenharmony_ci if (iWindow_ != nullptr) { 160a3e0fd82Sopenharmony_ci iWindow_->LowerToBottom(); 161a3e0fd82Sopenharmony_ci } 162a3e0fd82Sopenharmony_ci} 163a3e0fd82Sopenharmony_ci 164a3e0fd82Sopenharmony_civoid WindowImpl::Render() 165a3e0fd82Sopenharmony_ci{ 166a3e0fd82Sopenharmony_ci UpdateHalDisplayBuffer(); 167a3e0fd82Sopenharmony_ci if (gfxAlloc_.virAddr == nullptr) { 168a3e0fd82Sopenharmony_ci GRAPHIC_LOGE("window buffer is null, windId=%d", GetWindowId()); 169a3e0fd82Sopenharmony_ci return; 170a3e0fd82Sopenharmony_ci } 171a3e0fd82Sopenharmony_ci 172a3e0fd82Sopenharmony_ci if (rootView_ != nullptr) { 173a3e0fd82Sopenharmony_ci rootView_->Measure(); 174a3e0fd82Sopenharmony_ci rootView_->Render(); 175a3e0fd82Sopenharmony_ci } 176a3e0fd82Sopenharmony_ci} 177a3e0fd82Sopenharmony_ci 178a3e0fd82Sopenharmony_civoid WindowImpl::Update() 179a3e0fd82Sopenharmony_ci{ 180a3e0fd82Sopenharmony_ci if (iWindow_ == nullptr) { 181a3e0fd82Sopenharmony_ci return; 182a3e0fd82Sopenharmony_ci } 183a3e0fd82Sopenharmony_ci iWindow_->Update(); 184a3e0fd82Sopenharmony_ci} 185a3e0fd82Sopenharmony_ci 186a3e0fd82Sopenharmony_ciint32_t WindowImpl::GetWindowId() 187a3e0fd82Sopenharmony_ci{ 188a3e0fd82Sopenharmony_ci if (iWindow_ != nullptr) { 189a3e0fd82Sopenharmony_ci return iWindow_->GetWindowId(); 190a3e0fd82Sopenharmony_ci } else { 191a3e0fd82Sopenharmony_ci GRAPHIC_LOGE("iwindow is null!"); 192a3e0fd82Sopenharmony_ci return INVALID_WINDOW_ID; 193a3e0fd82Sopenharmony_ci } 194a3e0fd82Sopenharmony_ci} 195a3e0fd82Sopenharmony_ci 196a3e0fd82Sopenharmony_civoid WindowImpl::Flush() 197a3e0fd82Sopenharmony_ci{ 198a3e0fd82Sopenharmony_ci GRAPHIC_LOGI("Flush"); 199a3e0fd82Sopenharmony_ci if (iWindow_ == nullptr) { 200a3e0fd82Sopenharmony_ci return; 201a3e0fd82Sopenharmony_ci } 202a3e0fd82Sopenharmony_ci ISurface* surface = iWindow_->GetSurface(); 203a3e0fd82Sopenharmony_ci if (surface != nullptr) { 204a3e0fd82Sopenharmony_ci surface->Unlock(); 205a3e0fd82Sopenharmony_ci gfxAlloc_ = {}; 206a3e0fd82Sopenharmony_ci } 207a3e0fd82Sopenharmony_ci} 208a3e0fd82Sopenharmony_ci 209a3e0fd82Sopenharmony_civoid WindowImpl::UpdateHalDisplayBuffer() 210a3e0fd82Sopenharmony_ci{ 211a3e0fd82Sopenharmony_ci if ((gfxAlloc_.virAddr == nullptr) && (iWindow_ != nullptr)) { 212a3e0fd82Sopenharmony_ci ISurface* surface = iWindow_->GetSurface(); 213a3e0fd82Sopenharmony_ci if (surface == nullptr) { 214a3e0fd82Sopenharmony_ci return; 215a3e0fd82Sopenharmony_ci } 216a3e0fd82Sopenharmony_ci surface->Lock(reinterpret_cast<void**>(&gfxAlloc_.virAddr), 217a3e0fd82Sopenharmony_ci reinterpret_cast<void**>(&gfxAlloc_.phyAddr), &gfxAlloc_.stride); 218a3e0fd82Sopenharmony_ci } 219a3e0fd82Sopenharmony_ci} 220a3e0fd82Sopenharmony_ci 221a3e0fd82Sopenharmony_ciBufferInfo* WindowImpl::GetBufferInfo() 222a3e0fd82Sopenharmony_ci{ 223a3e0fd82Sopenharmony_ci static BufferInfo bufferInfo; 224a3e0fd82Sopenharmony_ci bufferInfo.virAddr = gfxAlloc_.virAddr; 225a3e0fd82Sopenharmony_ci bufferInfo.phyAddr = gfxAlloc_.phyAddr; 226a3e0fd82Sopenharmony_ci bufferInfo.width = config_.rect.GetWidth(); 227a3e0fd82Sopenharmony_ci bufferInfo.height = config_.rect.GetHeight(); 228a3e0fd82Sopenharmony_ci bufferInfo.mode = ARGB8888; 229a3e0fd82Sopenharmony_ci bufferInfo.stride = gfxAlloc_.stride; 230a3e0fd82Sopenharmony_ci 231a3e0fd82Sopenharmony_ci bufferInfo.rect = { 232a3e0fd82Sopenharmony_ci 0, 233a3e0fd82Sopenharmony_ci 0, 234a3e0fd82Sopenharmony_ci static_cast<int16_t>(bufferInfo.width - 1), 235a3e0fd82Sopenharmony_ci static_cast<int16_t>(bufferInfo.height - 1) 236a3e0fd82Sopenharmony_ci }; 237a3e0fd82Sopenharmony_ci return &bufferInfo; 238a3e0fd82Sopenharmony_ci} 239a3e0fd82Sopenharmony_ci} // namespace OHOS 240