1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "canvas_context.h"
17 
18 #include <iostream>
19 
20 #include "drawing_utils.h"
21 #include "software_render_backend.h"
22 #include "gles_render_backend.h"
23 #include "vulkan_render_backend.h"
24 
25 namespace OHOS {
26 namespace Rosen {
Create()27 CanvasContext* CanvasContext::Create()
28 {
29     auto type = Setting::GetRenderBackendType();
30     switch (type) {
31         case RenderBackendType::VULKAN:
32 #ifdef RS_ENABLE_VK
33             if (RSSystemProperties::IsUseVulkan()) {
34                 std::cout << "CanvasContext::Create with vulkan backend" << std::endl;
35                 return new CanvasContext(std::make_unique<VulkanRenderBackend>());
36             }
37 #endif
38             break;
39         case RenderBackendType::GLES:
40 #ifdef RS_ENABLE_GL
41             if (RSSystemProperties::GetGpuApiType() == GpuApiType::OPENGL) {
42                 std::cout << "CanvasContext::Create with gles backend" << std::endl;
43                 return new CanvasContext(std::make_unique<GLESRenderBackend>());
44             }
45 #endif
46             break;
47         case RenderBackendType::SOFTWARE:
48             std::cout << "CanvasContext::Create with software backend" << std::endl;
49             return new CanvasContext(std::make_unique<SoftwareRenderBackend>());
50         default:
51             return nullptr;
52     }
53     return nullptr;
54 }
55 
CanvasContext(std::unique_ptr<IRenderBackend> renderBackend)56 CanvasContext::CanvasContext(std::unique_ptr<IRenderBackend> renderBackend)
57     : renderBackend_(std::move(renderBackend))
58 {
59 }
60 
~CanvasContext()61 CanvasContext::~CanvasContext()
62 {
63     renderBackend_->Destroy();
64 }
65 
CreateSurface(void * window)66 void* CanvasContext::CreateSurface(void* window)
67 {
68     return renderBackend_->CreateSurface(window);
69 }
70 
RenderFrame()71 void CanvasContext::RenderFrame()
72 {
73     renderBackend_->RenderFrame();
74 }
75 
AcquireSkCanvas(std::unique_ptr<SurfaceFrame> & frame)76 SkCanvas* CanvasContext::AcquireSkCanvas(std::unique_ptr<SurfaceFrame>& frame)
77 {
78     return renderBackend_->AcquireSkCanvas(frame);
79 }
80 
AcquireDrCanvas(std::unique_ptr<SurfaceFrame> & frame)81 Drawing::Canvas* CanvasContext::AcquireDrCanvas(std::unique_ptr<SurfaceFrame>& frame)
82 {
83     return renderBackend_->AcquireDrCanvas(frame);
84 }
85 
InitDrawContext()86 void CanvasContext::InitDrawContext()
87 {
88     renderBackend_->InitDrawContext();
89 }
90 
MakeCurrent()91 void CanvasContext::MakeCurrent()
92 {
93     renderBackend_->MakeCurrent();
94 }
95 
SwapBuffers()96 void CanvasContext::SwapBuffers()
97 {
98     renderBackend_->SwapBuffers();
99 }
100 }
101 }