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/** 17a3e0fd82Sopenharmony_ci * @addtogroup UI_Components 18a3e0fd82Sopenharmony_ci * @{ 19a3e0fd82Sopenharmony_ci * 20a3e0fd82Sopenharmony_ci * @brief Defines UI components such as buttons, texts, images, lists, and progress bars. 21a3e0fd82Sopenharmony_ci * 22a3e0fd82Sopenharmony_ci * @since 1.0 23a3e0fd82Sopenharmony_ci * @version 1.0 24a3e0fd82Sopenharmony_ci */ 25a3e0fd82Sopenharmony_ci 26a3e0fd82Sopenharmony_ci/** 27a3e0fd82Sopenharmony_ci * @file root_view.h 28a3e0fd82Sopenharmony_ci * 29a3e0fd82Sopenharmony_ci * @brief Manages a root view. 30a3e0fd82Sopenharmony_ci * 31a3e0fd82Sopenharmony_ci * A root view is the view containing its child views. It represents the root node in a tree structure and is 32a3e0fd82Sopenharmony_ci * the parent to all the children. 33a3e0fd82Sopenharmony_ci * 34a3e0fd82Sopenharmony_ci * @since 1.0 35a3e0fd82Sopenharmony_ci * @version 1.0 36a3e0fd82Sopenharmony_ci */ 37a3e0fd82Sopenharmony_ci 38a3e0fd82Sopenharmony_ci#ifndef GRAPHIC_LITE_ROOT_VIEW_H 39a3e0fd82Sopenharmony_ci#define GRAPHIC_LITE_ROOT_VIEW_H 40a3e0fd82Sopenharmony_ci 41a3e0fd82Sopenharmony_ci#if defined __linux__ || defined __LITEOS__ || defined __APPLE__ 42a3e0fd82Sopenharmony_ci#include <pthread.h> 43a3e0fd82Sopenharmony_ci#endif 44a3e0fd82Sopenharmony_ci 45a3e0fd82Sopenharmony_ci#include "components/ui_view_group.h" 46a3e0fd82Sopenharmony_ci#include "events/key_event.h" 47a3e0fd82Sopenharmony_ci#include "events/virtual_device_event.h" 48a3e0fd82Sopenharmony_ci#include "gfx_utils/list.h" 49a3e0fd82Sopenharmony_ci 50a3e0fd82Sopenharmony_ci#if LOCAL_RENDER 51a3e0fd82Sopenharmony_ci#include <map> 52a3e0fd82Sopenharmony_ci#include "gfx_utils/vector.h" 53a3e0fd82Sopenharmony_ci#endif 54a3e0fd82Sopenharmony_ci 55a3e0fd82Sopenharmony_cinamespace OHOS { 56a3e0fd82Sopenharmony_ci#if ENABLE_WINDOW 57a3e0fd82Sopenharmony_ciclass Window; 58a3e0fd82Sopenharmony_ciclass WindowImpl; 59a3e0fd82Sopenharmony_ci#endif 60a3e0fd82Sopenharmony_ci 61a3e0fd82Sopenharmony_ci/** 62a3e0fd82Sopenharmony_ci * @brief Defines the functions related to a root view which contains its child views and represents 63a3e0fd82Sopenharmony_ci * the root node in a tree structure. 64a3e0fd82Sopenharmony_ci * 65a3e0fd82Sopenharmony_ci * @since 1.0 66a3e0fd82Sopenharmony_ci * @version 1.0 67a3e0fd82Sopenharmony_ci */ 68a3e0fd82Sopenharmony_ciclass RootView : public UIViewGroup { 69a3e0fd82Sopenharmony_cipublic: 70a3e0fd82Sopenharmony_ci /** 71a3e0fd82Sopenharmony_ci * @brief Obtains a singleton <b>RootView</b> instance. 72a3e0fd82Sopenharmony_ci * 73a3e0fd82Sopenharmony_ci * @return Returns the singleton <b>RootView</b> instance. 74a3e0fd82Sopenharmony_ci * @since 1.0 75a3e0fd82Sopenharmony_ci * @version 1.0 76a3e0fd82Sopenharmony_ci */ 77a3e0fd82Sopenharmony_ci static RootView* GetInstance(); 78a3e0fd82Sopenharmony_ci 79a3e0fd82Sopenharmony_ci#if ENABLE_WINDOW 80a3e0fd82Sopenharmony_ci /** 81a3e0fd82Sopenharmony_ci * @brief Obtains a <b>RootView</b> instance bound to a window. 82a3e0fd82Sopenharmony_ci * 83a3e0fd82Sopenharmony_ci * @return Returns the <b>RootView</b> instance. 84a3e0fd82Sopenharmony_ci * @since 1.0 85a3e0fd82Sopenharmony_ci * @version 1.0 86a3e0fd82Sopenharmony_ci */ 87a3e0fd82Sopenharmony_ci static RootView* GetWindowRootView() 88a3e0fd82Sopenharmony_ci { 89a3e0fd82Sopenharmony_ci return new RootView; 90a3e0fd82Sopenharmony_ci } 91a3e0fd82Sopenharmony_ci 92a3e0fd82Sopenharmony_ci /** 93a3e0fd82Sopenharmony_ci * @brief Destroys the <b>RootView</b> bound to a window. 94a3e0fd82Sopenharmony_ci * 95a3e0fd82Sopenharmony_ci * @param rootView Indicates the pointer to the <b>RootView</b> to destroy. 96a3e0fd82Sopenharmony_ci * @return Returns <b>true</b> if the operation is successful; returns <b>false</b> otherwise. 97a3e0fd82Sopenharmony_ci * @since 1.0 98a3e0fd82Sopenharmony_ci * @version 1.0 99a3e0fd82Sopenharmony_ci */ 100a3e0fd82Sopenharmony_ci static bool DestroyWindowRootView(RootView* rootView) 101a3e0fd82Sopenharmony_ci { 102a3e0fd82Sopenharmony_ci if (rootView == RootView::GetInstance()) { 103a3e0fd82Sopenharmony_ci return false; 104a3e0fd82Sopenharmony_ci } 105a3e0fd82Sopenharmony_ci delete rootView; 106a3e0fd82Sopenharmony_ci return true; 107a3e0fd82Sopenharmony_ci } 108a3e0fd82Sopenharmony_ci#endif 109a3e0fd82Sopenharmony_ci 110a3e0fd82Sopenharmony_ci /** 111a3e0fd82Sopenharmony_ci * @brief Represents the listener for monitoring physical key events. 112a3e0fd82Sopenharmony_ci * 113a3e0fd82Sopenharmony_ci * @since 1.0 114a3e0fd82Sopenharmony_ci * @version 1.0 115a3e0fd82Sopenharmony_ci */ 116a3e0fd82Sopenharmony_ci class OnKeyActListener : public HeapBase { 117a3e0fd82Sopenharmony_ci public: 118a3e0fd82Sopenharmony_ci /** 119a3e0fd82Sopenharmony_ci * @brief Responds to a physical key event. 120a3e0fd82Sopenharmony_ci * 121a3e0fd82Sopenharmony_ci * @param view Indicates the view displayed upon a physical key event. 122a3e0fd82Sopenharmony_ci * @param event Indicates the physical key event to respond to. 123a3e0fd82Sopenharmony_ci * @return Returns <b>true</b> if the view is normally displayed upon a physical key 124a3e0fd82Sopenharmony_ci * event; returns <b> false</b> otherwise. 125a3e0fd82Sopenharmony_ci * @since 1.0 126a3e0fd82Sopenharmony_ci * @version 1.0 127a3e0fd82Sopenharmony_ci */ 128a3e0fd82Sopenharmony_ci virtual bool OnKeyAct(UIView& view, const KeyEvent& event) = 0; 129a3e0fd82Sopenharmony_ci }; 130a3e0fd82Sopenharmony_ci 131a3e0fd82Sopenharmony_ci /** 132a3e0fd82Sopenharmony_ci * @brief Obtains the view type. 133a3e0fd82Sopenharmony_ci * 134a3e0fd82Sopenharmony_ci * @return Returns <b>UI_ROOT_VIEW</b>, as defined in {@link UIViewType}. 135a3e0fd82Sopenharmony_ci * @since 1.0 136a3e0fd82Sopenharmony_ci * @version 1.0 137a3e0fd82Sopenharmony_ci */ 138a3e0fd82Sopenharmony_ci UIViewType GetViewType() const override 139a3e0fd82Sopenharmony_ci { 140a3e0fd82Sopenharmony_ci return UI_ROOT_VIEW; 141a3e0fd82Sopenharmony_ci } 142a3e0fd82Sopenharmony_ci 143a3e0fd82Sopenharmony_ci /** 144a3e0fd82Sopenharmony_ci * @brief Executes a physical key event. 145a3e0fd82Sopenharmony_ci * 146a3e0fd82Sopenharmony_ci * @param event Indicates the physical key event to execute. 147a3e0fd82Sopenharmony_ci * @since 1.0 148a3e0fd82Sopenharmony_ci * @version 1.0 149a3e0fd82Sopenharmony_ci */ 150a3e0fd82Sopenharmony_ci virtual void OnKeyEvent(const KeyEvent& event) 151a3e0fd82Sopenharmony_ci { 152a3e0fd82Sopenharmony_ci if (onKeyActListener_ != nullptr) { 153a3e0fd82Sopenharmony_ci onKeyActListener_->OnKeyAct(*this, event); 154a3e0fd82Sopenharmony_ci } 155a3e0fd82Sopenharmony_ci } 156a3e0fd82Sopenharmony_ci 157a3e0fd82Sopenharmony_ci /** 158a3e0fd82Sopenharmony_ci * @brief Sets the listener that contains a callback to be invoked upon a physical key event. 159a3e0fd82Sopenharmony_ci * 160a3e0fd82Sopenharmony_ci * @param onKeyActListener Indicates the pointer to the listener to set. 161a3e0fd82Sopenharmony_ci * @since 1.0 162a3e0fd82Sopenharmony_ci * @version 1.0 163a3e0fd82Sopenharmony_ci */ 164a3e0fd82Sopenharmony_ci void SetOnKeyActListener(OnKeyActListener* onKeyActListener) 165a3e0fd82Sopenharmony_ci { 166a3e0fd82Sopenharmony_ci onKeyActListener_ = onKeyActListener; 167a3e0fd82Sopenharmony_ci } 168a3e0fd82Sopenharmony_ci 169a3e0fd82Sopenharmony_ci /** 170a3e0fd82Sopenharmony_ci * @brief Clears the listener for monitoring physical key events. 171a3e0fd82Sopenharmony_ci * 172a3e0fd82Sopenharmony_ci * @since 1.0 173a3e0fd82Sopenharmony_ci * @version 1.0 174a3e0fd82Sopenharmony_ci */ 175a3e0fd82Sopenharmony_ci void ClearOnKeyActListener() 176a3e0fd82Sopenharmony_ci { 177a3e0fd82Sopenharmony_ci onKeyActListener_ = nullptr; 178a3e0fd82Sopenharmony_ci } 179a3e0fd82Sopenharmony_ci 180a3e0fd82Sopenharmony_ci /** 181a3e0fd82Sopenharmony_ci * @brief Listens for the input events triggered by a virtual device other than 182a3e0fd82Sopenharmony_ci * human touching or physical pressing. 183a3e0fd82Sopenharmony_ci * 184a3e0fd82Sopenharmony_ci * @since 1.0 185a3e0fd82Sopenharmony_ci * @version 1.0 186a3e0fd82Sopenharmony_ci */ 187a3e0fd82Sopenharmony_ci class OnVirtualDeviceEventListener : public HeapBase { 188a3e0fd82Sopenharmony_ci public: 189a3e0fd82Sopenharmony_ci /** 190a3e0fd82Sopenharmony_ci * @brief Responds to an input event triggered by a virtual device. 191a3e0fd82Sopenharmony_ci * 192a3e0fd82Sopenharmony_ci * @param view Indicates the view displayed upon an input event triggered by a virtual device. 193a3e0fd82Sopenharmony_ci * @param event Indicates the input event to respond to. 194a3e0fd82Sopenharmony_ci * @return Returns <b>true</b> if this view is normally displayed upon an input event triggered by a 195a3e0fd82Sopenharmony_ci * virtual device; returns <b> false</b> otherwise. 196a3e0fd82Sopenharmony_ci * @since 1.0 197a3e0fd82Sopenharmony_ci * @version 1.0 198a3e0fd82Sopenharmony_ci */ 199a3e0fd82Sopenharmony_ci virtual bool OnVirtualDeviceEvent(UIView& view, VirtualDeviceEvent event) = 0; 200a3e0fd82Sopenharmony_ci }; 201a3e0fd82Sopenharmony_ci 202a3e0fd82Sopenharmony_ci /** 203a3e0fd82Sopenharmony_ci * @brief Executes an input event triggered by a virtual device. 204a3e0fd82Sopenharmony_ci * 205a3e0fd82Sopenharmony_ci * @param event Indicates the input event to respond to. 206a3e0fd82Sopenharmony_ci * @since 1.0 207a3e0fd82Sopenharmony_ci * @version 1.0 208a3e0fd82Sopenharmony_ci */ 209a3e0fd82Sopenharmony_ci virtual void OnVirtualDeviceEvent(const VirtualDeviceEvent& event) 210a3e0fd82Sopenharmony_ci { 211a3e0fd82Sopenharmony_ci if (onVirtualEventListener_ != nullptr) { 212a3e0fd82Sopenharmony_ci onVirtualEventListener_->OnVirtualDeviceEvent(*this, event); 213a3e0fd82Sopenharmony_ci } 214a3e0fd82Sopenharmony_ci } 215a3e0fd82Sopenharmony_ci 216a3e0fd82Sopenharmony_ci /** 217a3e0fd82Sopenharmony_ci * @brief Sets a listener for monitoring the input events of a virtual device. 218a3e0fd82Sopenharmony_ci * 219a3e0fd82Sopenharmony_ci * @param onVirtualDeviceEventListener Indicates the pointer to the listener to set. 220a3e0fd82Sopenharmony_ci * @since 1.0 221a3e0fd82Sopenharmony_ci * @version 1.0 222a3e0fd82Sopenharmony_ci */ 223a3e0fd82Sopenharmony_ci void SetOnVirtualDeviceEventListener(OnVirtualDeviceEventListener* onVirtualDeviceEventListener) 224a3e0fd82Sopenharmony_ci { 225a3e0fd82Sopenharmony_ci onVirtualEventListener_ = onVirtualDeviceEventListener; 226a3e0fd82Sopenharmony_ci } 227a3e0fd82Sopenharmony_ci 228a3e0fd82Sopenharmony_ci /** 229a3e0fd82Sopenharmony_ci * @brief Clears the listener for monitoring the input events of a virtual device. 230a3e0fd82Sopenharmony_ci * 231a3e0fd82Sopenharmony_ci * @since 1.0 232a3e0fd82Sopenharmony_ci * @version 1.0 233a3e0fd82Sopenharmony_ci */ 234a3e0fd82Sopenharmony_ci void ClearOnVirtualDeviceEventListener() 235a3e0fd82Sopenharmony_ci { 236a3e0fd82Sopenharmony_ci onVirtualEventListener_ = nullptr; 237a3e0fd82Sopenharmony_ci } 238a3e0fd82Sopenharmony_ci 239a3e0fd82Sopenharmony_ci /** 240a3e0fd82Sopenharmony_ci * @brief Checks whether the target view is one of the child views of the specified parent view. 241a3e0fd82Sopenharmony_ci * 242a3e0fd82Sopenharmony_ci * @param parentView Indicates the specified parent view. 243a3e0fd82Sopenharmony_ci * @param subView Indicates the target child view. 244a3e0fd82Sopenharmony_ci * @return Returns <b>true</b> if the target view is available; returns <b> false</b> otherwise. 245a3e0fd82Sopenharmony_ci * @since 1.0 246a3e0fd82Sopenharmony_ci * @version 1.0 247a3e0fd82Sopenharmony_ci */ 248a3e0fd82Sopenharmony_ci static bool FindSubView(const UIView& parentView, const UIView* subView); 249a3e0fd82Sopenharmony_ci 250a3e0fd82Sopenharmony_ci#if ENABLE_WINDOW 251a3e0fd82Sopenharmony_ci /** 252a3e0fd82Sopenharmony_ci * @brief Obtains the window bound with a <b>RootView</b>. 253a3e0fd82Sopenharmony_ci * 254a3e0fd82Sopenharmony_ci * @return Returns the window. 255a3e0fd82Sopenharmony_ci * @since 1.0 256a3e0fd82Sopenharmony_ci * @version 1.0 257a3e0fd82Sopenharmony_ci */ 258a3e0fd82Sopenharmony_ci Window* GetBoundWindow() const; 259a3e0fd82Sopenharmony_ci#endif 260a3e0fd82Sopenharmony_ci 261a3e0fd82Sopenharmony_ci void DrawTop(UIView* view, const Rect& rect); 262a3e0fd82Sopenharmony_ci 263a3e0fd82Sopenharmony_ci /** 264a3e0fd82Sopenharmony_ci * @brief Measure all child view under RootView 265a3e0fd82Sopenharmony_ci */ 266a3e0fd82Sopenharmony_ci void Measure(); 267a3e0fd82Sopenharmony_ci 268a3e0fd82Sopenharmony_ci void MeasureView(UIView* view); 269a3e0fd82Sopenharmony_ci 270a3e0fd82Sopenharmony_ci /** 271a3e0fd82Sopenharmony_ci * @brief update momory info based on FB buffer info. 272a3e0fd82Sopenharmony_ci * 273a3e0fd82Sopenharmony_ci * @param fbBufferInfo FB buffer info 274a3e0fd82Sopenharmony_ci * @since 6.0 275a3e0fd82Sopenharmony_ci * @version 6.0 276a3e0fd82Sopenharmony_ci */ 277a3e0fd82Sopenharmony_ci void UpdateBufferInfo(BufferInfo* fbBufferInfo); 278a3e0fd82Sopenharmony_ci 279a3e0fd82Sopenharmony_ci /** 280a3e0fd82Sopenharmony_ci * @brief save the drawing context. 281a3e0fd82Sopenharmony_ci * 282a3e0fd82Sopenharmony_ci * @since 6.0 283a3e0fd82Sopenharmony_ci * @version 6.0 284a3e0fd82Sopenharmony_ci */ 285a3e0fd82Sopenharmony_ci void SaveDrawContext(); 286a3e0fd82Sopenharmony_ci 287a3e0fd82Sopenharmony_ci /** 288a3e0fd82Sopenharmony_ci * @brief restore the drawing context. 289a3e0fd82Sopenharmony_ci * 290a3e0fd82Sopenharmony_ci * @since 6.0 291a3e0fd82Sopenharmony_ci * @version 6.0 292a3e0fd82Sopenharmony_ci */ 293a3e0fd82Sopenharmony_ci void RestoreDrawContext(); 294a3e0fd82Sopenharmony_ci 295a3e0fd82Sopenharmony_ciprivate: 296a3e0fd82Sopenharmony_ci friend class RenderManager; 297a3e0fd82Sopenharmony_ci friend class UIViewGroup; 298a3e0fd82Sopenharmony_ci friend class UIView; 299a3e0fd82Sopenharmony_ci#if ENABLE_WINDOW 300a3e0fd82Sopenharmony_ci friend class WindowImpl; 301a3e0fd82Sopenharmony_ci#endif 302a3e0fd82Sopenharmony_ci 303a3e0fd82Sopenharmony_ci RootView(); 304a3e0fd82Sopenharmony_ci 305a3e0fd82Sopenharmony_ci ~RootView(); 306a3e0fd82Sopenharmony_ci 307a3e0fd82Sopenharmony_ci inline Rect GetScreenRect(); 308a3e0fd82Sopenharmony_ci void AddInvalidateRectWithLock(Rect& rect, UIView *view); 309a3e0fd82Sopenharmony_ci void AddInvalidateRect(Rect& rect, UIView* view); 310a3e0fd82Sopenharmony_ci void Render(); 311a3e0fd82Sopenharmony_ci UIView* GetTopUIView(const Rect& rect); 312a3e0fd82Sopenharmony_ci void InitDrawContext(); 313a3e0fd82Sopenharmony_ci void DestroyDrawContext(); 314a3e0fd82Sopenharmony_ci void InitMapBufferInfo(BufferInfo* bufferInfo); 315a3e0fd82Sopenharmony_ci void DestroyMapBufferInfo(); 316a3e0fd82Sopenharmony_ci void BlitMapBuffer(Rect& curViewRect, TransformMap& transMap, const Rect& invalidatedArea); 317a3e0fd82Sopenharmony_ci void ClearMapBuffer(); 318a3e0fd82Sopenharmony_ci void UpdateMapBufferInfo(Rect& invalidatedArea); 319a3e0fd82Sopenharmony_ci void RestoreMapBufferInfo(); 320a3e0fd82Sopenharmony_ci /** 321a3e0fd82Sopenharmony_ci * @brief check need rootview to trans view 322a3e0fd82Sopenharmony_ci * 323a3e0fd82Sopenharmony_ci * @param param UIView 324a3e0fd82Sopenharmony_ci * @return true if need rootview to trans view 325a3e0fd82Sopenharmony_ci */ 326a3e0fd82Sopenharmony_ci bool CheckNeedRootViewTransView(UIView* curview); 327a3e0fd82Sopenharmony_ci#if LOCAL_RENDER 328a3e0fd82Sopenharmony_ci void RemoveViewFromInvalidMap(UIView *view); 329a3e0fd82Sopenharmony_ci void DrawInvalidMap(const Rect &buffRect); 330a3e0fd82Sopenharmony_ci void OptimizeInvalidView(UIView* curview, UIView* background, List<Rect> &renderedRects); 331a3e0fd82Sopenharmony_ci void OptimizeInvalidMap(); 332a3e0fd82Sopenharmony_ci 333a3e0fd82Sopenharmony_ci std::map<UIView*, Graphic::Vector<Rect>> invalidateMap_; 334a3e0fd82Sopenharmony_ci#else 335a3e0fd82Sopenharmony_ci void OptimizeAddRect(Rect& rect); 336a3e0fd82Sopenharmony_ci void OptimizeInvalidateRects(); 337a3e0fd82Sopenharmony_ci List<Rect> invalidateRects_; 338a3e0fd82Sopenharmony_ci#endif 339a3e0fd82Sopenharmony_ci 340a3e0fd82Sopenharmony_ci OnKeyActListener* onKeyActListener_ {nullptr}; 341a3e0fd82Sopenharmony_ci OnVirtualDeviceEventListener* onVirtualEventListener_ {nullptr}; 342a3e0fd82Sopenharmony_ci#if defined __linux__ || defined __LITEOS__ || defined __APPLE__ 343a3e0fd82Sopenharmony_ci pthread_mutex_t lock_; 344a3e0fd82Sopenharmony_ci#endif 345a3e0fd82Sopenharmony_ci 346a3e0fd82Sopenharmony_ci#if ENABLE_WINDOW 347a3e0fd82Sopenharmony_ci WindowImpl* boundWindow_ {nullptr}; 348a3e0fd82Sopenharmony_ci#endif 349a3e0fd82Sopenharmony_ci /** 350a3e0fd82Sopenharmony_ci * @brief draw context info. 351a3e0fd82Sopenharmony_ci * @param bufferInfo dst drawing buffer info. 352a3e0fd82Sopenharmony_ci * @param mapBufferInfo dst animator drawing buffer info. 353a3e0fd82Sopenharmony_ci * @since 6.0 354a3e0fd82Sopenharmony_ci * @version 6.0 355a3e0fd82Sopenharmony_ci */ 356a3e0fd82Sopenharmony_ci struct DrawContext { 357a3e0fd82Sopenharmony_ci BufferInfo* bufferInfo; 358a3e0fd82Sopenharmony_ci BufferInfo* mapBufferInfo; 359a3e0fd82Sopenharmony_ci }; 360a3e0fd82Sopenharmony_ci DrawContext dc_; 361a3e0fd82Sopenharmony_ci DrawContext bakDc_; 362a3e0fd82Sopenharmony_ci}; 363a3e0fd82Sopenharmony_ci} // namespace OHOS 364a3e0fd82Sopenharmony_ci#endif // GRAPHIC_LITE_ROOT_VIEW_H 365