00001 #ifndef _OSGIMAGESCALER_H_
00002 #define _OSGIMAGESCALER_H_
00003
00004
00005
00006
00007
00008 #include <OSGSystemDef.h>
00009 #include <OSGImage.h>
00010
00011 OSG_BEGIN_NAMESPACE
00012
00015 class OSG_SYSTEMLIB_DLLMAPPING ImageGenericFilter
00016 {
00017 public:
00018
00019 ImageGenericFilter(OSG::Real64 dWidth);
00020 virtual ~ImageGenericFilter(void);
00021
00022 OSG::Real64 getWidth(void) const;
00023 void setWidth(OSG::Real64 dWidth);
00024
00025 virtual OSG::Real64 filter(OSG::Real64 dVal) const = 0;
00026
00027 protected:
00028
00029 OSG::Real64 m_dWidth;
00030 };
00031
00034 class OSG_SYSTEMLIB_DLLMAPPING ImageBoxFilter : public ImageGenericFilter
00035 {
00036 public:
00037
00038 ImageBoxFilter(OSG::Real64 dWidth = OSG::Real64(0.5));
00039 virtual ~ImageBoxFilter(void);
00040
00041 virtual OSG::Real64 filter(OSG::Real64 dVal) const;
00042 };
00043
00046 class OSG_SYSTEMLIB_DLLMAPPING ImageLinearFilter : public ImageGenericFilter
00047 {
00048 public:
00049
00050 ImageLinearFilter(OSG::Real64 dWidth = OSG::Real64(1.0));
00051 virtual ~ImageLinearFilter(void);
00052
00053 virtual OSG::Real64 filter(OSG::Real64 dVal) const;
00054 };
00055
00058 class OSG_SYSTEMLIB_DLLMAPPING ImageGaussianFilter : public ImageGenericFilter
00059 {
00060 public:
00061
00062 ImageGaussianFilter(OSG::Real64 dWidth = OSG::Real64(1.0));
00063 virtual ~ImageGaussianFilter(void);
00064
00065 virtual OSG::Real64 filter(OSG::Real64 dVal) const;
00066 };
00067
00070 class OSG_SYSTEMLIB_DLLMAPPING ImageHammingFilter : public ImageGenericFilter
00071 {
00072 public:
00073
00074 ImageHammingFilter(OSG::Real64 dWidth = OSG::Real64(0.5));
00075 virtual ~ImageHammingFilter(void);
00076
00077 virtual OSG::Real64 filter(OSG::Real64 dVal) const;
00078 };
00079
00082 class OSG_SYSTEMLIB_DLLMAPPING ImageBlackmanFilter : public ImageGenericFilter
00083 {
00084 public:
00085
00086 ImageBlackmanFilter(OSG::Real64 dWidth = OSG::Real64(0.5));
00087 virtual ~ImageBlackmanFilter(void);
00088
00089 virtual OSG::Real64 filter(OSG::Real64 dVal) const;
00090 };
00091
00094 class OSG_SYSTEMLIB_DLLMAPPING ImageLanczos3Filter : public ImageGenericFilter
00095 {
00096 public:
00097
00098 ImageLanczos3Filter(OSG::Real64 dWidth = OSG::Real64(1.0));
00099 virtual ~ImageLanczos3Filter(void);
00100
00101 virtual OSG::Real64 filter(OSG::Real64 dVal) const;
00102
00103 private:
00104
00105 OSG::Real64 sinc(OSG::Real64 x) const;
00106
00107 };
00108
00109
00110
00113 class OSG_SYSTEMLIB_DLLMAPPING ImageScaler
00114 {
00115 public:
00116
00117 static bool scale(ImagePtr &srcImg,
00118 ImagePtr &dstImg,
00119 OSG::Int32 width,
00120 OSG::Int32 height,
00121 OSG::Int32 depth,
00122 const ImageGenericFilter &filter);
00123
00124 private:
00125
00126 ImageScaler(void);
00127 ~ImageScaler(void);
00128
00131 struct Contribution
00132 {
00133
00134 std::vector<Real64> weights;
00135
00136 Int32 left,right;
00137 };
00138
00139 static void calcContributions(UInt32 axis,
00140 Int32 uResSize,
00141 Int32 uSrcSize,
00142 const ImageGenericFilter &filter,
00143 std::vector<Contribution> contrib[3]);
00144 };
00145
00146
00147
00148 OSG_END_NAMESPACE
00149
00150 #endif // _OSGIMAGESCALER_H_