[RFC PATCH v2 02/12] ipa: libipa: vector: Add r(), g() and b() accessors
Milan Zamazal
mzamazal at redhat.com
Mon Nov 18 12:02:29 CET 2024
Hi Laurent,
thank you for the patches.
Laurent Pinchart <laurent.pinchart at ideasonboard.com> writes:
> The Vector class can be useful to represent RGB pixel values. Add r(),
> g() and b() accessors, similar to x(), y() and z(), along with an RGB
> type that aliases Vector<T, 3>.
Good thing to have, including RGB alias.
Is this expected to have the same access time as with e.g.
struct RGB {
T r, g, b;
};
? This is important in places where each CPU cycle counts, like
software ISP debayering.
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Milan Zamazal <mzamazal at redhat.com>
> ---
> src/ipa/libipa/vector.cpp | 38 ++++++++++++++++++++++++++++++++++++++
> src/ipa/libipa/vector.h | 28 ++++++++++++++++++++++++++++
> 2 files changed, 66 insertions(+)
>
> diff --git a/src/ipa/libipa/vector.cpp b/src/ipa/libipa/vector.cpp
> index 8a39bfd27f90..f14f155216f3 100644
> --- a/src/ipa/libipa/vector.cpp
> +++ b/src/ipa/libipa/vector.cpp
> @@ -126,6 +126,39 @@ namespace ipa {
> * \copydoc Vector::z()
> */
>
> +/**
> + * \fn T &Vector::r()
> + * \brief Convenience function to access the first element of the vector
> + * \return The first element of the vector
> + */
> +
> +/**
> + * \fn T &Vector::g()
> + * \brief Convenience function to access the second element of the vector
> + * \return The second element of the vector
> + */
> +
> +/**
> + * \fn 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
> @@ -149,6 +182,11 @@ namespace ipa {
> * \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
> diff --git a/src/ipa/libipa/vector.h b/src/ipa/libipa/vector.h
> index 1b11a34deee4..b72ab9851aa3 100644
> --- a/src/ipa/libipa/vector.h
> +++ b/src/ipa/libipa/vector.h
> @@ -126,6 +126,31 @@ public:
> #endif /* __DOXYGEN__ */
> 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__ */
> + T &r() { return data_[0]; }
> +#ifndef __DOXYGEN__
> + template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 2>>
> +#endif /* __DOXYGEN__ */
> + T &g() { return data_[1]; }
> +#ifndef __DOXYGEN__
> + template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 3>>
> +#endif /* __DOXYGEN__ */
> + T &b() { return data_[2]; }
> +
> constexpr double length2() const
> {
> double ret = 0;
> @@ -143,6 +168,9 @@ private:
> 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)
> {
More information about the libcamera-devel
mailing list