• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2022 Google LLC
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "src/shaders/SkShaderBase.h"
9 
10 #include "include/core/SkFlattenable.h"
11 #include "src/core/SkVM.h"
12 
13 /**
14  *  \class SkEmptyShader
15  *  A Shader that always draws nothing. Its createContext always returns nullptr.
16  */
17 class SkEmptyShader : public SkShaderBase {
18 public:
SkEmptyShader()19     SkEmptyShader() {}
20 
21 protected:
flatten(SkWriteBuffer & buffer) const22     void flatten(SkWriteBuffer& buffer) const override {
23         // Do nothing.
24         // We just don't want to fall through to SkShader::flatten(),
25         // which will write data we don't care to serialize or decode.
26     }
27 
appendStages(const SkStageRec &,const MatrixRec &) const28     bool appendStages(const SkStageRec&, const MatrixRec&) const override { return false; }
29 
30     skvm::Color program(skvm::Builder*,
31                         skvm::Coord,
32                         skvm::Coord,
33                         skvm::Color,
34                         const MatrixRec&,
35                         const SkColorInfo&,
36                         skvm::Uniforms*,
37                         SkArenaAlloc*) const override;
38 
39 private:
40     friend void ::SkRegisterEmptyShaderFlattenable();
41     SK_FLATTENABLE_HOOKS(SkEmptyShader)
42 
43     using INHERITED = SkShaderBase;
44 };
45 
program(skvm::Builder *,skvm::Coord,skvm::Coord,skvm::Color,const MatrixRec &,const SkColorInfo &,skvm::Uniforms *,SkArenaAlloc *) const46 skvm::Color SkEmptyShader::program(skvm::Builder*,
47                                    skvm::Coord,
48                                    skvm::Coord,
49                                    skvm::Color,
50                                    const MatrixRec&,
51                                    const SkColorInfo&,
52                                    skvm::Uniforms*,
53                                    SkArenaAlloc*) const {
54     return {};  // signal failure
55 }
56 
CreateProc(SkReadBuffer &)57 sk_sp<SkFlattenable> SkEmptyShader::CreateProc(SkReadBuffer&) {
58     return SkShaders::Empty();
59 }
60 
Empty()61 sk_sp<SkShader> SkShaders::Empty() { return sk_make_sp<SkEmptyShader>(); }
62 
SkRegisterEmptyShaderFlattenable()63 void SkRegisterEmptyShaderFlattenable() {
64     SK_REGISTER_FLATTENABLE(SkEmptyShader);
65 }
66