#include #include #include namespace icl { //Define Fallback also when IPP is - needed for datatypes, that are not supported by IPP // {{{ C++ fallback functions template inline void fallbackArithmetic2T(const Img *src1, const Img *src2, Img *dst,const ArithmeticOp &op) // {{{ open { ICLASSERT_RETURN( src1 && src2 && dst ); ICLASSERT_RETURN( src1->getROISize() == src2->getROISize() ); ICLASSERT_RETURN( src1->getROISize() == dst->getROISize() ); ICLASSERT_RETURN( src1->getChannels() == src2->getChannels() ); ICLASSERT_RETURN( src1->getChannels() == dst->getChannels() ); for(int c=src1->getChannels()-1; c >= 0; --c) { ConstImgIterator itSrc1 = src1->getROIIterator(c); ConstImgIterator itSrc2 = src2->getROIIterator(c); ImgIterator itDst = dst->getROIIterator(c); for(;itSrc1.inRegion(); ++itSrc1, ++itSrc2, ++itDst){ *itDst = op(*itSrc1,*itSrc2); } } } // }}} template inline void fallbackArithmetic2TC(const Img *src, const T value, Img *dst,const ArithmeticOp &op) // {{{ open { ICLASSERT_RETURN( src && dst ); ICLASSERT_RETURN( src->getROISize() == dst->getROISize() ); ICLASSERT_RETURN( src->getChannels() == dst->getChannels() ); for(int c=src->getChannels()-1; c >= 0; --c) { ConstImgIterator itSrc = src->getROIIterator(c); ImgIterator itDst = dst->getROIIterator(c); for(;itSrc.inRegion(); ++itSrc, ++itDst){ *itDst = op(*itSrc,value); } } } // }}} template inline void fallbackArithmetic1T(const Img *src, Img *dst,const ArithmeticOp &op) // {{{ open { ICLASSERT_RETURN( src && dst ); ICLASSERT_RETURN( src->getROISize() == dst->getROISize() ); ICLASSERT_RETURN( src->getChannels() == dst->getChannels() ); for(int c=src->getChannels()-1; c >= 0; --c) { ConstImgIterator itSrc = src->getROIIterator(c); ImgIterator itDst = dst->getROIIterator(c); for(;itSrc.inRegion(); ++itSrc, ++itDst){ *itDst = op(*itSrc); } } } // }}} // }}} // {{{ C++ fallback Logical Operators template class AddOp { public: inline T operator()(T val1,T val2) const { return val1 + val2; } }; template class SubOp { public: inline T operator()(T val1,T val2) const { return val1 - val2; } }; template class MulOp { public: inline T operator()(T val1,T val2) const { return val1 * val2; } }; template class DivOp { public: inline T operator()(T val1,T val2) const { return val1 / val2; } }; template class SqrOp { public: inline T operator()(T val) const { return val*val; } }; template class SqrtOp { public: inline T operator()(T val) const { return (T)sqrt(val); } //TODO?? const_cast(sqrt(val) }; template class LnOp { public: inline T operator()(T val) const { return (T)log(val); } //TODO?? const_cast }; template class ExpOp { public: inline T operator()(T val) const { return (T)exp(val); } //TODO?? const_cast }; template class fAbsOp { public: inline T operator()(T val) const { return fabs(val); } }; template class AbsOp { public: inline T operator()(T val) const { return abs(val); } }; template class AbsDiffOp { public: inline T operator()(T val1,T val2) const { return abs(val1 - val2); } }; template class fAbsDiffOp { public: inline T operator()(T val1,T val2) const { return fabs(val1 - val2); } }; // }}} #ifdef WITH_IPP_OPTIMIZATION // {{{ ippi-function call templates template inline void ippi1srcInplaceCall(const Img *srcdst) { // {{{ open ICLASSERT_RETURN( srcdst ); for (int c=srcdst->getChannels()-1; c >= 0; --c) { ippiFunc (srcdst->getROIData (c), srcdst->getLineStep(), srcdst->getROISize()); } } // }}} template inline void ippi1srcCall(const Img *src, Img *dst) { // {{{ open ICLASSERT_RETURN( src && dst ); ICLASSERT_RETURN( src->getROISize() == dst->getROISize() ); ICLASSERT_RETURN( src->getChannels()==dst->getChannels()); for (int c=src->getChannels()-1; c >= 0; --c) { ippiFunc (src->getROIData (c), src->getLineStep(), dst->getROIData (c), dst->getLineStep(), dst->getROISize()); } } // }}} template inline void ippi1srcCall_sc(const Img *src, Img *dst) { // {{{ open ICLASSERT_RETURN( src && dst ); ICLASSERT_RETURN( src->getROISize() == dst->getROISize() ); ICLASSERT_RETURN( src->getChannels()==dst->getChannels()); for (int c=src->getChannels()-1; c >= 0; --c) { ippiFunc (src->getROIData (c), src->getLineStep(), dst->getROIData (c), dst->getLineStep(), dst->getROISize(), 0); } } // }}} template inline void ippi2srcCall(const Img *src1, const Img *src2, Img *dst) { // {{{ open ICLASSERT_RETURN( src1 && src2 && dst ); ICLASSERT_RETURN( src1->getROISize() == src2->getROISize() ); ICLASSERT_RETURN( src1->getROISize() == dst->getROISize() ); ICLASSERT_RETURN( src1->getChannels()==src2->getChannels()); ICLASSERT_RETURN( src1->getChannels()==dst->getChannels()); for (int c=src1->getChannels()-1; c >= 0; --c) { ippiFunc (src1->getROIData (c), src1->getLineStep(), src2->getROIData (c), src2->getLineStep(), dst->getROIData (c), dst->getLineStep(), dst->getROISize()); } } // }}} template inline void ippi2srcCall_sc(const Img *src1, const Img *src2, Img *dst) { // {{{ open ICLASSERT_RETURN( src1 && src2 && dst ); ICLASSERT_RETURN( src1->getROISize() == src2->getROISize() ); ICLASSERT_RETURN( src1->getROISize() == dst->getROISize() ); ICLASSERT_RETURN( src1->getChannels()==src2->getChannels()); ICLASSERT_RETURN( src1->getChannels()==dst->getChannels()); for (int c=src1->getChannels()-1; c >= 0; --c) { ippiFunc (src1->getROIData (c), src1->getLineStep(), src2->getROIData (c), src2->getLineStep(), dst->getROIData (c), dst->getLineStep(), dst->getROISize(),0); } } // }}} template inline void ippiCallC(const Img *src, T value, Img *dst) { // {{{ open ICLASSERT_RETURN( src && dst ); ICLASSERT_RETURN( src->getROISize() == dst->getROISize() ); ICLASSERT_RETURN( src->getChannels()==dst->getChannels()); for (int c=src->getChannels()-1; c >= 0; --c) { ippiFunc (src->getROIData (c), src->getLineStep(), value, dst->getROIData (c), dst->getLineStep(), dst->getROISize()); } } template inline void ippiCallC_sc(const Img *src, T value, Img *dst) { // {{{ open ICLASSERT_RETURN( src && dst ); ICLASSERT_RETURN( src->getROISize() == dst->getROISize() ); ICLASSERT_RETURN( src->getChannels()==dst->getChannels()); for (int c=src->getChannels()-1; c >= 0; --c) { ippiFunc (src->getROIData (c), src->getLineStep(), value, dst->getROIData (c), dst->getLineStep(), dst->getROISize(),0); } } template inline void ippiCallAbsDiffC(const Img *src, Img *dst, R value) { // {{{ open ICLASSERT_RETURN( src && dst ); ICLASSERT_RETURN( src->getROISize() == dst->getROISize() ); ICLASSERT_RETURN( src->getChannels()==dst->getChannels()); for (int c=src->getChannels()-1; c >= 0; --c) { ippiFunc (src->getROIData (c), src->getLineStep(), dst->getROIData (c), dst->getLineStep(), dst->getROISize(), value); } } // }}} // {{{ function specializations void Arithmetic::Add (const Img8u *src1, const Img8u *src2, Img8u *dst){ ippi2srcCall_sc(src1,src2,dst); } void Arithmetic::Add (const Img16s *src1, const Img16s *src2, Img16s *dst){ ippi2srcCall_sc(src1,src2,dst); } void Arithmetic::Add (const Img32s *src1, const Img32s *src2, Img32s *dst){ fallbackArithmetic2T(src1, src2,dst,AddOp()); } void Arithmetic::Add (const Img32f *src1, const Img32f *src2, Img32f *dst){ ippi2srcCall(src1,src2,dst); } void Arithmetic::Add (const Img64f *src1, const Img64f *src2, Img64f *dst){ fallbackArithmetic2T(src1, src2,dst,AddOp()); } void Arithmetic::Sub (const Img8u *src1, const Img8u *src2, Img8u *dst){ ippi2srcCall_sc(src1,src2,dst); } void Arithmetic::Sub (const Img16s *src1, const Img16s *src2, Img16s *dst){ ippi2srcCall_sc(src1,src2,dst); } void Arithmetic::Sub (const Img32s *src1, const Img32s *src2, Img32s *dst){ fallbackArithmetic2T(src1, src2,dst,SubOp()); } void Arithmetic::Sub (const Img32f *src1, const Img32f *src2, Img32f *dst){ ippi2srcCall(src1,src2,dst); } void Arithmetic::Sub (const Img64f *src1, const Img64f *src2, Img64f *dst){ fallbackArithmetic2T(src1, src2,dst,SubOp()); } void Arithmetic::Mul (const Img8u *src1, const Img8u *src2, Img8u *dst){ ippi2srcCall_sc(src1,src2,dst); } void Arithmetic::Mul (const Img16s *src1, const Img16s *src2, Img16s *dst){ ippi2srcCall_sc(src1,src2,dst); } void Arithmetic::Mul (const Img32s *src1, const Img32s *src2, Img32s *dst){ fallbackArithmetic2T(src1, src2,dst,MulOp()); } void Arithmetic::Mul (const Img32f *src1, const Img32f *src2, Img32f *dst){ ippi2srcCall(src1,src2,dst); } void Arithmetic::Mul (const Img64f *src1, const Img64f *src2, Img64f *dst){ fallbackArithmetic2T(src1, src2,dst,MulOp()); } void Arithmetic::MulScale (const Img8u *src1, const Img8u *src2, Img8u *dst){ ippi2srcCall(src1,src2,dst); } void Arithmetic::Div (const Img8u *src1, const Img8u *src2, Img8u *dst){ ippi2srcCall_sc(src1,src2,dst); } void Arithmetic::Div (const Img16s *src1, const Img16s *src2, Img16s *dst){ ippi2srcCall_sc(src1,src2,dst); } void Arithmetic::Div (const Img32s *src1, const Img32s *src2, Img32s *dst){ fallbackArithmetic2T(src1, src2,dst,DivOp()); } void Arithmetic::Div (const Img32f *src1, const Img32f *src2, Img32f *dst){ ippi2srcCall(src1,src2,dst); } void Arithmetic::Div (const Img64f *src1, const Img64f *src2, Img64f *dst){ fallbackArithmetic2T(src1, src2,dst,DivOp()); } void Arithmetic::AbsDiff (const Img8u *src1, const Img8u *src2, Img8u *dst){ ippi2srcCall(src1,src2,dst); } void Arithmetic::AbsDiff (const Img16s *src1, const Img16s *src2, Img16s *dst){ fallbackArithmetic2T(src1, src2,dst,AbsDiffOp()); } void Arithmetic::AbsDiff (const Img32s *src1, const Img32s *src2, Img32s *dst){ fallbackArithmetic2T(src1, src2,dst,AbsDiffOp()); } void Arithmetic::AbsDiff (const Img32f *src1, const Img32f *src2, Img32f *dst){ ippi2srcCall(src1,src2,dst); } void Arithmetic::AbsDiff (const Img64f *src1, const Img64f *src2, Img64f *dst){ fallbackArithmetic2T(src1, src2,dst,fAbsDiffOp()); } void Arithmetic::AbsDiffC (const Img8u *src, const int value, Img8u *dst){ ippiCallAbsDiffC(src,dst,value); } void Arithmetic::AbsDiffC (const Img16s *src, const int value, Img16s *dst) { fallbackArithmetic2TC(src, value,dst,AbsDiffOp()); } void Arithmetic::AbsDiffC (const Img32s *src, const int value, Img32s *dst) { fallbackArithmetic2TC(src, value,dst,AbsDiffOp()); } void Arithmetic::AbsDiffC (const Img32f *src, const icl32f value, Img32f *dst){ ippiCallAbsDiffC(src,dst,value); } void Arithmetic::AbsDiffC (const Img64f *src, const icl64f value, Img64f *dst) { fallbackArithmetic2TC(src, value,dst,fAbsDiffOp()); } void Arithmetic::Sqr (const Img8u *src, Img8u *dst){ ippi1srcCall_sc(src,dst); } void Arithmetic::Sqr (const Img16s *src, Img16s *dst){ ippi1srcCall_sc(src,dst); } void Arithmetic::Sqr (const Img32s *src, Img32s *dst){ fallbackArithmetic1T(src,dst,SqrOp()); } void Arithmetic::Sqr (const Img32f *src, Img32f *dst){ ippi1srcCall(src,dst); } void Arithmetic::Sqr (const Img64f *src, Img64f *dst){ fallbackArithmetic1T(src,dst,SqrOp()); } void Arithmetic::Sqrt (const Img8u *src, Img8u *dst){ ippi1srcCall_sc(src,dst); } void Arithmetic::Sqrt (const Img16s *src, Img16s *dst){ ippi1srcCall_sc(src,dst); } void Arithmetic::Sqrt (const Img32s *src, Img32s *dst){ fallbackArithmetic1T(src,dst,SqrtOp()); } void Arithmetic::Sqrt (const Img32f *src, Img32f *dst){ ippi1srcCall(src,dst); } void Arithmetic::Sqrt (const Img64f *src, Img64f *dst){ fallbackArithmetic1T(src,dst,SqrtOp()); } void Arithmetic::Exp (const Img8u *src, Img8u *dst){ ippi1srcCall_sc(src,dst); } void Arithmetic::Exp (const Img16s *src, Img16s *dst){ ippi1srcCall_sc(src,dst); } void Arithmetic::Exp (const Img32s *src, Img32s *dst){ fallbackArithmetic1T(src,dst,ExpOp()); } void Arithmetic::Exp (const Img32f *src, Img32f *dst){ ippi1srcCall(src,dst); } void Arithmetic::Exp (const Img64f *src, Img64f *dst){ fallbackArithmetic1T(src,dst,ExpOp()); } void Arithmetic::Ln (const Img8u *src, Img8u *dst){ ippi1srcCall_sc(src,dst); } void Arithmetic::Ln (const Img16s *src, Img16s *dst){ ippi1srcCall_sc(src,dst); } void Arithmetic::Ln (const Img32s *src, Img32s *dst){ fallbackArithmetic1T(src,dst,LnOp()); } void Arithmetic::Ln (const Img32f *src, Img32f *dst){ ippi1srcCall(src,dst); } void Arithmetic::Ln (const Img64f *src, Img64f *dst){ fallbackArithmetic1T(src,dst,LnOp()); } void Arithmetic::Abs (const Img16s *src, Img16s *dst){ ippi1srcCall(src,dst); } void Arithmetic::Abs (const Img32s *src, Img32s *dst) { fallbackArithmetic1T(src, dst,AbsOp()); } void Arithmetic::Abs (const Img32f *src, Img32f *dst){ ippi1srcCall(src,dst); } void Arithmetic::Abs (const Img64f *src, Img64f *dst) { fallbackArithmetic1T(src, dst,fAbsOp()); } void Arithmetic::Abs (Img16s *srcdst){ ippi1srcInplaceCall(srcdst); } void Arithmetic::Abs (Img32s *srcdst) { fallbackArithmetic1T(srcdst, srcdst,AbsOp()); } void Arithmetic::Abs (Img32f *srcdst){ ippi1srcInplaceCall(srcdst); } void Arithmetic::Abs (Img64f *srcdst) { fallbackArithmetic1T(srcdst, srcdst,fAbsOp()); } void Arithmetic::AddC (const Img8u *src, const icl8u value, Img8u *dst){ ippiCallC_sc(src,value,dst); } void Arithmetic::AddC (const Img16s *src, const icl16s value, Img16s *dst){ ippiCallC_sc(src,value,dst); } void Arithmetic::AddC (const Img32s *src, const icl32s value, Img32s *dst){ fallbackArithmetic2TC(src, value,dst,AddOp()); } void Arithmetic::AddC (const Img32f *src, const icl32f value, Img32f *dst){ ippiCallC(src,value,dst); } void Arithmetic::AddC (const Img64f *src, const icl64f value, Img64f *dst){ fallbackArithmetic2TC(src, value,dst,AddOp()); } void Arithmetic::SubC (const Img8u *src, const icl8u value, Img8u *dst){ ippiCallC_sc(src,value,dst); } void Arithmetic::SubC (const Img16s *src, const icl16s value, Img16s *dst){ ippiCallC_sc(src,value,dst); } void Arithmetic::SubC (const Img32s *src, const icl32s value, Img32s *dst){ fallbackArithmetic2TC(src, value,dst,SubOp()); } void Arithmetic::SubC (const Img32f *src, const icl32f value, Img32f *dst){ ippiCallC(src,value,dst); } void Arithmetic::SubC (const Img64f *src, const icl64f value, Img64f *dst){ fallbackArithmetic2TC(src, value,dst,SubOp()); } void Arithmetic::MulC (const Img8u *src, const icl8u value, Img8u *dst){ ippiCallC_sc(src,value,dst); } void Arithmetic::MulC (const Img16s *src, const icl16s value, Img16s *dst){ ippiCallC_sc(src,value,dst); } void Arithmetic::MulC (const Img32s *src, const icl32s value, Img32s *dst){ fallbackArithmetic2TC(src, value,dst,MulOp()); } void Arithmetic::MulC (const Img32f *src, const icl32f value, Img32f *dst){ ippiCallC(src,value,dst); } void Arithmetic::MulC (const Img64f *src, const icl64f value, Img64f *dst){ fallbackArithmetic2TC(src, value,dst,MulOp()); } void Arithmetic::DivC (const Img8u *src, const icl8u value, Img8u *dst){ ippiCallC_sc(src,value,dst); } void Arithmetic::DivC (const Img16s *src, const icl16s value, Img16s *dst){ ippiCallC_sc(src,value,dst); } void Arithmetic::DivC (const Img32s *src, const icl32s value, Img32s *dst){ fallbackArithmetic2TC(src, value,dst,DivOp()); } void Arithmetic::DivC (const Img32f *src, const icl32f value, Img32f *dst){ ippiCallC(src,value,dst); } void Arithmetic::DivC (const Img64f *src, const icl64f value, Img64f *dst){ fallbackArithmetic2TC(src, value,dst,DivOp()); } void Arithmetic::MulCScale (const Img8u *src, const icl8u value, Img8u *dst){ ippiCallC(src,value,dst); } // }}} #else // not implemented functions void Arithmetic::MulCScale (const Img8u *src, const icl8u value, Img8u *dst){ #warning "MulCScale is not yet implemented without IPP optimization"; } void Arithmetic::MulScale (const Img8u *src1, const Img8u *src2, Img8u *dst){ #warning "MulScale is not yet implemented without IPP optimization"; } // {{{ C++ fallback function specializations #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::Add (const Img ## T *src1, const Img ## T *src2, Img ## T *dst) {\ fallbackArithmetic2T(src1, src2,dst,AddOp());} ICL_INSTANTIATE_ALL_DEPTHS #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::Sub (const Img ## T *src1, const Img ## T *src2, Img ## T *dst) {\ fallbackArithmetic2T(src1, src2,dst,SubOp());} ICL_INSTANTIATE_ALL_DEPTHS #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::Mul (const Img ## T *src1, const Img ## T *src2, Img ## T *dst) {\ fallbackArithmetic2T(src1, src2,dst,MulOp());} ICL_INSTANTIATE_ALL_DEPTHS #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::Div (const Img ## T *src1, const Img ## T *src2, Img ## T *dst) {\ fallbackArithmetic2T(src1, src2,dst,DivOp());} ICL_INSTANTIATE_ALL_DEPTHS #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::AddC (const Img ## T *src, const icl ## T value, Img ## T *dst){\ fallbackArithmetic2TC(src, value,dst,AddOp());} ICL_INSTANTIATE_ALL_DEPTHS #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::SubC (const Img ## T *src, const icl ## T value, Img ## T *dst){\ fallbackArithmetic2TC(src, value,dst,SubOp());} ICL_INSTANTIATE_ALL_DEPTHS #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::MulC (const Img ## T *src, const icl ## T value, Img ## T *dst){\ fallbackArithmetic2TC(src, value,dst,MulOp());} ICL_INSTANTIATE_ALL_DEPTHS #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::DivC (const Img ## T *src, const icl ## T value, Img ## T *dst){\ fallbackArithmetic2TC(src, value,dst,DivOp());} ICL_INSTANTIATE_ALL_DEPTHS #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::Sqr (const Img ## T *src, Img ## T *dst){\ fallbackArithmetic1T(src,dst,SqrOp());} ICL_INSTANTIATE_ALL_DEPTHS #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::Sqrt (const Img ## T *src, Img ## T *dst){\ fallbackArithmetic1T(src,dst,SqrtOp());} ICL_INSTANTIATE_ALL_DEPTHS #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::Exp (const Img ## T *src, Img ## T *dst){\ fallbackArithmetic1T(src,dst,ExpOp());} ICL_INSTANTIATE_ALL_DEPTHS #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::Ln (const Img ## T *src, Img ## T *dst){\ fallbackArithmetic1T(src,dst,LnOp());} ICL_INSTANTIATE_ALL_DEPTHS #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::Abs (const Img ## T *src, Img ## T *dst){ \ fallbackArithmetic1T(src, dst,AbsOp());} ICL_INSTANTIATE_DEPTH(16s) ICL_INSTANTIATE_DEPTH(32s) #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::Abs (const Img ## T *src, Img ## T *dst){ \ fallbackArithmetic1T(src, dst,fAbsOp());} ICL_INSTANTIATE_DEPTH(32f) ICL_INSTANTIATE_DEPTH(64f) #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::Abs (Img ## T *srcdst){\ fallbackArithmetic1T(srcdst, srcdst,AbsOp());} ICL_INSTANTIATE_DEPTH(16s) ICL_INSTANTIATE_DEPTH(32s) #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::Abs (Img ## T *srcdst){\ fallbackArithmetic1T(srcdst, srcdst,fAbsOp());} ICL_INSTANTIATE_DEPTH(32f) ICL_INSTANTIATE_DEPTH(64f) #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::AbsDiff (const Img ## T *src1, const Img ## T *src2, Img ## T *dst){\ fallbackArithmetic2T(src1, src2,dst,AbsDiffOp());\ } ICL_INSTANTIATE_DEPTH(8u) ICL_INSTANTIATE_DEPTH(16s) ICL_INSTANTIATE_DEPTH(32s) #undef ICL_INSTANTIATE_DEPTH #define ICL_INSTANTIATE_DEPTH(T) \ void Arithmetic::AbsDiff (const Img ## T *src1, const Img ## T *src2, Img ## T *dst){\ fallbackArithmetic2T(src1, src2,dst,fAbsDiffOp());\ } ICL_INSTANTIATE_DEPTH(32f) ICL_INSTANTIATE_DEPTH(64f) #undef ICL_INSTANTIATE_DEPTH void Arithmetic::AbsDiffC (const Img8u *src, const int value, Img8u *dst) { fallbackArithmetic2TC(src, value,dst,AbsDiffOp()); } void Arithmetic::AbsDiffC (const Img16s *src, const int value, Img16s *dst) { fallbackArithmetic2TC(src, value,dst,AbsDiffOp()); } void Arithmetic::AbsDiffC (const Img32s *src, const int value, Img32s *dst) { fallbackArithmetic2TC(src, value,dst,AbsDiffOp()); } void Arithmetic::AbsDiffC (const Img32f *src, const icl32f value, Img32f *dst) { fallbackArithmetic2TC(src, value,dst,fAbsDiffOp()); } void Arithmetic::AbsDiffC (const Img64f *src, const icl64f value, Img64f *dst) { fallbackArithmetic2TC(src, value,dst,fAbsDiffOp()); } // }}} #endif // {{{ ImgBase* versions #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: Add(poSrc1->asImg(),poSrc2->asImg(),(*ppoDst)->asImg()); break; void Arithmetic::Add (const ImgBase *poSrc1, const ImgBase *poSrc2, ImgBase **ppoDst) { // {{{ open // ICLASSERT_RETURN( poSrc1->getDepth() == depth32f); if (!Filter::prepare (ppoDst, poSrc1)) return; switch (poSrc1->getDepth()) { ICL_INSTANTIATE_ALL_DEPTHS default: ICL_INVALID_FORMAT; break; }; } #undef ICL_INSTANTIATE_DEPTH // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: Sub(poSrc1->asImg(),poSrc2->asImg(),(*ppoDst)->asImg()); break; void Arithmetic::Sub (const ImgBase *poSrc1, const ImgBase *poSrc2, ImgBase **ppoDst) { // {{{ open if (!Filter::prepare (ppoDst, poSrc1)) return; switch (poSrc1->getDepth()) { ICL_INSTANTIATE_ALL_DEPTHS default: ICL_INVALID_FORMAT; break; }; } #undef ICL_INSTANTIATE_DEPTH // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: Mul(poSrc1->asImg(),poSrc2->asImg(),(*ppoDst)->asImg()); break; void Arithmetic::Mul (const ImgBase *poSrc1, const ImgBase *poSrc2, ImgBase **ppoDst) { // {{{ open if (!Filter::prepare (ppoDst, poSrc1)) return; switch (poSrc1->getDepth()) { ICL_INSTANTIATE_ALL_DEPTHS default: ICL_INVALID_FORMAT; break; }; } #undef ICL_INSTANTIATE_DEPTH // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: Div(poSrc1->asImg(),poSrc2->asImg(),(*ppoDst)->asImg()); break; void Arithmetic::Div (const ImgBase *poSrc1, const ImgBase *poSrc2, ImgBase **ppoDst) { // {{{ open if (!Filter::prepare (ppoDst, poSrc1)) return; switch (poSrc1->getDepth()) { ICL_INSTANTIATE_ALL_DEPTHS default: ICL_INVALID_FORMAT; break; }; } #undef ICL_INSTANTIATE_DEPTH // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: AddC(poSrc->asImg(),Cast::cast(value),(*ppoDst)->asImg()); break; void Arithmetic::AddC (const ImgBase *poSrc, const icl64f value, ImgBase **ppoDst) { // {{{ open if (!Filter::prepare (ppoDst, poSrc)) return; switch (poSrc->getDepth()) { ICL_INSTANTIATE_ALL_DEPTHS default: ICL_INVALID_FORMAT; break; }; } #undef ICL_INSTANTIATE_DEPTH // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: SubC(poSrc->asImg(),Cast::cast(value),(*ppoDst)->asImg()); break; void Arithmetic::SubC (const ImgBase *poSrc, const icl32f value, ImgBase **ppoDst) { // {{{ open if (!Filter::prepare (ppoDst, poSrc)) return; switch (poSrc->getDepth()) { ICL_INSTANTIATE_ALL_DEPTHS default: ICL_INVALID_FORMAT; break; }; } #undef ICL_INSTANTIATE_DEPTH // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: MulC(poSrc->asImg(),Cast::cast(value),(*ppoDst)->asImg()); break; void Arithmetic::MulC (const ImgBase *poSrc, const icl32f value, ImgBase **ppoDst) { // {{{ open if (!Filter::prepare (ppoDst, poSrc)) return; switch (poSrc->getDepth()) { ICL_INSTANTIATE_ALL_DEPTHS default: ICL_INVALID_FORMAT; break; }; } #undef ICL_INSTANTIATE_DEPTH // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: DivC(poSrc->asImg(),Cast::cast(value),(*ppoDst)->asImg()); break; void Arithmetic::DivC (const ImgBase *poSrc, const icl32f value, ImgBase **ppoDst) { // {{{ open if (!Filter::prepare (ppoDst, poSrc)) return; switch (poSrc->getDepth()) { ICL_INSTANTIATE_ALL_DEPTHS default: ICL_INVALID_FORMAT; break; }; } #undef ICL_INSTANTIATE_DEPTH // }}} void Arithmetic::MulScale (const ImgBase *poSrc1, const ImgBase *poSrc2, ImgBase **ppoDst) { // {{{ open ICLASSERT_RETURN( poSrc1->getDepth() == depth8u); if (!Filter::prepare (ppoDst, poSrc1)) return; MulScale(poSrc1->asImg(),poSrc2->asImg(),(*ppoDst)->asImg()); } // }}} void Arithmetic::MulCScale (const ImgBase *poSrc, const icl32f value, ImgBase **ppoDst) { // {{{ open ICLASSERT_RETURN( poSrc->getDepth() == depth8u); if (!Filter::prepare (ppoDst, poSrc)) return; MulCScale(poSrc->asImg(),Cast::cast(value),(*ppoDst)->asImg()); } // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: Sqr(poSrc->asImg(),(*ppoDst)->asImg()); break; void Arithmetic::Sqr (const ImgBase *poSrc, ImgBase **ppoDst) { // {{{ open if (!Filter::prepare (ppoDst, poSrc)) return; switch (poSrc->getDepth()) { ICL_INSTANTIATE_ALL_DEPTHS default: ICL_INVALID_FORMAT; break; }; } #undef ICL_INSTANTIATE_DEPTH // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: Sqrt(poSrc->asImg(),(*ppoDst)->asImg()); break; void Arithmetic::Sqrt (const ImgBase *poSrc, ImgBase **ppoDst) { // {{{ open if (!Filter::prepare (ppoDst, poSrc)) return; switch (poSrc->getDepth()) { ICL_INSTANTIATE_ALL_DEPTHS default: ICL_INVALID_FORMAT; break; } } #undef ICL_INSTANTIATE_DEPTH // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: Exp(poSrc->asImg(),(*ppoDst)->asImg()); break; void Arithmetic::Exp (const ImgBase *poSrc, ImgBase **ppoDst) { // {{{ open if (!Filter::prepare (ppoDst, poSrc)) return; switch (poSrc->getDepth()) { ICL_INSTANTIATE_ALL_DEPTHS default: ICL_INVALID_FORMAT; break; } } #undef ICL_INSTANTIATE_DEPTH // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: Ln(poSrc->asImg(),(*ppoDst)->asImg()); break; void Arithmetic::Ln (const ImgBase *poSrc, ImgBase **ppoDst) { // {{{ open if (!Filter::prepare (ppoDst, poSrc)) return; switch (poSrc->getDepth()) { ICL_INSTANTIATE_ALL_DEPTHS default: ICL_INVALID_FORMAT; break; } } #undef ICL_INSTANTIATE_DEPTH // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: Abs(poSrc->asImg(),(*ppoDst)->asImg()); break; void Arithmetic::Abs (const ImgBase *poSrc, ImgBase **ppoDst) { // {{{ open if (!Filter::prepare (ppoDst, poSrc)) return; switch (poSrc->getDepth()) { ICL_INSTANTIATE_DEPTH(16s) ICL_INSTANTIATE_DEPTH(32s) ICL_INSTANTIATE_DEPTH(32f) ICL_INSTANTIATE_DEPTH(64f) default: ICL_INVALID_FORMAT; break; } } #undef ICL_INSTANTIATE_DEPTH // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: Abs(poSrcDst->asImg()); break; void Arithmetic::Abs (ImgBase *poSrcDst) { // {{{ open ICLASSERT_RETURN( poSrcDst); switch (poSrcDst->getDepth()) { case depth8u: break; //unsigned, nothing to do ICL_INSTANTIATE_DEPTH(16s) ICL_INSTANTIATE_DEPTH(32s) ICL_INSTANTIATE_DEPTH(32f) ICL_INSTANTIATE_DEPTH(64f) default: ICL_INVALID_FORMAT; break; } } #undef ICL_INSTANTIATE_DEPTH // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: AbsDiff(poSrc1->asImg(),poSrc2->asImg(),(*ppoDst)->asImg()); break; void Arithmetic::AbsDiff (const ImgBase *poSrc1, const ImgBase *poSrc2, ImgBase **ppoDst) { // {{{ open if (!Filter::prepare (ppoDst, poSrc1)) return; switch (poSrc1->getDepth()) { ICL_INSTANTIATE_ALL_DEPTHS default: ICL_INVALID_FORMAT; break; }; } #undef ICL_INSTANTIATE_DEPTH // }}} #define ICL_INSTANTIATE_DEPTH(T) \ case depth ## T: AbsDiffC(poSrc->asImg(),Cast::cast(value),(*ppoDst)->asImg()); break; void Arithmetic::AbsDiffC (const ImgBase *poSrc, icl64f value, ImgBase **ppoDst) { // {{{ open if (!Filter::prepare (ppoDst, poSrc)) return; switch (poSrc->getDepth()) { ICL_INSTANTIATE_ALL_DEPTHS default: ICL_INVALID_FORMAT; break; }; } #undef ICL_INSTANTIATE_DEPTH // }}} } // }}}