1 /* 2 * Copyright 2016 Google Inc. 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 9 #define SKSL_CONSTRUCTOR 10 11 #include "SkSLExpression.h" 12 #include "SkSLFloatLiteral.h" 13 #include "SkSLIntLiteral.h" 14 #include "SkSLIRGenerator.h" 15 16 namespace SkSL { 17 18 /** 19 * Represents the construction of a compound type, such as "vec2(x, y)". 20 * 21 * Vector constructors will always consist of either exactly 1 scalar, or a collection of vectors 22 * and scalars totalling exactly the right number of scalar components. 23 * 24 * Matrix constructors will always consist of either exactly 1 scalar, exactly 1 matrix, or a 25 * collection of vectors and scalars totalling exactly the right number of scalar components. 26 */ 27 struct Constructor : public Expression { ConstructorConstructor28 Constructor(Position position, const Type& type, 29 std::vector<std::unique_ptr<Expression>> arguments) 30 : INHERITED(position, kConstructor_Kind, type) 31 , fArguments(std::move(arguments)) {} 32 constantPropagateConstructor33 virtual std::unique_ptr<Expression> constantPropagate( 34 const IRGenerator& irGenerator, 35 const DefinitionMap& definitions) override { 36 if (fArguments.size() == 1 && fArguments[0]->fKind == Expression::kIntLiteral_Kind && 37 // promote float(1) to 1.0 38 fType == *irGenerator.fContext.fFloat_Type) { 39 int64_t intValue = ((IntLiteral&) *fArguments[0]).fValue; 40 return std::unique_ptr<Expression>(new FloatLiteral(irGenerator.fContext, 41 fPosition, 42 intValue)); 43 } 44 return nullptr; 45 } 46 descriptionConstructor47 SkString description() const override { 48 SkString result = fType.description() + "("; 49 SkString separator; 50 for (size_t i = 0; i < fArguments.size(); i++) { 51 result += separator; 52 result += fArguments[i]->description(); 53 separator = ", "; 54 } 55 result += ")"; 56 return result; 57 } 58 isConstantConstructor59 bool isConstant() const override { 60 for (size_t i = 0; i < fArguments.size(); i++) { 61 if (!fArguments[i]->isConstant()) { 62 return false; 63 } 64 } 65 return true; 66 } 67 68 std::vector<std::unique_ptr<Expression>> fArguments; 69 70 typedef Expression INHERITED; 71 }; 72 73 } // namespace 74 75 #endif 76