1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_FILTERFW_FILTERPACKS_BASE_VEC_TYPES_H 18 #define ANDROID_FILTERFW_FILTERPACKS_BASE_VEC_TYPES_H 19 20 namespace android { 21 namespace filterfw { 22 23 template < class T, int dim> 24 class VecBase { 25 public: 26 T data[dim]; 27 VecBase() {} 28 VecBase<T,dim>& operator = (const VecBase<T, dim> &x) { 29 memcpy(data, x.data, sizeof(T)*dim); 30 return *this; 31 } 32 T & operator [] (int i) { 33 // out of boundary not checked 34 return data[i]; 35 } 36 const T & operator [] (int i) const { 37 // out of boundary not checked 38 return data[i]; 39 } 40 T Length() { 41 double sum = 0; 42 for (int i = 0; i < dim; ++i) 43 sum += static_cast<double> (data[i] * data[i]); 44 return static_cast<T>(sqrt(sum)); 45 } 46 }; 47 48 template < class T, int dim> 49 class Vec : public VecBase<T,dim> { 50 public: 51 Vec() {} 52 Vec<T,dim>& operator = (const Vec<T, dim> &x) { 53 memcpy(this->data, x.data, sizeof(T)*dim); 54 return *this; 55 } 56 }; 57 58 template <class T, int dim> 59 Vec<T, dim> operator + (const Vec<T,dim> &x, const Vec<T,dim> &y) { 60 Vec<T, dim> out; 61 for (int i = 0; i < dim; i++) 62 out.data[i] = x.data[i] + y.data[i]; 63 return out; 64 } 65 66 template <class T, int dim> 67 Vec<T, dim> operator - (const Vec<T,dim> &x, const Vec<T,dim> &y) { 68 Vec<T, dim> out; 69 for (int i = 0; i < dim; i++) 70 out.data[i] = x.data[i] - y.data[i]; 71 return out; 72 } 73 74 template <class T, int dim> 75 Vec<T, dim> operator * (const Vec<T,dim> &x, const Vec<T,dim> &y) { 76 Vec<T, dim> out; 77 for (int i = 0; i < dim; i++) 78 out.data[i] = x.data[i] * y.data[i]; 79 return out; 80 } 81 82 template <class T, int dim> 83 Vec<T, dim> operator / (const Vec<T,dim> &x, const Vec<T,dim> &y) { 84 Vec<T, dim> out; 85 for (int i = 0; i < dim; i++) 86 out.data[i] = x.data[i] / y.data[i]; 87 return out; 88 } 89 90 template <class T, int dim> 91 T dot(const Vec<T,dim> &x, const Vec<T,dim> &y) { 92 T out = 0; 93 for (int i = 0; i < dim; i++) 94 out += x.data[i] * y.data[i]; 95 return out; 96 } 97 98 template <class T, int dim> 99 Vec<T, dim> operator * (const Vec<T,dim> &x, T scale) { 100 Vec<T, dim> out; 101 for (int i = 0; i < dim; i++) 102 out.data[i] = x.data[i] * scale; 103 return out; 104 } 105 106 template <class T, int dim> 107 Vec<T, dim> operator / (const Vec<T,dim> &x, T scale) { 108 Vec<T, dim> out; 109 for (int i = 0; i < dim; i++) 110 out.data[i] = x.data[i] / scale; 111 return out; 112 } 113 114 template <class T, int dim> 115 Vec<T, dim> operator + (const Vec<T,dim> &x, T val) { 116 Vec<T, dim> out; 117 for (int i = 0; i < dim; i++) 118 out.data[i] = x.data[i] + val; 119 return out; 120 } 121 122 // specialization for vec2, vec3, vec4 float 123 template<> 124 class Vec<float, 2> : public VecBase<float, 2> { 125 public: 126 Vec() {} 127 Vec(float x, float y) { 128 data[0] = x; 129 data[1] = y; 130 } 131 Vec<float, 2>& operator = (const Vec<float, 2> &x) { 132 memcpy(data, x.data, sizeof(float)*2); 133 return *this; 134 } 135 }; 136 137 template<> 138 class Vec<float, 3> { 139 public: 140 float data[3]; 141 Vec() {} 142 Vec(float x, float y, float z) { 143 data[0] = x; 144 data[1] = y; 145 data[2] = z; 146 } 147 Vec<float, 3>& operator = (const Vec<float, 3> &x) { 148 memcpy(data, x.data, sizeof(float)*3); 149 return *this; 150 } 151 }; 152 153 template<> 154 class Vec<float, 4> { 155 public: 156 float data[4]; 157 Vec() {} 158 Vec(float x, float y, float z, float w) { 159 data[0] = x; 160 data[1] = y; 161 data[2] = z; 162 data[3] = w; 163 } 164 Vec<float, 4>& operator = (const Vec<float, 4> &x) { 165 memcpy(data, x.data, sizeof(float)*4); 166 return *this; 167 } 168 }; 169 170 typedef Vec<float,2> Vec2f; 171 typedef Vec<float,3> Vec3f; 172 typedef Vec<float,4> Vec4f; 173 174 } // namespace filterfw 175 } // namespace android 176 177 #endif // ANDROID_FILTERFW_FILTERPACKS_BASE_VEC_TYPES_H 178