1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2020 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker #pragma once 18*d57664e9SAndroid Build Coastguard Worker 19*d57664e9SAndroid Build Coastguard Worker #include <hwui/Bitmap.h> 20*d57664e9SAndroid Build Coastguard Worker 21*d57664e9SAndroid Build Coastguard Worker #include <SkBitmap.h> 22*d57664e9SAndroid Build Coastguard Worker #include <SkCanvas.h> 23*d57664e9SAndroid Build Coastguard Worker 24*d57664e9SAndroid Build Coastguard Worker #include "CanvasOps.h" 25*d57664e9SAndroid Build Coastguard Worker 26*d57664e9SAndroid Build Coastguard Worker #include <experimental/type_traits> 27*d57664e9SAndroid Build Coastguard Worker #include <variant> 28*d57664e9SAndroid Build Coastguard Worker 29*d57664e9SAndroid Build Coastguard Worker namespace android::uirenderer { 30*d57664e9SAndroid Build Coastguard Worker 31*d57664e9SAndroid Build Coastguard Worker class CanvasOpBuffer; 32*d57664e9SAndroid Build Coastguard Worker 33*d57664e9SAndroid Build Coastguard Worker void rasterizeCanvasBuffer(const CanvasOpBuffer& source, SkCanvas* destination); 34*d57664e9SAndroid Build Coastguard Worker 35*d57664e9SAndroid Build Coastguard Worker class ImmediateModeRasterizer { 36*d57664e9SAndroid Build Coastguard Worker public: ImmediateModeRasterizer(std::unique_ptr<SkCanvas> && canvas)37*d57664e9SAndroid Build Coastguard Worker explicit ImmediateModeRasterizer(std::unique_ptr<SkCanvas>&& canvas) { 38*d57664e9SAndroid Build Coastguard Worker mCanvas = canvas.get(); 39*d57664e9SAndroid Build Coastguard Worker mOwnership = std::move(canvas); 40*d57664e9SAndroid Build Coastguard Worker } 41*d57664e9SAndroid Build Coastguard Worker ImmediateModeRasterizer(std::shared_ptr<SkCanvas> canvas)42*d57664e9SAndroid Build Coastguard Worker explicit ImmediateModeRasterizer(std::shared_ptr<SkCanvas> canvas) { 43*d57664e9SAndroid Build Coastguard Worker mCanvas = canvas.get(); 44*d57664e9SAndroid Build Coastguard Worker mOwnership = std::move(canvas); 45*d57664e9SAndroid Build Coastguard Worker } 46*d57664e9SAndroid Build Coastguard Worker ImmediateModeRasterizer(Bitmap & bitmap)47*d57664e9SAndroid Build Coastguard Worker explicit ImmediateModeRasterizer(Bitmap& bitmap) { 48*d57664e9SAndroid Build Coastguard Worker mCanvas = &(mOwnership.emplace<SkCanvas>(bitmap.getSkBitmap())); 49*d57664e9SAndroid Build Coastguard Worker } 50*d57664e9SAndroid Build Coastguard Worker 51*d57664e9SAndroid Build Coastguard Worker template <CanvasOpType T> draw(const CanvasOp<T> & op)52*d57664e9SAndroid Build Coastguard Worker void draw(const CanvasOp<T>& op) { 53*d57664e9SAndroid Build Coastguard Worker if constexpr (CanvasOpTraits::can_draw<CanvasOp<T>>) { 54*d57664e9SAndroid Build Coastguard Worker op.draw(mCanvas); 55*d57664e9SAndroid Build Coastguard Worker } 56*d57664e9SAndroid Build Coastguard Worker } 57*d57664e9SAndroid Build Coastguard Worker 58*d57664e9SAndroid Build Coastguard Worker private: 59*d57664e9SAndroid Build Coastguard Worker SkCanvas* mCanvas; 60*d57664e9SAndroid Build Coastguard Worker // Just here to keep mCanvas alive. Thankfully we never need to actually look inside this... 61*d57664e9SAndroid Build Coastguard Worker std::variant<SkCanvas, std::shared_ptr<SkCanvas>, std::unique_ptr<SkCanvas>> mOwnership; 62*d57664e9SAndroid Build Coastguard Worker }; 63*d57664e9SAndroid Build Coastguard Worker 64*d57664e9SAndroid Build Coastguard Worker } // namespace android::uirenderer 65