#ifndef GRADIENT_H #define GRADIENT_H #include #include #include "Color.h" #include #include class Gradient { std::vector> points; /// the colors of this gradient stored in linear RGB format /// so they can be easily interpolated std::vector colors; float max; bool repeat; public: Gradient(void); Gradient(std::vector> colors, bool repeat = false, int precalcSteps = -1); Gradient(std::vector> colors, float maxValue, bool repeat = false, int precalcSteps = -1); const std::vector>& getPoints(void) const; inline bool isRepeat(void) const { return repeat; } static Gradient defaultGradient(void); static Gradient fromXml(const std::string& xml); std::string toXml(void) const; /// /// \brief get the maximum value this gradient accepts /// /// If \link Gradient::get(float) is called with a value /// greater than the one returned by this function, the /// value will either get clamped or wrapped around. /// float getMax(void) const; /// /// \brief get a color at a specific position in this gradient /// \param x the position /// \return the color in sRGB format /// RGBColor get(float x) const; private: static RGBColorf lerpColors(RGBColorf a, RGBColorf b, float val); static RGBColor lerpColors(RGBColor a, RGBColor b, float val); std::tuple getNeighbors(float x) const; }; #endif // GRADIENT_H