00001 #include "vuSliceFilter.h"
00002
00003 #define SQRT_THREE 1.7320508
00004
00005
00006 vuSliceFilter::vuSliceFilter()
00007 {
00008 m_FilterWidth = 1;
00009 m_FilterKind = 0;
00010 m_Callback = NULL;
00011 m_LowPassFactor = 1.0;
00012 }
00013
00014 vuSliceFilter::vuSliceFilter(vuSliceFilterCB cb, const vuString& filterName)
00015 : vuFilter(filterName)
00016 {
00017 m_FilterWidth = 1;
00018 m_FilterKind = 0;
00019 m_Callback = cb;
00020 m_LowPassFactor = 1.0;
00021 }
00022
00023 vuSliceFilter::~vuSliceFilter()
00024 {
00025 }
00026
00027 void vuSliceFilter::setWidth(dword width)
00028 {
00029 m_FilterWidth = width;
00030 }
00031
00032 dword vuSliceFilter::getWidth()
00033 {
00034 return m_FilterWidth;
00035 }
00036
00037
00038
00039 void vuSliceFilter::setKind(byte kind)
00040 {
00041 m_FilterKind = kind;
00042 if (m_FilterKind > 1) m_FilterKind = 0;
00043 }
00044
00045 byte vuSliceFilter::getKind()
00046 {
00047 return m_FilterKind;
00048 }
00049
00050 void vuSliceFilter::setLowPassFactor(float lowPass)
00051 {
00052 if (lowPass > 1.0) lowPass = 1.0;
00053 if (lowPass <= 0.0) lowPass = 0.01;
00054
00055 m_LowPassFactor = lowPass;
00056 }
00057
00058 float vuSliceFilter::getLowPassFactor()
00059 {
00060 return m_LowPassFactor;
00061 }
00062
00063 void vuSliceFilter::getFilterNames(vuString* &names, dword& num)
00064 {
00065 static const dword count = 5;
00066 static const vuString result[count] = { "box",
00067 "linear",
00068 "quadratic",
00069 "cubic",
00070 "gaussian" };
00071
00072 names = (vuString *)result;
00073 num = count;
00074 }
00075
00076 vuSliceFilter *vuSliceFilter::getFilter(const vuString &filterName)
00077 {
00078 if (filterName == "box")
00079 return new vuSliceFilter(vuSliceFilter_box, "box");
00080 else if (filterName == "linear")
00081 return new vuSliceFilter(vuSliceFilter_linear, "linear");
00082 else if (filterName == "quadratic")
00083 return new vuSliceFilter(vuSliceFilter_quadratic, "quadratic");
00084 else if (filterName == "cubic")
00085 return new vuSliceFilter(vuSliceFilter_cubic, "cubic");
00086 else if (filterName == "gaussian")
00087 return new vuSliceFilter(vuSliceFilter_gaussian, "gaussian");
00088 else
00089 return NULL;
00090 }
00091
00092
00093
00094
00095
00096 float vuSliceFilter_box(float x)
00097 {
00098 return 1.0f;
00099 }
00100
00101 float vuSliceFilter_linear(float x)
00102 {
00103 return 1.0f - fabs(x);
00104 }
00105
00106 float vuSliceFilter_quadratic(float x)
00107 {
00108 return 1.0f - x*x;
00109 }
00110
00111 float vuSliceFilter_cubic(float x)
00112 {
00113 return 1.0f - fabs(x*x*x);
00114 }
00115
00116 float vuSliceFilter_gaussian(float x)
00117 {
00118 return exp(-x*x/2);
00119 }
00120
00121
00122
00123