summaryrefslogtreecommitdiff
path: root/src/ipa/libipa
diff options
context:
space:
mode:
Diffstat (limited to 'src/ipa/libipa')
-rw-r--r--src/ipa/libipa/colours.h2
-rw-r--r--src/ipa/libipa/meson.build2
-rw-r--r--src/ipa/libipa/pwl.h2
-rw-r--r--src/ipa/libipa/vector.cpp351
-rw-r--r--src/ipa/libipa/vector.h370
5 files changed, 2 insertions, 725 deletions
diff --git a/src/ipa/libipa/colours.h b/src/ipa/libipa/colours.h
index fa6a8b57..d39b2ca8 100644
--- a/src/ipa/libipa/colours.h
+++ b/src/ipa/libipa/colours.h
@@ -9,7 +9,7 @@
#include <stdint.h>
-#include "vector.h"
+#include "libcamera/internal/vector.h"
namespace libcamera {
diff --git a/src/ipa/libipa/meson.build b/src/ipa/libipa/meson.build
index f2b2f4be..12d8d15b 100644
--- a/src/ipa/libipa/meson.build
+++ b/src/ipa/libipa/meson.build
@@ -14,7 +14,6 @@ libipa_headers = files([
'lux.h',
'module.h',
'pwl.h',
- 'vector.h',
])
libipa_sources = files([
@@ -31,7 +30,6 @@ libipa_sources = files([
'lux.cpp',
'module.cpp',
'pwl.cpp',
- 'vector.cpp',
])
libipa_includes = include_directories('..')
diff --git a/src/ipa/libipa/pwl.h b/src/ipa/libipa/pwl.h
index d4ec9f4f..8fdc7053 100644
--- a/src/ipa/libipa/pwl.h
+++ b/src/ipa/libipa/pwl.h
@@ -12,7 +12,7 @@
#include <utility>
#include <vector>
-#include "vector.h"
+#include "libcamera/internal/vector.h"
namespace libcamera {
diff --git a/src/ipa/libipa/vector.cpp b/src/ipa/libipa/vector.cpp
deleted file mode 100644
index 8019f8cf..00000000
--- a/src/ipa/libipa/vector.cpp
+++ /dev/null
@@ -1,351 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-/*
- * Copyright (C) 2024, Paul Elder <paul.elder@ideasonboard.com>
- *
- * Vector and related operations
- */
-
-#include "vector.h"
-
-#include <libcamera/base/log.h>
-
-/**
- * \file vector.h
- * \brief Vector class
- */
-
-namespace libcamera {
-
-LOG_DEFINE_CATEGORY(Vector)
-
-namespace ipa {
-
-/**
- * \class Vector
- * \brief Vector class
- * \tparam T Type of numerical values to be stored in the vector
- * \tparam Rows Number of dimension of the vector (= number of elements)
- */
-
-/**
- * \fn Vector::Vector()
- * \brief Construct an uninitialized vector
- */
-
-/**
- * \fn Vector::Vector(T scalar)
- * \brief Construct a vector filled with a \a scalar value
- * \param[in] scalar The scalar value
- */
-
-/**
- * \fn Vector::Vector(const std::array<T, Rows> &data)
- * \brief Construct vector from supplied data
- * \param data Data from which to construct a vector
- *
- * The size of \a data must be equal to the dimension size Rows of the vector.
- */
-
-/**
- * \fn T Vector::operator[](size_t i) const
- * \brief Index to an element in the vector
- * \param i Index of element to retrieve
- * \return Element at index \a i from the vector
- */
-
-/**
- * \fn T &Vector::operator[](size_t i)
- * \copydoc Vector::operator[](size_t i) const
- */
-
-/**
- * \fn Vector::operator-() const
- * \brief Negate a Vector by negating both all of its coordinates
- * \return The negated vector
- */
-
-/**
- * \fn Vector::operator+(Vector const &other) const
- * \brief Calculate the sum of this vector and \a other element-wise
- * \param[in] other The other vector
- * \return The element-wise sum of this vector and \a other
- */
-
-/**
- * \fn Vector::operator+(T scalar) const
- * \brief Calculate the sum of this vector and \a scalar element-wise
- * \param[in] scalar The scalar
- * \return The element-wise sum of this vector and \a other
- */
-
-/**
- * \fn Vector::operator-(Vector const &other) const
- * \brief Calculate the difference of this vector and \a other element-wise
- * \param[in] other The other vector
- * \return The element-wise subtraction of \a other from this vector
- */
-
-/**
- * \fn Vector::operator-(T scalar) const
- * \brief Calculate the difference of this vector and \a scalar element-wise
- * \param[in] scalar The scalar
- * \return The element-wise subtraction of \a scalar from this vector
- */
-
-/**
- * \fn Vector::operator*(const Vector &other) const
- * \brief Calculate the product of this vector and \a other element-wise
- * \param[in] other The other vector
- * \return The element-wise product of this vector and \a other
- */
-
-/**
- * \fn Vector::operator*(T scalar) const
- * \brief Calculate the product of this vector and \a scalar element-wise
- * \param[in] scalar The scalar
- * \return The element-wise product of this vector and \a scalar
- */
-
-/**
- * \fn Vector::operator/(const Vector &other) const
- * \brief Calculate the quotient of this vector and \a other element-wise
- * \param[in] other The other vector
- * \return The element-wise division of this vector by \a other
- */
-
-/**
- * \fn Vector::operator/(T scalar) const
- * \brief Calculate the quotient of this vector and \a scalar element-wise
- * \param[in] scalar The scalar
- * \return The element-wise division of this vector by \a scalar
- */
-
-/**
- * \fn Vector::operator+=(Vector const &other)
- * \brief Add \a other element-wise to this vector
- * \param[in] other The other vector
- * \return This vector
- */
-
-/**
- * \fn Vector::operator+=(T scalar)
- * \brief Add \a scalar element-wise to this vector
- * \param[in] scalar The scalar
- * \return This vector
- */
-
-/**
- * \fn Vector::operator-=(Vector const &other)
- * \brief Subtract \a other element-wise from this vector
- * \param[in] other The other vector
- * \return This vector
- */
-
-/**
- * \fn Vector::operator-=(T scalar)
- * \brief Subtract \a scalar element-wise from this vector
- * \param[in] scalar The scalar
- * \return This vector
- */
-
-/**
- * \fn Vector::operator*=(const Vector &other)
- * \brief Multiply this vector by \a other element-wise
- * \param[in] other The other vector
- * \return This vector
- */
-
-/**
- * \fn Vector::operator*=(T scalar)
- * \brief Multiply this vector by \a scalar element-wise
- * \param[in] scalar The scalar
- * \return This vector
- */
-
-/**
- * \fn Vector::operator/=(const Vector &other)
- * \brief Divide this vector by \a other element-wise
- * \param[in] other The other vector
- * \return This vector
- */
-
-/**
- * \fn Vector::operator/=(T scalar)
- * \brief Divide this vector by \a scalar element-wise
- * \param[in] scalar The scalar
- * \return This vector
- */
-
-/**
- * \fn Vector::min(const Vector &other) const
- * \brief Calculate the minimum of this vector and \a other element-wise
- * \param[in] other The other vector
- * \return The element-wise minimum of this vector and \a other
- */
-
-/**
- * \fn Vector::min(T scalar) const
- * \brief Calculate the minimum of this vector and \a scalar element-wise
- * \param[in] scalar The scalar
- * \return The element-wise minimum of this vector and \a scalar
- */
-
-/**
- * \fn Vector::max(const Vector &other) const
- * \brief Calculate the maximum of this vector and \a other element-wise
- * \param[in] other The other vector
- * \return The element-wise maximum of this vector and \a other
- */
-
-/**
- * \fn Vector::max(T scalar) const
- * \brief Calculate the maximum of this vector and \a scalar element-wise
- * \param[in] scalar The scalar
- * \return The element-wise maximum of this vector and \a scalar
- */
-
-/**
- * \fn Vector::dot(const Vector<T, Rows> &other) const
- * \brief Compute the dot product
- * \param[in] other The other vector
- * \return The dot product of the two vectors
- */
-
-/**
- * \fn constexpr T &Vector::x()
- * \brief Convenience function to access the first element of the vector
- * \return The first element of the vector
- */
-
-/**
- * \fn constexpr T &Vector::y()
- * \brief Convenience function to access the second element of the vector
- * \return The second element of the vector
- */
-
-/**
- * \fn constexpr T &Vector::z()
- * \brief Convenience function to access the third element of the vector
- * \return The third element of the vector
- */
-
-/**
- * \fn constexpr const T &Vector::x() const
- * \copydoc Vector::x()
- */
-
-/**
- * \fn constexpr const T &Vector::y() const
- * \copydoc Vector::y()
- */
-
-/**
- * \fn constexpr const T &Vector::z() const
- * \copydoc Vector::z()
- */
-
-/**
- * \fn constexpr T &Vector::r()
- * \brief Convenience function to access the first element of the vector
- * \return The first element of the vector
- */
-
-/**
- * \fn constexpr T &Vector::g()
- * \brief Convenience function to access the second element of the vector
- * \return The second element of the vector
- */
-
-/**
- * \fn constexpr T &Vector::b()
- * \brief Convenience function to access the third element of the vector
- * \return The third element of the vector
- */
-
-/**
- * \fn constexpr const T &Vector::r() const
- * \copydoc Vector::r()
- */
-
-/**
- * \fn constexpr const T &Vector::g() const
- * \copydoc Vector::g()
- */
-
-/**
- * \fn constexpr const T &Vector::b() const
- * \copydoc Vector::b()
- */
-
-/**
- * \fn Vector::length2()
- * \brief Get the squared length of the vector
- * \return The squared length of the vector
- */
-
-/**
- * \fn Vector::length()
- * \brief Get the length of the vector
- * \return The length of the vector
- */
-
-/**
- * \fn Vector::sum() const
- * \brief Calculate the sum of all the vector elements
- * \tparam R The type of the sum
- *
- * The type R of the sum defaults to the type T of the elements, but can be set
- * explicitly to use a different type in case the type T would risk
- * overflowing.
- *
- * \return The sum of all the vector elements
- */
-
-/**
- * \fn Vector<T, Rows> operator*(const Matrix<T, Rows, Cols> &m, const Vector<T, Cols> &v)
- * \brief Multiply a matrix by a vector
- * \tparam T Numerical type of the contents of the matrix and vector
- * \tparam Rows The number of rows in the matrix
- * \tparam Cols The number of columns in the matrix (= rows in the vector)
- * \param m The matrix
- * \param v The vector
- * \return Product of matrix \a m and vector \a v
- */
-
-/**
- * \typedef RGB
- * \brief A Vector of 3 elements representing an RGB pixel value
- */
-
-/**
- * \fn bool operator==(const Vector<T, Rows> &lhs, const Vector<T, Rows> &rhs)
- * \brief Compare vectors for equality
- * \return True if the two vectors are equal, false otherwise
- */
-
-/**
- * \fn bool operator!=(const Vector<T, Rows> &lhs, const Vector<T, Rows> &rhs)
- * \brief Compare vectors for inequality
- * \return True if the two vectors are not equal, false otherwise
- */
-
-#ifndef __DOXYGEN__
-bool vectorValidateYaml(const YamlObject &obj, unsigned int size)
-{
- if (!obj.isList())
- return false;
-
- if (obj.size() != size) {
- LOG(Vector, Error)
- << "Wrong number of values in YAML vector: expected "
- << size << ", got " << obj.size();
- return false;
- }
-
- return true;
-}
-#endif /* __DOXYGEN__ */
-
-} /* namespace ipa */
-
-} /* namespace libcamera */
diff --git a/src/ipa/libipa/vector.h b/src/ipa/libipa/vector.h
deleted file mode 100644
index fe33c9d6..00000000
--- a/src/ipa/libipa/vector.h
+++ /dev/null
@@ -1,370 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-/*
- * Copyright (C) 2024, Paul Elder <paul.elder@ideasonboard.com>
- *
- * Vector and related operations
- */
-#pragma once
-
-#include <algorithm>
-#include <array>
-#include <cmath>
-#include <functional>
-#include <numeric>
-#include <optional>
-#include <ostream>
-
-#include <libcamera/base/log.h>
-#include <libcamera/base/span.h>
-
-#include "libcamera/internal/matrix.h"
-#include "libcamera/internal/yaml_parser.h"
-
-namespace libcamera {
-
-LOG_DECLARE_CATEGORY(Vector)
-
-namespace ipa {
-
-#ifndef __DOXYGEN__
-template<typename T, unsigned int Rows,
- std::enable_if_t<std::is_arithmetic_v<T>> * = nullptr>
-#else
-template<typename T, unsigned int Rows>
-#endif /* __DOXYGEN__ */
-class Vector
-{
-public:
- constexpr Vector() = default;
-
- constexpr explicit Vector(T scalar)
- {
- data_.fill(scalar);
- }
-
- constexpr Vector(const std::array<T, Rows> &data)
- {
- for (unsigned int i = 0; i < Rows; i++)
- data_[i] = data[i];
- }
-
- const T &operator[](size_t i) const
- {
- ASSERT(i < data_.size());
- return data_[i];
- }
-
- T &operator[](size_t i)
- {
- ASSERT(i < data_.size());
- return data_[i];
- }
-
- constexpr Vector<T, Rows> operator-() const
- {
- Vector<T, Rows> ret;
- for (unsigned int i = 0; i < Rows; i++)
- ret[i] = -data_[i];
- return ret;
- }
-
- constexpr Vector operator+(const Vector &other) const
- {
- return apply(*this, other, std::plus<>{});
- }
-
- constexpr Vector operator+(T scalar) const
- {
- return apply(*this, scalar, std::plus<>{});
- }
-
- constexpr Vector operator-(const Vector &other) const
- {
- return apply(*this, other, std::minus<>{});
- }
-
- constexpr Vector operator-(T scalar) const
- {
- return apply(*this, scalar, std::minus<>{});
- }
-
- constexpr Vector operator*(const Vector &other) const
- {
- return apply(*this, other, std::multiplies<>{});
- }
-
- constexpr Vector operator*(T scalar) const
- {
- return apply(*this, scalar, std::multiplies<>{});
- }
-
- constexpr Vector operator/(const Vector &other) const
- {
- return apply(*this, other, std::divides<>{});
- }
-
- constexpr Vector operator/(T scalar) const
- {
- return apply(*this, scalar, std::divides<>{});
- }
-
- Vector &operator+=(const Vector &other)
- {
- return apply(other, [](T a, T b) { return a + b; });
- }
-
- Vector &operator+=(T scalar)
- {
- return apply(scalar, [](T a, T b) { return a + b; });
- }
-
- Vector &operator-=(const Vector &other)
- {
- return apply(other, [](T a, T b) { return a - b; });
- }
-
- Vector &operator-=(T scalar)
- {
- return apply(scalar, [](T a, T b) { return a - b; });
- }
-
- Vector &operator*=(const Vector &other)
- {
- return apply(other, [](T a, T b) { return a * b; });
- }
-
- Vector &operator*=(T scalar)
- {
- return apply(scalar, [](T a, T b) { return a * b; });
- }
-
- Vector &operator/=(const Vector &other)
- {
- return apply(other, [](T a, T b) { return a / b; });
- }
-
- Vector &operator/=(T scalar)
- {
- return apply(scalar, [](T a, T b) { return a / b; });
- }
-
- constexpr Vector min(const Vector &other) const
- {
- return apply(*this, other, [](T a, T b) { return std::min(a, b); });
- }
-
- constexpr Vector min(T scalar) const
- {
- return apply(*this, scalar, [](T a, T b) { return std::min(a, b); });
- }
-
- constexpr Vector max(const Vector &other) const
- {
- return apply(*this, other, [](T a, T b) { return std::max(a, b); });
- }
-
- constexpr Vector max(T scalar) const
- {
- return apply(*this, scalar, [](T a, T b) -> T { return std::max(a, b); });
- }
-
- constexpr T dot(const Vector<T, Rows> &other) const
- {
- T ret = 0;
- for (unsigned int i = 0; i < Rows; i++)
- ret += data_[i] * other[i];
- return ret;
- }
-
-#ifndef __DOXYGEN__
- template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 1>>
-#endif /* __DOXYGEN__ */
- constexpr const T &x() const { return data_[0]; }
-#ifndef __DOXYGEN__
- template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 2>>
-#endif /* __DOXYGEN__ */
- constexpr const T &y() const { return data_[1]; }
-#ifndef __DOXYGEN__
- template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 3>>
-#endif /* __DOXYGEN__ */
- constexpr const T &z() const { return data_[2]; }
-#ifndef __DOXYGEN__
- template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 1>>
-#endif /* __DOXYGEN__ */
- constexpr T &x() { return data_[0]; }
-#ifndef __DOXYGEN__
- template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 2>>
-#endif /* __DOXYGEN__ */
- constexpr T &y() { return data_[1]; }
-#ifndef __DOXYGEN__
- template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 3>>
-#endif /* __DOXYGEN__ */
- constexpr T &z() { return data_[2]; }
-
-#ifndef __DOXYGEN__
- template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 1>>
-#endif /* __DOXYGEN__ */
- constexpr const T &r() const { return data_[0]; }
-#ifndef __DOXYGEN__
- template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 2>>
-#endif /* __DOXYGEN__ */
- constexpr const T &g() const { return data_[1]; }
-#ifndef __DOXYGEN__
- template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 3>>
-#endif /* __DOXYGEN__ */
- constexpr const T &b() const { return data_[2]; }
-#ifndef __DOXYGEN__
- template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 1>>
-#endif /* __DOXYGEN__ */
- constexpr T &r() { return data_[0]; }
-#ifndef __DOXYGEN__
- template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 2>>
-#endif /* __DOXYGEN__ */
- constexpr T &g() { return data_[1]; }
-#ifndef __DOXYGEN__
- template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 3>>
-#endif /* __DOXYGEN__ */
- constexpr T &b() { return data_[2]; }
-
- constexpr double length2() const
- {
- double ret = 0;
- for (unsigned int i = 0; i < Rows; i++)
- ret += data_[i] * data_[i];
- return ret;
- }
-
- constexpr double length() const
- {
- return std::sqrt(length2());
- }
-
- template<typename R = T>
- constexpr R sum() const
- {
- return std::accumulate(data_.begin(), data_.end(), R{});
- }
-
-private:
- template<class BinaryOp>
- static constexpr Vector apply(const Vector &lhs, const Vector &rhs, BinaryOp op)
- {
- Vector result;
- std::transform(lhs.data_.begin(), lhs.data_.end(),
- rhs.data_.begin(), result.data_.begin(),
- op);
-
- return result;
- }
-
- template<class BinaryOp>
- static constexpr Vector apply(const Vector &lhs, T rhs, BinaryOp op)
- {
- Vector result;
- std::transform(lhs.data_.begin(), lhs.data_.end(),
- result.data_.begin(),
- [&op, rhs](T v) { return op(v, rhs); });
-
- return result;
- }
-
- template<class BinaryOp>
- Vector &apply(const Vector &other, BinaryOp op)
- {
- auto itOther = other.data_.begin();
- std::for_each(data_.begin(), data_.end(),
- [&op, &itOther](T &v) { v = op(v, *itOther++); });
-
- return *this;
- }
-
- template<class BinaryOp>
- Vector &apply(T scalar, BinaryOp op)
- {
- std::for_each(data_.begin(), data_.end(),
- [&op, scalar](T &v) { v = op(v, scalar); });
-
- return *this;
- }
-
- std::array<T, Rows> data_;
-};
-
-template<typename T>
-using RGB = Vector<T, 3>;
-
-template<typename T, unsigned int Rows, unsigned int Cols>
-Vector<T, Rows> operator*(const Matrix<T, Rows, Cols> &m, const Vector<T, Cols> &v)
-{
- Vector<T, Rows> result;
-
- for (unsigned int i = 0; i < Rows; i++) {
- T sum = 0;
- for (unsigned int j = 0; j < Cols; j++)
- sum += m[i][j] * v[j];
- result[i] = sum;
- }
-
- return result;
-}
-
-template<typename T, unsigned int Rows>
-bool operator==(const Vector<T, Rows> &lhs, const Vector<T, Rows> &rhs)
-{
- for (unsigned int i = 0; i < Rows; i++) {
- if (lhs[i] != rhs[i])
- return false;
- }
-
- return true;
-}
-
-template<typename T, unsigned int Rows>
-bool operator!=(const Vector<T, Rows> &lhs, const Vector<T, Rows> &rhs)
-{
- return !(lhs == rhs);
-}
-
-#ifndef __DOXYGEN__
-bool vectorValidateYaml(const YamlObject &obj, unsigned int size);
-#endif /* __DOXYGEN__ */
-
-} /* namespace ipa */
-
-#ifndef __DOXYGEN__
-template<typename T, unsigned int Rows>
-std::ostream &operator<<(std::ostream &out, const ipa::Vector<T, Rows> &v)
-{
- out << "Vector { ";
- for (unsigned int i = 0; i < Rows; i++) {
- out << v[i];
- out << ((i + 1 < Rows) ? ", " : " ");
- }
- out << " }";
-
- return out;
-}
-
-template<typename T, unsigned int Rows>
-struct YamlObject::Getter<ipa::Vector<T, Rows>> {
- std::optional<ipa::Vector<T, Rows>> get(const YamlObject &obj) const
- {
- if (!ipa::vectorValidateYaml(obj, Rows))
- return std::nullopt;
-
- ipa::Vector<T, Rows> vector;
-
- unsigned int i = 0;
- for (const YamlObject &entry : obj.asList()) {
- const auto value = entry.get<T>();
- if (!value)
- return std::nullopt;
- vector[i++] = *value;
- }
-
- return vector;
- }
-};
-#endif /* __DOXYGEN__ */
-
-} /* namespace libcamera */