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