From 15833a6b789b7ed341a807ab083d3acf9a9fa1a8 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 21 Feb 2017 13:20:56 -0800 Subject: [core] Move interpolate.hpp to public include directory --- include/mbgl/util/interpolate.hpp | 89 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 include/mbgl/util/interpolate.hpp (limited to 'include/mbgl/util') diff --git a/include/mbgl/util/interpolate.hpp b/include/mbgl/util/interpolate.hpp new file mode 100644 index 0000000000..d463ffc056 --- /dev/null +++ b/include/mbgl/util/interpolate.hpp @@ -0,0 +1,89 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include +#include + +namespace mbgl { +namespace util { + +float interpolationFactor(float base, Range range, float z); + +template +struct Interpolator; + +template +T interpolate(const T& a, const T& b, const double t) { + return Interpolator()(a, b, t); +} + + +template +struct Interpolator { + T operator()(const T& a, const T& b, const double t) const { + return a * (1.0 - t) + b * t; + } +}; + +template +struct Interpolator> { +private: + using Array = std::array; + + template + Array operator()(const Array& a, const Array& b, const double t, std::index_sequence) { + return {{ interpolate(a[I], b[I], t)... }}; + } + +public: + Array operator()(const Array& a, const Array& b, const double t) { + return operator()(a, b, t, std::make_index_sequence()); + } +}; + +template <> +struct Interpolator { +public: + Color operator()(const Color& a, const Color& b, const double t) { + return { + interpolate(a.r, b.r, t), + interpolate(a.g, b.g, t), + interpolate(a.b, b.b, t), + interpolate(a.a, b.a, t) + }; + } +}; + +struct Uninterpolated { + template + T operator()(const T& a, const T&, const double) const { + return a; + } +}; + +template <> +struct Interpolator + : Uninterpolated {}; + +template +struct Interpolator::value>> + : Uninterpolated {}; + +template <> +struct Interpolator + : Uninterpolated {}; + +template +struct Interpolator> + : Uninterpolated {}; + +template +constexpr bool Interpolatable = !std::is_base_of>::value; + +} // namespace util +} // namespace mbgl -- cgit v1.2.1