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_