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