added macro with ability of returning values
authorIlya Lavrenov <ilya.lavrenov@itseez.com>
Mon, 27 Jan 2014 08:32:26 +0000 (12:32 +0400)
committerIlya Lavrenov <ilya.lavrenov@itseez.com>
Mon, 27 Jan 2014 08:32:26 +0000 (12:32 +0400)
modules/core/include/opencv2/core/opencl/ocl_defs.hpp
modules/core/src/stat.cpp

index 6a4fd99..7a8aed4 100644 (file)
@@ -8,13 +8,13 @@
 #ifdef HAVE_OPENCL
 
 #ifdef CV_OPENCL_RUN_VERBOSE
-#define CV_OCL_RUN(condition, func)                                         \
+#define CV_OCL_RUN_(condition, func, ...)                                   \
     {                                                                       \
         if (cv::ocl::useOpenCL() && (condition) && func)                    \
         {                                                                   \
             printf("%s: OpenCL implementation is running\n", CV_Func);      \
             fflush(stdout);                                                 \
-            return;                                                         \
+            return __VA_ARGS__;                                             \
         }                                                                   \
         else                                                                \
         {                                                                   \
         }                                                                   \
     }
 #else
-#define CV_OCL_RUN(condition, func)                                         \
+#define CV_OCL_RUN_(condition, func, ...)                                   \
     if (cv::ocl::useOpenCL() && (condition) && func)                        \
-        return;
+        return __VA_ARGS__;
 #endif
 
 #else
-#define CV_OCL_RUN(condition, func)
+#define CV_OCL_RUN_(condition, func, retval)
 #endif
+
+#define CV_OCL_RUN(condition, func) CV_OCL_RUN_(condition, func)
index 4484bd5..63970c5 100644 (file)
@@ -475,7 +475,7 @@ static bool ocl_sum( InputArray _src, Scalar & res, int sum_op, InputArray _mask
     int type = _src.type(), depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type);
     bool doubleSupport = ocl::Device::getDefault().doubleFPConfig() > 0;
 
-    if ( (!doubleSupport && depth == CV_64F) || cn > 4 || cn == 3 || _src.dims() > 2 )
+    if ( (!doubleSupport && depth == CV_64F) || cn > 4 || cn == 3 )
         return false;
 
     int dbsize = ocl::Device::getDefault().maxComputeUnits();
@@ -533,8 +533,9 @@ cv::Scalar cv::sum( InputArray _src )
 {
 #ifdef HAVE_OPENCL
     Scalar _res;
-    if (ocl::useOpenCL() && _src.isUMat() && ocl_sum(_src, _res, OCL_OP_SUM))
-        return _res;
+    CV_OCL_RUN_( _src.isUMat() && _src.dims() <= 2,
+                 ocl_sum(_src, _res, OCL_OP_SUM),
+                 _res)
 #endif
 
     Mat src = _src.getMat();
@@ -674,8 +675,9 @@ int cv::countNonZero( InputArray _src )
 
 #ifdef HAVE_OPENCL
     int res = -1;
-    if (ocl::useOpenCL() && _src.isUMat() && ocl_countNonZero(_src, res))
-        return res;
+    CV_OCL_RUN_(_src.isUMat() && _src.dims() <= 2,
+                ocl_countNonZero(_src, res),
+                res)
 #endif
 
     Mat src = _src.getMat();
@@ -1985,8 +1987,9 @@ double cv::norm( InputArray _src, int normType, InputArray _mask )
 
 #ifdef HAVE_OPENCL
     double _result = 0;
-    if (ocl::useOpenCL() && _src.isUMat() && _src.dims() <= 2 && ocl_norm(_src, normType, _mask, _result))
-        return _result;
+    CV_OCL_RUN_(_src.isUMat() && _src.dims() <= 2,
+                ocl_norm(_src, normType, _mask, _result),
+                _result)
 #endif
 
     Mat src = _src.getMat(), mask = _mask.getMat();
@@ -2320,9 +2323,10 @@ double cv::norm( InputArray _src1, InputArray _src2, int normType, InputArray _m
 
 #ifdef HAVE_OPENCL
     double _result = 0;
-    if (ocl::useOpenCL() && _mask.empty() && _src1.isUMat() && _src2.isUMat() &&
-            _src1.dims() <= 2 && _src2.dims() <= 2 && ocl_norm(_src1, _src2, normType, _result))
-        return _result;
+    CV_OCL_RUN_(_mask.empty() && _src1.isUMat() && _src2.isUMat() &&
+                _src1.dims() <= 2 && _src2.dims() <= 2,
+                ocl_norm(_src1, _src2, normType, _result),
+                _result)
 #endif
 
     if( normType & CV_RELATIVE )