1 /* 2 * Copyright 2021 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 #ifndef SKSL_CONSTRUCTOR_DIAGONAL_MATRIX 9 #define SKSL_CONSTRUCTOR_DIAGONAL_MATRIX 10 11 #include "include/private/SkSLDefines.h" 12 #include "src/sksl/SkSLContext.h" 13 #include "src/sksl/ir/SkSLConstructor.h" 14 #include "src/sksl/ir/SkSLExpression.h" 15 #include "src/sksl/ir/SkSLLiteral.h" 16 17 #include <memory> 18 19 namespace SkSL { 20 21 /** 22 * Represents the construction of a diagonal matrix, such as `half3x3(n)`. 23 * 24 * These always contain exactly 1 scalar. 25 */ 26 class ConstructorDiagonalMatrix final : public SingleArgumentConstructor { 27 public: 28 inline static constexpr Kind kExpressionKind = Kind::kConstructorDiagonalMatrix; 29 ConstructorDiagonalMatrix(int line,const Type & type,std::unique_ptr<Expression> arg)30 ConstructorDiagonalMatrix(int line, const Type& type, std::unique_ptr<Expression> arg) 31 : INHERITED(line, kExpressionKind, &type, std::move(arg)) {} 32 33 static std::unique_ptr<Expression> Make(const Context& context, 34 int line, 35 const Type& type, 36 std::unique_ptr<Expression> arg); 37 clone()38 std::unique_ptr<Expression> clone() const override { 39 return std::make_unique<ConstructorDiagonalMatrix>(fLine, this->type(), 40 argument()->clone()); 41 } 42 supportsConstantValues()43 bool supportsConstantValues() const override { return true; } 44 skstd::optional<double> getConstantValue(int n) const override; 45 46 private: 47 using INHERITED = SingleArgumentConstructor; 48 }; 49 50 } // namespace SkSL 51 52 #endif 53