krita

kis_filter_strategy.h

00001 /*
00002  *  Copyright (c) 2004 Michael Thaler <michael.thaler@physik.tu-muenchen.de>
00003  *  Copyright (c) 2005 Casper Boemann <cbr@boemann.dk>
00004  *
00005  *  This program is free software; you can redistribute it and/or modify
00006  *  it under the terms of the GNU General Public License as published by
00007  *  the Free Software Foundation; either version 2 of the License, or
00008  *  (at your option) any later version.
00009  *
00010  *  This program is distributed in the hope that it will be useful,
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  *  GNU General Public License for more details.
00014  *
00015  *  You should have received a copy of the GNU General Public License
00016  *  along with this program; if not, write to the Free Software
00017  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00018  */
00019 
00020 #ifndef KIS_FILTER_STRATEGY_H_
00021 #define KIS_FILTER_STRATEGY_H_
00022 
00023 #include <klocale.h>
00024 
00025 #include "kis_types.h"
00026 #include "kis_generic_registry.h"
00027 #include "kis_id.h"
00028 
00029 class KisFilterStrategy
00030 {
00031     public:
00032         KisFilterStrategy(KisID id) : m_id(id) {}
00033         virtual ~KisFilterStrategy() {}
00034 
00035         KisID id() {return m_id;};
00036         virtual double valueAt(double /*t*/) const {return 0;};
00037         virtual Q_UINT32 intValueAt(Q_INT32 t) const {return Q_UINT32(255*valueAt(t/256.0));};
00038         double support() { return supportVal;};
00039         Q_UINT32 intSupport() { return intSupportVal;};
00040         virtual bool boxSpecial() { return false;};
00041     protected:
00042         double supportVal;
00043         Q_UINT32 intSupportVal;
00044         KisID m_id;
00045 };
00046 
00047 class KisHermiteFilterStrategy : public KisFilterStrategy
00048 {
00049     public:
00050         KisHermiteFilterStrategy() : KisFilterStrategy(KisID("Hermite", i18n("Hermite")))
00051             {supportVal = 1.0; intSupportVal = 256;}
00052         virtual ~KisHermiteFilterStrategy() {}
00053         
00054         virtual Q_UINT32 intValueAt(Q_INT32 t) const;
00055         virtual double valueAt(double t) const;
00056 };
00057 
00058 class KisCubicFilterStrategy : public KisFilterStrategy
00059 {
00060     public:
00061         KisCubicFilterStrategy() : KisFilterStrategy(KisID("Bicubic", i18n("Bicubic")))
00062             {supportVal = 1.0; intSupportVal = 256;}
00063         virtual ~KisCubicFilterStrategy() {}
00064         
00065         virtual Q_UINT32 intValueAt(Q_INT32 t) const;
00066         virtual double valueAt(double t) const;
00067 };
00068 
00069 class KisBoxFilterStrategy : public KisFilterStrategy
00070 {
00071     public:
00072         KisBoxFilterStrategy() : KisFilterStrategy(KisID("Box", i18n("Box")))
00073              {supportVal = 0.5; intSupportVal = 128;}
00074         virtual ~KisBoxFilterStrategy() {}
00075 
00076         virtual Q_UINT32 intValueAt(Q_INT32 t) const;
00077         virtual double valueAt(double t) const;
00078         virtual bool boxSpecial() { return true;};
00079 };
00080 
00081 class KisTriangleFilterStrategy : public KisFilterStrategy
00082 {
00083     public:
00084         KisTriangleFilterStrategy() : KisFilterStrategy(KisID("Triangle", i18n("Triangle aka (bi)linear")))
00085             {supportVal = 1.0; intSupportVal = 256;}
00086         virtual ~KisTriangleFilterStrategy() {}
00087 
00088         virtual Q_UINT32 intValueAt(Q_INT32 t) const;
00089         virtual double valueAt(double t) const;
00090 };
00091 
00092 class KisBellFilterStrategy : public KisFilterStrategy
00093 {
00094     public:
00095         KisBellFilterStrategy() : KisFilterStrategy(KisID("Bell", i18n("Bell")))
00096             {supportVal = 1.5; intSupportVal = 128+256;}
00097         virtual ~KisBellFilterStrategy() {}
00098 
00099         virtual double valueAt(double t) const;
00100 };
00101 
00102 class KisBSplineFilterStrategy : public KisFilterStrategy
00103 {
00104     public:
00105         KisBSplineFilterStrategy() : KisFilterStrategy(KisID("BSpline", i18n("BSpline")))
00106             {supportVal = 2.0; intSupportVal = 512;}
00107         virtual ~KisBSplineFilterStrategy() {}
00108 
00109         virtual double valueAt(double t) const;
00110 };
00111 
00112 class KisLanczos3FilterStrategy : public KisFilterStrategy
00113 {
00114     public:
00115         KisLanczos3FilterStrategy() : KisFilterStrategy(KisID("Lanczos3", i18n("Lanczos3")))
00116             {supportVal = 3.0; intSupportVal = 768;}
00117         virtual ~KisLanczos3FilterStrategy() {}
00118 
00119         virtual double valueAt(double t) const;
00120     private:
00121         double sinc(double x) const; 
00122 };
00123 
00124 class KisMitchellFilterStrategy : public KisFilterStrategy
00125 {
00126     public:
00127         KisMitchellFilterStrategy() : KisFilterStrategy(KisID("Mitchell", i18n("Mitchell")))
00128             {supportVal = 2.0; intSupportVal = 256;}
00129         virtual ~KisMitchellFilterStrategy() {}
00130 
00131         virtual double valueAt(double t) const;
00132 };
00133 
00134 class KisFilterStrategyRegistry : public KisGenericRegistry<KisFilterStrategy *>
00135 {
00136 public:
00137     virtual ~KisFilterStrategyRegistry();
00138     
00139     static KisFilterStrategyRegistry* instance();
00140 
00141 private:
00142     KisFilterStrategyRegistry();
00143      KisFilterStrategyRegistry(const KisFilterStrategyRegistry&);
00144      KisFilterStrategyRegistry operator=(const KisFilterStrategyRegistry&);
00145 
00146 private:
00147     static KisFilterStrategyRegistry *m_singleton;
00148 };
00149 
00150 #endif // KIS_FILTER_STRATEGY_H_
KDE Home | KDE Accessibility Home | Description of Access Keys