2021-01-07 15:57:27 +00:00
|
|
|
/*
|
|
|
|
* Copyright 2020 Google LLC
|
|
|
|
*
|
|
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
|
|
* found in the LICENSE file.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef SKSL_DSL_EXPRESSION
|
|
|
|
#define SKSL_DSL_EXPRESSION
|
|
|
|
|
|
|
|
#include "include/core/SkTypes.h"
|
|
|
|
#include "src/sksl/ir/SkSLIRNode.h"
|
|
|
|
|
|
|
|
#include <cstdint>
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
namespace SkSL {
|
|
|
|
|
|
|
|
class Expression;
|
|
|
|
|
|
|
|
namespace dsl {
|
|
|
|
|
2021-02-09 20:22:57 +00:00
|
|
|
class DSLStatement;
|
2021-01-11 20:42:44 +00:00
|
|
|
class DSLVar;
|
2021-01-07 15:57:27 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents an expression such as 'cos(x)' or 'a + b'.
|
|
|
|
*/
|
|
|
|
class DSLExpression {
|
|
|
|
public:
|
|
|
|
DSLExpression(const DSLExpression&) = delete;
|
|
|
|
|
|
|
|
DSLExpression(DSLExpression&&) = default;
|
|
|
|
|
|
|
|
DSLExpression();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates an expression representing a literal float.
|
|
|
|
*/
|
|
|
|
DSLExpression(float value);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates an expression representing a literal float.
|
|
|
|
*/
|
|
|
|
DSLExpression(double value)
|
|
|
|
: DSLExpression((float) value) {}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates an expression representing a literal int.
|
|
|
|
*/
|
|
|
|
DSLExpression(int value);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates an expression representing a literal bool.
|
|
|
|
*/
|
|
|
|
DSLExpression(bool value);
|
|
|
|
|
2021-01-11 20:42:44 +00:00
|
|
|
/**
|
|
|
|
* Creates an expression representing a variable reference.
|
|
|
|
*/
|
|
|
|
DSLExpression(const DSLVar& var);
|
|
|
|
|
2021-01-07 15:57:27 +00:00
|
|
|
~DSLExpression();
|
|
|
|
|
2021-01-13 15:38:59 +00:00
|
|
|
/**
|
|
|
|
* Overloads the '=' operator to create an SkSL assignment statement.
|
|
|
|
*/
|
2021-02-25 13:17:43 +00:00
|
|
|
DSLExpression operator=(DSLExpression other);
|
2021-01-13 15:38:59 +00:00
|
|
|
|
2021-02-25 13:17:43 +00:00
|
|
|
DSLExpression x();
|
2021-01-26 19:31:29 +00:00
|
|
|
|
2021-02-25 13:17:43 +00:00
|
|
|
DSLExpression y();
|
2021-01-26 19:31:29 +00:00
|
|
|
|
2021-02-25 13:17:43 +00:00
|
|
|
DSLExpression z();
|
2021-01-26 19:31:29 +00:00
|
|
|
|
2021-02-25 13:17:43 +00:00
|
|
|
DSLExpression w();
|
2021-01-26 19:31:29 +00:00
|
|
|
|
2021-02-25 13:17:43 +00:00
|
|
|
DSLExpression r();
|
2021-01-26 19:31:29 +00:00
|
|
|
|
2021-02-25 13:17:43 +00:00
|
|
|
DSLExpression g();
|
2021-01-26 19:31:29 +00:00
|
|
|
|
2021-02-25 13:17:43 +00:00
|
|
|
DSLExpression b();
|
2021-01-26 19:31:29 +00:00
|
|
|
|
2021-02-25 13:17:43 +00:00
|
|
|
DSLExpression a();
|
2021-01-26 19:31:29 +00:00
|
|
|
|
2021-02-11 20:18:31 +00:00
|
|
|
/**
|
|
|
|
* Creates an SkSL struct field access expression.
|
|
|
|
*/
|
2021-02-25 13:17:43 +00:00
|
|
|
DSLExpression field(const char* name);
|
2021-02-11 20:18:31 +00:00
|
|
|
|
2021-01-26 15:07:01 +00:00
|
|
|
/**
|
|
|
|
* Creates an SkSL array index expression.
|
|
|
|
*/
|
2021-02-25 13:17:43 +00:00
|
|
|
DSLExpression operator[](DSLExpression index);
|
2021-01-26 15:07:01 +00:00
|
|
|
|
2021-01-07 15:57:27 +00:00
|
|
|
/**
|
|
|
|
* Invalidates this object and returns the SkSL expression it represents.
|
|
|
|
*/
|
|
|
|
std::unique_ptr<SkSL::Expression> release();
|
|
|
|
|
|
|
|
private:
|
|
|
|
DSLExpression(std::unique_ptr<SkSL::Expression> expression);
|
|
|
|
|
2021-01-13 15:38:59 +00:00
|
|
|
/**
|
|
|
|
* Invalidates this object and returns the SkSL expression it represents coerced to the
|
|
|
|
* specified type. If the expression cannot be coerced, reports an error and returns null.
|
|
|
|
*/
|
|
|
|
std::unique_ptr<SkSL::Expression> coerceAndRelease(const SkSL::Type& type);
|
|
|
|
|
2021-01-07 15:57:27 +00:00
|
|
|
std::unique_ptr<SkSL::Expression> fExpression;
|
|
|
|
|
2021-02-16 18:02:57 +00:00
|
|
|
friend DSLExpression SampleChild(int index, DSLExpression coords);
|
|
|
|
|
2021-02-25 13:17:43 +00:00
|
|
|
template<class... Cases>
|
|
|
|
friend DSLStatement Switch(DSLExpression value, Cases... cases);
|
|
|
|
|
2021-01-22 20:18:25 +00:00
|
|
|
friend class DSLCore;
|
2021-02-23 17:05:49 +00:00
|
|
|
friend class DSLFunction;
|
2021-01-13 15:38:59 +00:00
|
|
|
friend class DSLVar;
|
2021-01-07 15:57:27 +00:00
|
|
|
friend class DSLWriter;
|
|
|
|
};
|
|
|
|
|
2021-02-25 13:17:43 +00:00
|
|
|
DSLExpression operator+(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator+=(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator-(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator-=(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator*(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator*=(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator/(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator/=(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator%(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator%=(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator<<(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator<<=(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator>>(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator>>=(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator&&(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator||(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator&(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator&=(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator|(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator|=(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator^(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator^=(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator,(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator==(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator!=(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator>(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator<(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator>=(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator<=(DSLExpression left, DSLExpression right);
|
|
|
|
DSLExpression operator!(DSLExpression expr);
|
|
|
|
DSLExpression operator~(DSLExpression expr);
|
|
|
|
DSLExpression operator++(DSLExpression expr);
|
|
|
|
DSLExpression operator++(DSLExpression expr, int);
|
|
|
|
DSLExpression operator--(DSLExpression expr);
|
|
|
|
DSLExpression operator--(DSLExpression expr, int);
|
2021-01-13 15:38:59 +00:00
|
|
|
|
2021-01-07 15:57:27 +00:00
|
|
|
} // namespace dsl
|
|
|
|
|
|
|
|
} // namespace SkSL
|
|
|
|
|
|
|
|
#endif
|