| Index: src/gpu/gl/GrGLSL_impl.h
|
| diff --git a/src/gpu/gl/GrGLSL_impl.h b/src/gpu/gl/GrGLSL_impl.h
|
| index 008d512f9c36502646e43b9c0d444f9ff7ef734c..bdd69cc76b37fc47d9747a1427d5043162ba36cf 100644
|
| --- a/src/gpu/gl/GrGLSL_impl.h
|
| +++ b/src/gpu/gl/GrGLSL_impl.h
|
| @@ -8,133 +8,168 @@
|
| #ifndef GrGLSL_impl_DEFINED
|
| #define GrGLSL_impl_DEFINED
|
|
|
| -template<>
|
| -inline const char* GrGLSLExpr<4>::ZerosStr() {
|
| - return "vec4(0)";
|
| +template<typename Self>
|
| +template<typename T>
|
| +inline Self GrGLSLExpr<Self>::VectorCastImpl(const T& expr) {
|
| + if (expr.isZeros()) {
|
| + return Self(0);
|
| + }
|
| + if (expr.isOnes()) {
|
| + return Self(1);
|
| + }
|
| + return Self(Self::CastStr(), expr.c_str());
|
| }
|
|
|
| -template<>
|
| -inline const char* GrGLSLExpr<4>::OnesStr() {
|
| - return "vec4(1)";
|
| +template<typename Self>
|
| +template<typename T0, typename T1>
|
| +inline Self GrGLSLExpr<Self>::Mul(T0 in0, T1 in1) {
|
| + if (in0.isZeros() || in1.isZeros()) {
|
| + return Self(0);
|
| + }
|
| + if (in0.isOnes()) {
|
| + return Self::VectorCast(in1);
|
| + }
|
| + if (in1.isOnes()) {
|
| + return Self::VectorCast(in0);
|
| + }
|
| + return Self("(%s * %s)", in0.c_str(), in1.c_str());
|
| }
|
|
|
| -template<>
|
| -inline const char* GrGLSLExpr<4>::ExtractAlphaStr() {
|
| - return "%s.a";
|
| +template<typename Self>
|
| +template<typename T0, typename T1>
|
| +inline Self GrGLSLExpr<Self>::Add(T0 in0, T1 in1) {
|
| + if (in1.isZeros()) {
|
| + return Self::VectorCast(in0);
|
| + }
|
| + if (in0.isZeros()) {
|
| + return Self::VectorCast(in1);
|
| + }
|
| + if (in0.isOnes() && in1.isOnes()) {
|
| + return Self(2);
|
| + }
|
| + return Self("(%s + %s)", in0.c_str(), in1.c_str());
|
| }
|
|
|
| -template<>
|
| -inline const char* GrGLSLExpr<4>::CastStr() {
|
| - return "vec4(%s)";
|
| +template<typename Self>
|
| +template<typename T0, typename T1>
|
| +inline Self GrGLSLExpr<Self>::Sub(T0 in0, T1 in1) {
|
| + if (in1.isZeros()) {
|
| + return Self::VectorCast(in0);
|
| + }
|
| + if (in1.isOnes()) {
|
| + if (in0.isOnes()) {
|
| + return Self(0);
|
| + }
|
| + }
|
| +
|
| + return Self("(%s - %s)", in0.c_str(), in1.c_str());
|
| }
|
| -template<>
|
| -inline const char* GrGLSLExpr<4>::CastIntStr() {
|
| - return "vec4(%d)";
|
| +
|
| +template <typename Self>
|
| +template <typename T>
|
| +T GrGLSLExpr<Self>::extractComponents(const char format[]) const {
|
| + if (this->isZeros()) {
|
| + return T(0);
|
| + }
|
| + if (this->isOnes()) {
|
| + return T(1);
|
| + }
|
| + return T(format, this->c_str());
|
| +}
|
| +
|
| +inline GrGLSLExpr1 GrGLSLExpr1::VectorCast(const GrGLSLExpr1& expr) {
|
| + return expr;
|
| }
|
|
|
| -template<>
|
| -inline const char* GrGLSLExpr<1>::ZerosStr() {
|
| +inline const char* GrGLSLExpr1::ZerosStr() {
|
| return "0";
|
| }
|
|
|
| -template<>
|
| -inline const char* GrGLSLExpr<1>::OnesStr() {
|
| - return "1";
|
| +inline const char* GrGLSLExpr1::OnesStr() {
|
| + return "1.0";
|
| }
|
|
|
| -// GrGLSLExpr<1>::ExtractAlphaStr() and GrGLSLExpr<1>::CastStr() are
|
| -// unimplemented because using them is likely an error. This is now caught
|
| -// compile-time.
|
| +// GrGLSLExpr1::CastStr() is unimplemented because using them is likely an
|
| +// error. This is now caught compile-time.
|
|
|
| -template<>
|
| -inline const char* GrGLSLExpr<1>::CastIntStr() {
|
| +inline const char* GrGLSLExpr1::CastIntStr() {
|
| return "%d";
|
| }
|
|
|
| -template<>
|
| -template<>
|
| -inline GrGLSLExpr<4> GrGLSLExpr<4>::VectorCast(const GrGLSLExpr<4>& expr) {
|
| - return expr;
|
| +inline GrGLSLExpr1 operator*(const GrGLSLExpr1& in0, const GrGLSLExpr1& in1) {
|
| + return GrGLSLExpr1::Mul(in0, in1);
|
| +}
|
| +
|
| +inline GrGLSLExpr1 operator+(const GrGLSLExpr1& in0, const GrGLSLExpr1& in1) {
|
| + return GrGLSLExpr1::Add(in0, in1);
|
| +}
|
| +
|
| +inline GrGLSLExpr1 operator-(const GrGLSLExpr1& in0, const GrGLSLExpr1& in1) {
|
| + return GrGLSLExpr1::Sub(in0, in1);
|
| }
|
|
|
| -template<>
|
| -template<>
|
| -inline GrGLSLExpr<1> GrGLSLExpr<1>::VectorCast(const GrGLSLExpr<1>& expr) {
|
| +inline const char* GrGLSLExpr4::ZerosStr() {
|
| + return "vec4(0)";
|
| +}
|
| +
|
| +inline const char* GrGLSLExpr4::OnesStr() {
|
| + return "vec4(1)";
|
| +}
|
| +
|
| +inline const char* GrGLSLExpr4::CastStr() {
|
| + return "vec4(%s)";
|
| +}
|
| +
|
| +inline const char* GrGLSLExpr4::CastIntStr() {
|
| + return "vec4(%d)";
|
| +}
|
| +
|
| +inline GrGLSLExpr4 GrGLSLExpr4::VectorCast(const GrGLSLExpr1& expr) {
|
| + return INHERITED::VectorCastImpl(expr);
|
| +}
|
| +
|
| +inline GrGLSLExpr4 GrGLSLExpr4::VectorCast(const GrGLSLExpr4& expr) {
|
| return expr;
|
| }
|
|
|
| -template<int N>
|
| -template<int M>
|
| -inline GrGLSLExpr<N> GrGLSLExpr<N>::VectorCast(const GrGLSLExpr<M>& expr) {
|
| - if (expr.isZeros()) {
|
| - return GrGLSLExpr<N>(0);
|
| - }
|
| - if (expr.isOnes()) {
|
| - return GrGLSLExpr<N>(1);
|
| - }
|
| - return GrGLSLExpr<N>(GrGLSLExpr<N>::CastStr(), expr.c_str());
|
| +inline GrGLSLExpr4::AExpr GrGLSLExpr4::a() const {
|
| + return this->extractComponents<GrGLSLExpr4::AExpr>("%s.a");
|
| }
|
|
|
| -template<int N>
|
| -template<int M>
|
| -inline GrGLSLExpr<N> GrGLSLExpr<N>::Mul(const GrGLSLExpr<N>& in0, const GrGLSLExpr<M>& in1) {
|
| - SK_COMPILE_ASSERT(N == M || M == 1, binary_op_dimensions_incompatible);
|
| - if (in0.isZeros() || in1.isZeros()) {
|
| - return GrGLSLExpr<N>(0);
|
| - }
|
| - if (in0.isOnes()) {
|
| - return VectorCast<M>(in1);
|
| - }
|
| - if (in1.isOnes()) {
|
| - return in0;
|
| - }
|
| - return GrGLSLExpr<N>("(%s * %s)", in0.c_str(), in1.c_str());
|
| +inline GrGLSLExpr4 operator*(const GrGLSLExpr1& in0, const GrGLSLExpr4& in1) {
|
| + return GrGLSLExpr4::Mul(in0, in1);
|
| }
|
|
|
| -template<int N>
|
| -template<int M>
|
| -inline GrGLSLExpr<N> GrGLSLExpr<N>::Add(const GrGLSLExpr<N>& in0, const GrGLSLExpr<M>& in1) {
|
| - SK_COMPILE_ASSERT(N == M || M == 1, binary_op_dimensions_incompatible);
|
| - if (in1.isZeros()) {
|
| - return in0;
|
| - }
|
| - if (in0.isZeros()) {
|
| - return VectorCast<M>(in1);
|
| - }
|
| - if (in0.isOnes() && in1.isOnes()) {
|
| - return GrGLSLExpr<N>(2);
|
| - }
|
| - return GrGLSLExpr<N>("(%s + %s)", in0.c_str(), in1.c_str());
|
| +inline GrGLSLExpr4 operator+(const GrGLSLExpr1& in0, const GrGLSLExpr4& in1) {
|
| + return GrGLSLExpr4::Add(in0, in1);
|
| }
|
|
|
| -template<int N>
|
| -template<int M>
|
| -inline GrGLSLExpr<N> GrGLSLExpr<N>::Sub(const GrGLSLExpr<N>& in0, const GrGLSLExpr<M>& in1) {
|
| - SK_COMPILE_ASSERT(N == M || M == 1, binary_op_dimensions_incompatible);
|
| - if (in1.isZeros()) {
|
| - return in0;
|
| - }
|
| - if (in1.isOnes()) {
|
| - if (in0.isOnes()) {
|
| - return GrGLSLExpr<N>(0);
|
| - }
|
| - }
|
| +inline GrGLSLExpr4 operator-(const GrGLSLExpr1& in0, const GrGLSLExpr4& in1) {
|
| + return GrGLSLExpr4::Sub(in0, in1);
|
| +}
|
|
|
| - return GrGLSLExpr<N>("(%s - %s)", in0.c_str(), in1.c_str());
|
| +inline GrGLSLExpr4 operator*(const GrGLSLExpr4& in0, const GrGLSLExpr1& in1) {
|
| + return GrGLSLExpr4::Mul(in0, in1);
|
| }
|
|
|
| -inline GrGLSLExpr<4> GrGLSLExprCast4(const GrGLSLExpr<1>& expr) {
|
| - return GrGLSLExpr<4>::VectorCast(expr);
|
| +inline GrGLSLExpr4 operator+(const GrGLSLExpr4& in0, const GrGLSLExpr1& in1) {
|
| + return GrGLSLExpr4::Add(in0, in1);
|
| }
|
|
|
| -inline GrGLSLExpr<1> GrGLSLExprExtractAlpha(const GrGLSLExpr<4>& expr) {
|
| - if (expr.isZeros()) {
|
| - return GrGLSLExpr<1>(0);
|
| - }
|
| - if (expr.isOnes()) {
|
| - return GrGLSLExpr<1>(1);
|
| - }
|
| - return GrGLSLExpr<1>(GrGLSLExpr<4>::ExtractAlphaStr(), expr.c_str());
|
| +inline GrGLSLExpr4 operator-(const GrGLSLExpr4& in0, const GrGLSLExpr1& in1) {
|
| + return GrGLSLExpr4::Sub(in0, in1);
|
| +}
|
| +
|
| +inline GrGLSLExpr4 operator*(const GrGLSLExpr4& in0, const GrGLSLExpr4& in1) {
|
| + return GrGLSLExpr4::Mul(in0, in1);
|
| +}
|
| +
|
| +inline GrGLSLExpr4 operator+(const GrGLSLExpr4& in0, const GrGLSLExpr4& in1) {
|
| + return GrGLSLExpr4::Add(in0, in1);
|
| +}
|
| +
|
| +inline GrGLSLExpr4 operator-(const GrGLSLExpr4& in0, const GrGLSLExpr4& in1) {
|
| + return GrGLSLExpr4::Sub(in0, in1);
|
| }
|
|
|
| #endif
|
|
|