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 KisBoxFilterStrategy : public KisFilterStrategy 00059 { 00060 public: 00061 KisBoxFilterStrategy() : KisFilterStrategy(KisID("Box", i18n("Box"))) 00062 {supportVal = 0.5; intSupportVal = 128;} 00063 virtual ~KisBoxFilterStrategy() {} 00064 00065 virtual Q_UINT32 intValueAt(Q_INT32 t) const; 00066 virtual double valueAt(double t) const; 00067 virtual bool boxSpecial() { return true;}; 00068 }; 00069 00070 class KisTriangleFilterStrategy : public KisFilterStrategy 00071 { 00072 public: 00073 KisTriangleFilterStrategy() : KisFilterStrategy(KisID("Triangle", i18n("Triangle aka (bi)linear"))) 00074 {supportVal = 1.0; intSupportVal = 256;} 00075 virtual ~KisTriangleFilterStrategy() {} 00076 00077 virtual Q_UINT32 intValueAt(Q_INT32 t) const; 00078 virtual double valueAt(double t) const; 00079 }; 00080 00081 class KisBellFilterStrategy : public KisFilterStrategy 00082 { 00083 public: 00084 KisBellFilterStrategy() : KisFilterStrategy(KisID("Bell", i18n("Bell"))) 00085 {supportVal = 1.5; intSupportVal = 128+256;} 00086 virtual ~KisBellFilterStrategy() {} 00087 00088 virtual double valueAt(double t) const; 00089 }; 00090 00091 class KisBSplineFilterStrategy : public KisFilterStrategy 00092 { 00093 public: 00094 KisBSplineFilterStrategy() : KisFilterStrategy(KisID("BSpline", i18n("BSpline"))) 00095 {supportVal = 2.0; intSupportVal = 512;} 00096 virtual ~KisBSplineFilterStrategy() {} 00097 00098 virtual double valueAt(double t) const; 00099 }; 00100 00101 class KisLanczos3FilterStrategy : public KisFilterStrategy 00102 { 00103 public: 00104 KisLanczos3FilterStrategy() : KisFilterStrategy(KisID("Lanczos3", i18n("Lanczos3"))) 00105 {supportVal = 3.0; intSupportVal = 768;} 00106 virtual ~KisLanczos3FilterStrategy() {} 00107 00108 virtual double valueAt(double t) const; 00109 private: 00110 double sinc(double x) const; 00111 }; 00112 00113 class KisMitchellFilterStrategy : public KisFilterStrategy 00114 { 00115 public: 00116 KisMitchellFilterStrategy() : KisFilterStrategy(KisID("Mitchell", i18n("Mitchell"))) 00117 {supportVal = 2.0; intSupportVal = 256;} 00118 virtual ~KisMitchellFilterStrategy() {} 00119 00120 virtual double valueAt(double t) const; 00121 }; 00122 00123 class KisFilterStrategyRegistry : public KisGenericRegistry<KisFilterStrategy *> 00124 { 00125 public: 00126 virtual ~KisFilterStrategyRegistry(); 00127 00128 static KisFilterStrategyRegistry* instance(); 00129 00130 private: 00131 KisFilterStrategyRegistry(); 00132 KisFilterStrategyRegistry(const KisFilterStrategyRegistry&); 00133 KisFilterStrategyRegistry operator=(const KisFilterStrategyRegistry&); 00134 00135 private: 00136 static KisFilterStrategyRegistry *m_singleton; 00137 }; 00138 00139 #endif // KIS_FILTER_STRATEGY_H_