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()27CanvasContext* 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)56CanvasContext::CanvasContext(std::unique_ptr<IRenderBackend> renderBackend) 57 : renderBackend_(std::move(renderBackend)) 58 { 59 } 60 ~CanvasContext()61CanvasContext::~CanvasContext() 62 { 63 renderBackend_->Destroy(); 64 } 65 CreateSurface(void * window)66void* CanvasContext::CreateSurface(void* window) 67 { 68 return renderBackend_->CreateSurface(window); 69 } 70 RenderFrame()71void CanvasContext::RenderFrame() 72 { 73 renderBackend_->RenderFrame(); 74 } 75 AcquireSkCanvas(std::unique_ptr<SurfaceFrame> & frame)76SkCanvas* CanvasContext::AcquireSkCanvas(std::unique_ptr<SurfaceFrame>& frame) 77 { 78 return renderBackend_->AcquireSkCanvas(frame); 79 } 80 AcquireDrCanvas(std::unique_ptr<SurfaceFrame> & frame)81Drawing::Canvas* CanvasContext::AcquireDrCanvas(std::unique_ptr<SurfaceFrame>& frame) 82 { 83 return renderBackend_->AcquireDrCanvas(frame); 84 } 85 InitDrawContext()86void CanvasContext::InitDrawContext() 87 { 88 renderBackend_->InitDrawContext(); 89 } 90 MakeCurrent()91void CanvasContext::MakeCurrent() 92 { 93 renderBackend_->MakeCurrent(); 94 } 95 SwapBuffers()96void CanvasContext::SwapBuffers() 97 { 98 renderBackend_->SwapBuffers(); 99 } 100 } 101 }