/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include "CanvasOps.h" #include #include namespace android::uirenderer { class CanvasOpBuffer; void rasterizeCanvasBuffer(const CanvasOpBuffer& source, SkCanvas* destination); class ImmediateModeRasterizer { public: explicit ImmediateModeRasterizer(std::unique_ptr&& canvas) { mCanvas = canvas.get(); mOwnership = std::move(canvas); } explicit ImmediateModeRasterizer(std::shared_ptr canvas) { mCanvas = canvas.get(); mOwnership = std::move(canvas); } explicit ImmediateModeRasterizer(Bitmap& bitmap) { mCanvas = &(mOwnership.emplace(bitmap.getSkBitmap())); } template void draw(const CanvasOp& op) { if constexpr (CanvasOpTraits::can_draw>) { op.draw(mCanvas); } } private: SkCanvas* mCanvas; // Just here to keep mCanvas alive. Thankfully we never need to actually look inside this... std::variant, std::unique_ptr> mOwnership; }; } // namespace android::uirenderer