21#include "kis_debug_areas.h"
22#include "kis_filter_strategy.h"
25double KisHermiteFilterStrategy::valueAt(
double t)
const {
28 if(t < 1.0)
return((2.0 * t - 3.0) * t * t + 1.0);
32TQ_UINT32 KisHermiteFilterStrategy::intValueAt(TQ_INT32 t)
const {
37 t =(2 * t - 3*256) * t * t +(256<<16);
40 t = (t + 0x8000) >> 16;
50double KisCubicFilterStrategy::valueAt(
double x)
const {
54 return((2.0+x)*(2.0+x)*(2.0+x)/6.0);
56 return((4.0+x*x*(-6.0-3.0*x))/6.0);
58 return((4.0+x*x*(-6.0+3.0*x))/6.0);
60 return((2.0-x)*(2.0-x)*(2.0-x)/6.0);
64TQ_UINT32 KisCubicFilterStrategy::intValueAt(TQ_INT32 x)
const {
68 return (2 + x) * (2 + x) * ( 2 + x) / 6;
70 return (4 + x * x * ( -6 - 3 * x)) / 6;
72 return (4 + x * x * ( -6 + 3 * x)) / 6;
74 return (2 - x) * ( 2 - x) * (2 - x) / 6;
78double KisBoxFilterStrategy::valueAt(
double t)
const {
79 if((t > -0.5) && (t <= 0.5))
return(1.0);
83TQ_UINT32 KisBoxFilterStrategy::intValueAt(TQ_INT32 t)
const {
85 if((t > -128) && (t <= 128))
90double KisTriangleFilterStrategy::valueAt(
double t)
const {
92 if(t < 1.0)
return(1.0 - t);
96TQ_UINT32 KisTriangleFilterStrategy::intValueAt(TQ_INT32 t)
const {
102 if(t>=128)
return 256 - t;
109double KisBellFilterStrategy::valueAt(
double t)
const {
111 if(t < .5)
return(.75 - (t * t));
114 return(.5 * (t * t));
119double KisBSplineFilterStrategy::valueAt(
double t)
const {
125 return((.5 * tt * t) - tt + (2.0 / 3.0));
128 return((1.0 / 6.0) * (t * t * t));
133double KisLanczos3FilterStrategy::valueAt(
double t)
const {
135 if(t < 3.0)
return(sinc(t) * sinc(t/3.0));
139double KisLanczos3FilterStrategy::sinc(
double x)
const {
140 const double pi=3.1415926535897932385;
142 if(x != 0)
return(sin(x) / x);
146double KisMitchellFilterStrategy::valueAt(
double t)
const {
147 const double B=1.0/3.0;
148 const double C=1.0/3.0;
154 t = (((12.0 - 9.0 * B - 6.0 * C) * (t * tt)) + ((-18.0 + 12.0 * B + 6.0 * C) * tt) + (6.0 - 2 * B));
157 t = (((-1.0 * B - 6.0 * C) * (t * tt)) + ((6.0 * B + 30.0 * C) * tt) + ((-12.0 * B - 48.0 * C) * t) + (8.0 * B + 24 * C));
163KisFilterStrategyRegistry *KisFilterStrategyRegistry::m_singleton = 0;
165KisFilterStrategyRegistry::KisFilterStrategyRegistry()
167 Q_ASSERT(KisFilterStrategyRegistry::m_singleton == 0);
168 KisFilterStrategyRegistry::m_singleton =
this;
171KisFilterStrategyRegistry::~KisFilterStrategyRegistry()
175KisFilterStrategyRegistry* KisFilterStrategyRegistry::instance()
177 if(KisFilterStrategyRegistry::m_singleton == 0)
179 KisFilterStrategyRegistry::m_singleton =
new KisFilterStrategyRegistry();
180 TQ_CHECK_PTR(KisFilterStrategyRegistry::m_singleton);
181 m_singleton->add(
new KisHermiteFilterStrategy);
182 m_singleton->add(
new KisBoxFilterStrategy);
183 m_singleton->add(
new KisTriangleFilterStrategy);
184 m_singleton->add(
new KisBellFilterStrategy);
185 m_singleton->add(
new KisBSplineFilterStrategy);
187 m_singleton->add(
new KisMitchellFilterStrategy);
190 return KisFilterStrategyRegistry::m_singleton;