| /* | |
| * 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. | |
| */ | |
| #include "CanvasOpRasterizer.h" | |
| #include <SkCanvas.h> | |
| #include <log/log.h> | |
| #include <vector> | |
| #include "CanvasOpBuffer.h" | |
| #include "CanvasOps.h" | |
| namespace android::uirenderer { | |
| void rasterizeCanvasBuffer(const CanvasOpBuffer& source, SkCanvas* destination) { | |
| // Tracks the global transform from the current display list back toward the display space | |
| // Push on beginning a RenderNode draw, pop on ending one | |
| std::vector<SkMatrix> globalMatrixStack; | |
| SkMatrix& currentGlobalTransform = globalMatrixStack.emplace_back(SkMatrix::I()); | |
| source.for_each([&]<CanvasOpType T>(const CanvasOpContainer<T> * op) { | |
| if constexpr (CanvasOpTraits::can_draw<CanvasOp<T>>) { | |
| // Generic OP | |
| // First apply the current transformation | |
| destination->setMatrix(SkMatrix::Concat(currentGlobalTransform, op->transform())); | |
| // Now draw it | |
| (*op)->draw(destination); | |
| return; | |
| } | |
| LOG_ALWAYS_FATAL("TODO, unable to rasterize %d", static_cast<int>(T)); | |
| }); | |
| } | |
| } // namespace android::uirenderer |