// Description: Table_Filter class
// Detail: Piecewise-linear modifiable reconstruction filter
// Documentation: filters.txt
#ifndef PASTELGFX_TABLE_FILTER_H
#define PASTELGFX_TABLE_FILTER_H
#include "pastel/gfx/filter.h"
#include "pastel/sys/array.h"
namespace Pastel
{
    //! Piecewise-linear reconstruction filter.
    /*!
   This class represents a piecewise-linear
   filter whose knots are uniformly distributed
   on the range [-radius, radius].
   The first knot is located at x = -radius and
   the last knot is located at x = radius.
   The purpose of this class is to act
   as an efficient approximation for the
   other filters.
   */
    class Table_Filter
        : public Filter
    {
    public:
        // Using default constructor.
        // Using default copy constructor.
        // Using default assignment.
        //! Construct with the given data.
        /*!
       Preconditions:
       radius > 0
       odd(data.width())
       */
        Table_Filter(
            const Array<dreal, 1>& data,
            dreal radius);
        virtual ~Table_Filter();
        virtual dreal evaluateInRange(dreal position) const;
    private:
        Table_Filter(const Table_Filter& that) = delete;
        Table_Filter& operator=(const Table_Filter& that) = delete;
        virtual void onSetRadius();
        Array<dreal, 1> data_;
        integer center_;
        dreal scaling_;
    };
    using TableFilterPtr = std::shared_ptr<Table_Filter>;
    using ConstTableFilterPtr = std::shared_ptr<const Table_Filter>;
    TableFilterPtr tableFilter(const ConstFilterPtr& filter, integer samplesPerRadius = 16);
}
#include "pastel/gfx/filter/table_filter.hpp"
#endif