SkSLPrefixExpression.h 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. #ifndef SKSL_PREFIXEXPRESSION
  8. #define SKSL_PREFIXEXPRESSION
  9. #include "src/sksl/SkSLCompiler.h"
  10. #include "src/sksl/SkSLIRGenerator.h"
  11. #include "src/sksl/SkSLLexer.h"
  12. #include "src/sksl/ir/SkSLExpression.h"
  13. #include "src/sksl/ir/SkSLFloatLiteral.h"
  14. namespace SkSL {
  15. /**
  16. * An expression modified by a unary operator appearing before it, such as '!flag'.
  17. */
  18. struct PrefixExpression : public Expression {
  19. PrefixExpression(Token::Kind op, std::unique_ptr<Expression> operand)
  20. : INHERITED(operand->fOffset, kPrefix_Kind, operand->fType)
  21. , fOperand(std::move(operand))
  22. , fOperator(op) {}
  23. bool isConstant() const override {
  24. return fOperator == Token::MINUS && fOperand->isConstant();
  25. }
  26. bool hasSideEffects() const override {
  27. return fOperator == Token::PLUSPLUS || fOperator == Token::MINUSMINUS ||
  28. fOperand->hasSideEffects();
  29. }
  30. std::unique_ptr<Expression> constantPropagate(const IRGenerator& irGenerator,
  31. const DefinitionMap& definitions) override {
  32. if (fOperand->fKind == Expression::kFloatLiteral_Kind) {
  33. return std::unique_ptr<Expression>(new FloatLiteral(
  34. irGenerator.fContext,
  35. fOffset,
  36. -((FloatLiteral&) *fOperand).fValue));
  37. }
  38. return nullptr;
  39. }
  40. SKSL_FLOAT getFVecComponent(int index) const override {
  41. SkASSERT(fOperator == Token::Kind::MINUS);
  42. return -fOperand->getFVecComponent(index);
  43. }
  44. SKSL_INT getIVecComponent(int index) const override {
  45. SkASSERT(fOperator == Token::Kind::MINUS);
  46. return -fOperand->getIVecComponent(index);
  47. }
  48. SKSL_FLOAT getMatComponent(int col, int row) const override {
  49. SkASSERT(fOperator == Token::Kind::MINUS);
  50. return -fOperand->getMatComponent(col, row);
  51. }
  52. std::unique_ptr<Expression> clone() const override {
  53. return std::unique_ptr<Expression>(new PrefixExpression(fOperator, fOperand->clone()));
  54. }
  55. String description() const override {
  56. return Compiler::OperatorName(fOperator) + fOperand->description();
  57. }
  58. std::unique_ptr<Expression> fOperand;
  59. const Token::Kind fOperator;
  60. typedef Expression INHERITED;
  61. };
  62. } // namespace
  63. #endif