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