1/* 2 * Copyright 2013 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 GrGLSL_impl_DEFINED 9#define GrGLSL_impl_DEFINED 10 11template<typename Self> 12template<typename T> 13inline Self GrGLSLExpr<Self>::VectorCastImpl(const T& expr) { 14 if (expr.isZeros()) { 15 return Self(0); 16 } 17 if (expr.isOnes()) { 18 return Self(1); 19 } 20 return Self(Self::CastStr(), expr.c_str()); 21} 22 23template<typename Self> 24template<typename T0, typename T1> 25inline Self GrGLSLExpr<Self>::Mul(T0 in0, T1 in1) { 26 if (in0.isZeros() || in1.isZeros()) { 27 return Self(0); 28 } 29 if (in0.isOnes()) { 30 return Self::VectorCast(in1); 31 } 32 if (in1.isOnes()) { 33 return Self::VectorCast(in0); 34 } 35 return Self("(%s * %s)", in0.c_str(), in1.c_str()); 36} 37 38template<typename Self> 39template<typename T0, typename T1> 40inline Self GrGLSLExpr<Self>::Add(T0 in0, T1 in1) { 41 if (in1.isZeros()) { 42 return Self::VectorCast(in0); 43 } 44 if (in0.isZeros()) { 45 return Self::VectorCast(in1); 46 } 47 if (in0.isOnes() && in1.isOnes()) { 48 return Self(2); 49 } 50 return Self("(%s + %s)", in0.c_str(), in1.c_str()); 51} 52 53template<typename Self> 54template<typename T0, typename T1> 55inline Self GrGLSLExpr<Self>::Sub(T0 in0, T1 in1) { 56 if (in1.isZeros()) { 57 return Self::VectorCast(in0); 58 } 59 if (in1.isOnes()) { 60 if (in0.isOnes()) { 61 return Self(0); 62 } 63 } 64 65 return Self("(%s - %s)", in0.c_str(), in1.c_str()); 66} 67 68template <typename Self> 69template <typename T> 70T GrGLSLExpr<Self>::extractComponents(const char format[]) const { 71 if (this->isZeros()) { 72 return T(0); 73 } 74 if (this->isOnes()) { 75 return T(1); 76 } 77 return T(format, this->c_str()); 78} 79 80inline GrGLSLExpr1 GrGLSLExpr1::VectorCast(const GrGLSLExpr1& expr) { 81 return expr; 82} 83 84inline const char* GrGLSLExpr1::ZerosStr() { 85 return "0"; 86} 87 88inline const char* GrGLSLExpr1::OnesStr() { 89 return "1.0"; 90} 91 92// GrGLSLExpr1::CastStr() is unimplemented because using them is likely an 93// error. This is now caught compile-time. 94 95inline const char* GrGLSLExpr1::CastIntStr() { 96 return "%d"; 97} 98 99inline GrGLSLExpr1 operator*(const GrGLSLExpr1& in0, const GrGLSLExpr1& in1) { 100 return GrGLSLExpr1::Mul(in0, in1); 101} 102 103inline GrGLSLExpr1 operator+(const GrGLSLExpr1& in0, const GrGLSLExpr1& in1) { 104 return GrGLSLExpr1::Add(in0, in1); 105} 106 107inline GrGLSLExpr1 operator-(const GrGLSLExpr1& in0, const GrGLSLExpr1& in1) { 108 return GrGLSLExpr1::Sub(in0, in1); 109} 110 111inline const char* GrGLSLExpr4::ZerosStr() { 112 return "vec4(0)"; 113} 114 115inline const char* GrGLSLExpr4::OnesStr() { 116 return "vec4(1)"; 117} 118 119inline const char* GrGLSLExpr4::CastStr() { 120 return "vec4(%s)"; 121} 122 123inline const char* GrGLSLExpr4::CastIntStr() { 124 return "vec4(%d)"; 125} 126 127inline GrGLSLExpr4 GrGLSLExpr4::VectorCast(const GrGLSLExpr1& expr) { 128 return INHERITED::VectorCastImpl(expr); 129} 130 131inline GrGLSLExpr4 GrGLSLExpr4::VectorCast(const GrGLSLExpr4& expr) { 132 return expr; 133} 134 135inline GrGLSLExpr4::AExpr GrGLSLExpr4::a() const { 136 return this->extractComponents<GrGLSLExpr4::AExpr>("%s.a"); 137} 138 139inline GrGLSLExpr4 operator*(const GrGLSLExpr1& in0, const GrGLSLExpr4& in1) { 140 return GrGLSLExpr4::Mul(in0, in1); 141} 142 143inline GrGLSLExpr4 operator+(const GrGLSLExpr1& in0, const GrGLSLExpr4& in1) { 144 return GrGLSLExpr4::Add(in0, in1); 145} 146 147inline GrGLSLExpr4 operator-(const GrGLSLExpr1& in0, const GrGLSLExpr4& in1) { 148 return GrGLSLExpr4::Sub(in0, in1); 149} 150 151inline GrGLSLExpr4 operator*(const GrGLSLExpr4& in0, const GrGLSLExpr1& in1) { 152 return GrGLSLExpr4::Mul(in0, in1); 153} 154 155inline GrGLSLExpr4 operator+(const GrGLSLExpr4& in0, const GrGLSLExpr1& in1) { 156 return GrGLSLExpr4::Add(in0, in1); 157} 158 159inline GrGLSLExpr4 operator-(const GrGLSLExpr4& in0, const GrGLSLExpr1& in1) { 160 return GrGLSLExpr4::Sub(in0, in1); 161} 162 163inline GrGLSLExpr4 operator*(const GrGLSLExpr4& in0, const GrGLSLExpr4& in1) { 164 return GrGLSLExpr4::Mul(in0, in1); 165} 166 167inline GrGLSLExpr4 operator+(const GrGLSLExpr4& in0, const GrGLSLExpr4& in1) { 168 return GrGLSLExpr4::Add(in0, in1); 169} 170 171inline GrGLSLExpr4 operator-(const GrGLSLExpr4& in0, const GrGLSLExpr4& in1) { 172 return GrGLSLExpr4::Sub(in0, in1); 173} 174 175#endif 176