165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/*
265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2011 The Android Open Source Project
365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License");
565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License.
665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at
765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *      http://www.apache.org/licenses/LICENSE-2.0
965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software
1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS,
1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and
1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License.
1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */
1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#ifndef ANDROID_FILTERFW_FILTERPACKS_BASE_VEC_TYPES_H
1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define ANDROID_FILTERFW_FILTERPACKS_BASE_VEC_TYPES_H
1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennnamespace android {
2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennnamespace filterfw {
2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate < class T, int dim>
2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass VecBase {
2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public:
2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  T data[dim];
2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  VecBase() {}
2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  VecBase<T,dim>& operator = (const VecBase<T, dim> &x) {
2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    memcpy(data, x.data, sizeof(T)*dim);
3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return *this;
3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  T & operator [] (int i) {
3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // out of boundary not checked
3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return data[i];
3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  const T & operator [] (int i) const {
3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // out of boundary not checked
3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return data[i];
3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  T Length() {
4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    double sum = 0;
4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    for (int i = 0; i < dim; ++i)
4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      sum += static_cast<double> (data[i] * data[i]);
4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return static_cast<T>(sqrt(sum));
4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn};
4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate < class T, int dim>
4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass Vec : public VecBase<T,dim> {
5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public:
5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec() {}
5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec<T,dim>& operator = (const Vec<T, dim> &x) {
5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    memcpy(this->data, x.data, sizeof(T)*dim);
5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return *this;
5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn};
5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate <class T, int dim>
5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennVec<T, dim> operator + (const Vec<T,dim> &x, const Vec<T,dim> &y) {
6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec<T, dim> out;
6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  for (int i = 0; i < dim; i++)
6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    out.data[i] = x.data[i] + y.data[i];
6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return out;
6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate <class T, int dim>
6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennVec<T, dim> operator - (const Vec<T,dim> &x, const Vec<T,dim> &y) {
6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec<T, dim> out;
6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  for (int i = 0; i < dim; i++)
7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    out.data[i] = x.data[i] - y.data[i];
7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return out;
7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate <class T, int dim>
7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennVec<T, dim> operator * (const Vec<T,dim> &x, const Vec<T,dim> &y) {
7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec<T, dim> out;
7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  for (int i = 0; i < dim; i++)
7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    out.data[i] = x.data[i] * y.data[i];
7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return out;
8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate <class T, int dim>
8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennVec<T, dim> operator / (const Vec<T,dim> &x, const Vec<T,dim> &y) {
8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec<T, dim> out;
8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  for (int i = 0; i < dim; i++)
8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    out.data[i] = x.data[i] / y.data[i];
8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return out;
8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate <class T, int dim>
9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennT dot(const Vec<T,dim> &x, const Vec<T,dim> &y) {
9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  T out = 0;
9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  for (int i = 0; i < dim; i++)
9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    out += x.data[i] * y.data[i];
9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return out;
9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate <class T, int dim>
9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennVec<T, dim> operator * (const Vec<T,dim> &x, T scale) {
10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec<T, dim> out;
10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  for (int i = 0; i < dim; i++)
10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    out.data[i] = x.data[i] * scale;
10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return out;
10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate <class T, int dim>
10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennVec<T, dim> operator / (const Vec<T,dim> &x, T scale) {
10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec<T, dim> out;
10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  for (int i = 0; i < dim; i++)
11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    out.data[i] = x.data[i] / scale;
11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return out;
11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate <class T, int dim>
11565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius RennVec<T, dim> operator + (const Vec<T,dim> &x, T val) {
11665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec<T, dim> out;
11765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  for (int i = 0; i < dim; i++)
11865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    out.data[i] = x.data[i] + val;
11965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return out;
12065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
12165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
12265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn// specialization for vec2, vec3, vec4 float
12365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate<>
12465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass Vec<float, 2> : public VecBase<float, 2> {
12565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpublic:
12665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec() {}
12765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec(float x, float y) {
12865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    data[0] = x;
12965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    data[1] = y;
13065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
13165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec<float, 2>& operator = (const Vec<float, 2> &x) {
13265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    memcpy(data, x.data, sizeof(float)*2);
13365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return *this;
13465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
13565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn};
13665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate<>
13865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass Vec<float, 3> {
13965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpublic:
14065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  float data[3];
14165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec() {}
14265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec(float x, float y, float z) {
14365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    data[0] = x;
14465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    data[1] = y;
14565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    data[2] = z;
14665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
14765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec<float, 3>& operator = (const Vec<float, 3> &x) {
14865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    memcpy(data, x.data, sizeof(float)*3);
14965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return *this;
15065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
15165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn};
15265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
15365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntemplate<>
15465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass Vec<float, 4> {
15565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpublic:
15665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  float data[4];
15765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec() {}
15865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec(float x, float y, float z, float w) {
15965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    data[0] = x;
16065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    data[1] = y;
16165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    data[2] = z;
16265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    data[3] = w;
16365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
16465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  Vec<float, 4>& operator = (const Vec<float, 4> &x) {
16565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    memcpy(data, x.data, sizeof(float)*4);
16665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return *this;
16765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
16865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn};
16965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
17065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntypedef Vec<float,2> Vec2f;
17165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntypedef Vec<float,3> Vec3f;
17265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renntypedef Vec<float,4> Vec4f;
17365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
17465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} // namespace filterfw
17565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} // namespace android
17665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
17765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#endif // ANDROID_FILTERFW_FILTERPACKS_BASE_VEC_TYPES_H
178