1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 Google LLC 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "experimental/graphite/src/DrawList.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "experimental/graphite/src/Renderer.h" 11cb93a386Sopenharmony_ci#include "include/core/SkShader.h" 12cb93a386Sopenharmony_ci#include "src/gpu/BufferWriter.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_cinamespace skgpu { 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_ciPaintParams::PaintParams(const SkColor4f& color, 17cb93a386Sopenharmony_ci SkBlendMode blendMode, 18cb93a386Sopenharmony_ci sk_sp<SkShader> shader) 19cb93a386Sopenharmony_ci : fColor(color) 20cb93a386Sopenharmony_ci , fBlendMode(blendMode) 21cb93a386Sopenharmony_ci , fShader(std::move(shader)) { 22cb93a386Sopenharmony_ci} 23cb93a386Sopenharmony_ciPaintParams::PaintParams(const PaintParams& other) 24cb93a386Sopenharmony_ci : fColor(other.fColor) 25cb93a386Sopenharmony_ci , fBlendMode(other.fBlendMode) 26cb93a386Sopenharmony_ci , fShader(other.fShader) { 27cb93a386Sopenharmony_ci} 28cb93a386Sopenharmony_ciPaintParams::~PaintParams() {} 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ciPaintParams& PaintParams::operator=(const PaintParams& other) { 31cb93a386Sopenharmony_ci fColor = other.fColor; 32cb93a386Sopenharmony_ci fBlendMode = other.fBlendMode; 33cb93a386Sopenharmony_ci fShader = other.fShader; 34cb93a386Sopenharmony_ci return *this; 35cb93a386Sopenharmony_ci} 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_cisk_sp<SkShader> PaintParams::refShader() const { return fShader; } 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ciconst Transform& DrawList::deduplicateTransform(const Transform& localToDevice) { 40cb93a386Sopenharmony_ci // TODO: This is a pretty simple deduplication strategy and doesn't take advantage of the stack 41cb93a386Sopenharmony_ci // knowledge that Device has. 42cb93a386Sopenharmony_ci if (fTransforms.empty() || fTransforms.back() != localToDevice) { 43cb93a386Sopenharmony_ci fTransforms.push_back(localToDevice); 44cb93a386Sopenharmony_ci } 45cb93a386Sopenharmony_ci return fTransforms.back(); 46cb93a386Sopenharmony_ci} 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_civoid DrawList::stencilAndFillPath(const Transform& localToDevice, 49cb93a386Sopenharmony_ci const Shape& shape, 50cb93a386Sopenharmony_ci const Clip& clip, 51cb93a386Sopenharmony_ci DrawOrder ordering, 52cb93a386Sopenharmony_ci const PaintParams* paint) { 53cb93a386Sopenharmony_ci SkASSERT(localToDevice.valid()); 54cb93a386Sopenharmony_ci SkASSERT(!shape.isEmpty() && !clip.drawBounds().isEmptyNegativeOrNaN()); 55cb93a386Sopenharmony_ci fDraws.push_back({Renderer::StencilAndFillPath(), 56cb93a386Sopenharmony_ci this->deduplicateTransform(localToDevice), 57cb93a386Sopenharmony_ci shape, clip, ordering, paint, nullptr}); 58cb93a386Sopenharmony_ci fRenderStepCount += Renderer::StencilAndFillPath().numRenderSteps(); 59cb93a386Sopenharmony_ci} 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_civoid DrawList::fillConvexPath(const Transform& localToDevice, 62cb93a386Sopenharmony_ci const Shape& shape, 63cb93a386Sopenharmony_ci const Clip& clip, 64cb93a386Sopenharmony_ci DrawOrder ordering, 65cb93a386Sopenharmony_ci const PaintParams* paint) { 66cb93a386Sopenharmony_ci SkASSERT(localToDevice.valid()); 67cb93a386Sopenharmony_ci SkASSERT(!shape.isEmpty() && !clip.drawBounds().isEmptyNegativeOrNaN()); 68cb93a386Sopenharmony_ci // TODO actually record this, but for now just drop the draw since the Renderer 69cb93a386Sopenharmony_ci // isn't implemented yet 70cb93a386Sopenharmony_ci // fDraws.push_back({Renderer::FillConvexPath(), 71cb93a386Sopenharmony_ci // this->deduplicateTransform(localToDevice), 72cb93a386Sopenharmony_ci // shape, clip, ordering, paint, nullptr}); 73cb93a386Sopenharmony_ci // fRenderStepCount += Renderer::FillConvexPath().numRenderSteps(); 74cb93a386Sopenharmony_ci} 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_civoid DrawList::strokePath(const Transform& localToDevice, 77cb93a386Sopenharmony_ci const Shape& shape, 78cb93a386Sopenharmony_ci const StrokeParams& stroke, 79cb93a386Sopenharmony_ci const Clip& clip, 80cb93a386Sopenharmony_ci DrawOrder ordering, 81cb93a386Sopenharmony_ci const PaintParams* paint) { 82cb93a386Sopenharmony_ci SkASSERT(localToDevice.valid()); 83cb93a386Sopenharmony_ci SkASSERT(!shape.isEmpty() && !clip.drawBounds().isEmptyNegativeOrNaN()); 84cb93a386Sopenharmony_ci // TODO actually record this, but for now just drop the draw since the Renderer 85cb93a386Sopenharmony_ci // isn't implemented yet 86cb93a386Sopenharmony_ci // fDraws.push_back({Renderer::StrokePath(), 87cb93a386Sopenharmony_ci // this->deduplicateTransform(localToDevice), 88cb93a386Sopenharmony_ci // shape, clip, ordering, paint, stroke}); 89cb93a386Sopenharmony_ci // fRenderStepCount += Renderer::StrokePath().numRenderSteps(); 90cb93a386Sopenharmony_ci} 91cb93a386Sopenharmony_ci 92cb93a386Sopenharmony_cisize_t DrawList::Draw::requiredVertexSpace(int renderStep) const { 93cb93a386Sopenharmony_ci SkASSERT(renderStep < fRenderer.numRenderSteps()); 94cb93a386Sopenharmony_ci return fRenderer.steps()[renderStep]->requiredVertexSpace(fShape); 95cb93a386Sopenharmony_ci} 96cb93a386Sopenharmony_ci 97cb93a386Sopenharmony_cisize_t DrawList::Draw::requiredIndexSpace(int renderStep) const { 98cb93a386Sopenharmony_ci SkASSERT(renderStep < fRenderer.numRenderSteps()); 99cb93a386Sopenharmony_ci return fRenderer.steps()[renderStep]->requiredIndexSpace(fShape); 100cb93a386Sopenharmony_ci} 101cb93a386Sopenharmony_ci 102cb93a386Sopenharmony_civoid DrawList::Draw::writeVertices(VertexWriter vertexWriter, 103cb93a386Sopenharmony_ci IndexWriter indexWriter, 104cb93a386Sopenharmony_ci int renderStep) const { 105cb93a386Sopenharmony_ci SkASSERT(renderStep < fRenderer.numRenderSteps()); 106cb93a386Sopenharmony_ci fRenderer.steps()[renderStep]->writeVertices(std::move(vertexWriter), 107cb93a386Sopenharmony_ci std::move(indexWriter), 108cb93a386Sopenharmony_ci fShape); 109cb93a386Sopenharmony_ci} 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ci} // namespace skgpu 112