From 677c7f27cb15c71105bd1336ba65353d63c7505c Mon Sep 17 00:00:00 2001
From: Vadim Pisarevsky <vadim.pisarevsky@gmail.com>
Date: Tue, 19 Nov 2013 19:20:24 -0500
Subject: [PATCH] fixed failure in Tonemap test

---
 modules/core/src/arithm.cpp     |  1 +
 modules/core/src/ocl.cpp        |  4 ++--
 modules/core/src/precomp.hpp    |  2 --
 modules/core/src/umatrix.cpp    |  1 +
 modules/imgproc/src/color.cpp   |  1 +
 modules/imgproc/src/imgwarp.cpp | 20 ++++++++++++--------
 modules/imgproc/src/precomp.hpp |  1 -
 7 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/modules/core/src/arithm.cpp b/modules/core/src/arithm.cpp
index a21a1ccbc..a2b8a9edd 100644
--- a/modules/core/src/arithm.cpp
+++ b/modules/core/src/arithm.cpp
@@ -47,6 +47,7 @@
 // */
 
 #include "precomp.hpp"
+#include "opencl_kernels.hpp"
 
 namespace cv
 {
diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp
index 35927608d..b2181df53 100644
--- a/modules/core/src/ocl.cpp
+++ b/modules/core/src/ocl.cpp
@@ -3038,7 +3038,7 @@ const char* typeToStr(int t)
         "?", "?", "?", "?"
     };
     int cn = CV_MAT_CN(t);
-    return cn >= 4 ? "?" : tab[CV_MAT_DEPTH(t)*4 + cn-1];
+    return cn > 4 ? "?" : tab[CV_MAT_DEPTH(t)*4 + cn-1];
 }
 
 const char* memopTypeToStr(int t)
@@ -3055,7 +3055,7 @@ const char* memopTypeToStr(int t)
         "?", "?", "?", "?"
     };
     int cn = CV_MAT_CN(t);
-    return cn >= 4 ? "?" : tab[CV_MAT_DEPTH(t)*4 + cn-1];
+    return cn > 4 ? "?" : tab[CV_MAT_DEPTH(t)*4 + cn-1];
 }
 
 const char* convertTypeStr(int sdepth, int ddepth, int cn, char* buf)
diff --git a/modules/core/src/precomp.hpp b/modules/core/src/precomp.hpp
index faffb9a9d..7465685fd 100644
--- a/modules/core/src/precomp.hpp
+++ b/modules/core/src/precomp.hpp
@@ -67,8 +67,6 @@
 #define GET_OPTIMIZED(func) (func)
 #endif
 
-#include "opencl_kernels.hpp"
-
 namespace cv
 {
 
diff --git a/modules/core/src/umatrix.cpp b/modules/core/src/umatrix.cpp
index 9a5772fcd..2b659fb0a 100644
--- a/modules/core/src/umatrix.cpp
+++ b/modules/core/src/umatrix.cpp
@@ -41,6 +41,7 @@
 //M*/
 
 #include "precomp.hpp"
+#include "opencl_kernels.hpp"
 
 ///////////////////////////////// UMat implementation ///////////////////////////////
 
diff --git a/modules/imgproc/src/color.cpp b/modules/imgproc/src/color.cpp
index f3a9b5226..0d0cf8230 100644
--- a/modules/imgproc/src/color.cpp
+++ b/modules/imgproc/src/color.cpp
@@ -90,6 +90,7 @@
 \**********************************************************************************/
 
 #include "precomp.hpp"
+#include "opencl_kernels.hpp"
 #include <limits>
 
 #define  CV_DESCALE(x,n)     (((x) + (1 << ((n)-1))) >> (n))
diff --git a/modules/imgproc/src/imgwarp.cpp b/modules/imgproc/src/imgwarp.cpp
index 161b3332a..ab134fd3c 100644
--- a/modules/imgproc/src/imgwarp.cpp
+++ b/modules/imgproc/src/imgwarp.cpp
@@ -47,6 +47,7 @@
 // */
 
 #include "precomp.hpp"
+#include "opencl_kernels.hpp"
 #include <iostream>
 #include <vector>
 
@@ -1901,7 +1902,7 @@ private:
 };
 #endif
 
-static bool ocl_resize( InputArray _src, OutputArray _dst,
+static bool ocl_resize( InputArray _src, OutputArray _dst, Size dsize,
                         double fx, double fy, int interpolation)
 {
     int type = _src.type(), depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type);
@@ -1909,7 +1910,9 @@ static bool ocl_resize( InputArray _src, OutputArray _dst,
            (interpolation == INTER_NEAREST ||
            (interpolation == INTER_LINEAR && (depth == CV_8U || depth == CV_32F)))) )
         return false;
-    UMat src = _src.getUMat(), dst = _dst.getUMat();
+    UMat src = _src.getUMat();
+    _dst.create(dsize, type);
+    UMat dst = _dst.getUMat();
     ocl::Kernel k;
 
     if (interpolation == INTER_LINEAR)
@@ -2051,25 +2054,26 @@ void cv::resize( InputArray _src, OutputArray _dst, Size dsize,
     Size ssize = _src.size();
 
     CV_Assert( ssize.area() > 0 );
-    CV_Assert( dsize.area() || (inv_scale_x > 0 && inv_scale_y > 0) );
-    if( !dsize.area() )
+    CV_Assert( dsize.area() > 0 || (inv_scale_x > 0 && inv_scale_y > 0) );
+    if( dsize.area() == 0 )
     {
         dsize = Size(saturate_cast<int>(ssize.width*inv_scale_x),
                      saturate_cast<int>(ssize.height*inv_scale_y));
-        CV_Assert( dsize.area() );
+        CV_Assert( dsize.area() > 0 );
     }
     else
     {
         inv_scale_x = (double)dsize.width/ssize.width;
         inv_scale_y = (double)dsize.height/ssize.height;
     }
-    _dst.create(dsize, _src.type());
 
     if( ocl::useOpenCL() && _dst.kind() == _InputArray::UMAT &&
-        ocl_resize(_src, _dst, inv_scale_x, inv_scale_y, interpolation) )
+        ocl_resize(_src, _dst, dsize, inv_scale_x, inv_scale_y, interpolation) )
         return;
 
-    Mat src = _src.getMat(), dst = _dst.getMat();
+    Mat src = _src.getMat();
+    _dst.create(dsize, src.type());
+    Mat dst = _dst.getMat();
 
 #ifdef HAVE_TEGRA_OPTIMIZATION
     if (tegra::resize(src, dst, (float)inv_scale_x, (float)inv_scale_y, interpolation))
diff --git a/modules/imgproc/src/precomp.hpp b/modules/imgproc/src/precomp.hpp
index b806eda50..9fa244109 100644
--- a/modules/imgproc/src/precomp.hpp
+++ b/modules/imgproc/src/precomp.hpp
@@ -49,7 +49,6 @@
 #include "opencv2/imgproc/imgproc_c.h"
 #include "opencv2/core/private.hpp"
 #include "opencv2/core/ocl.hpp"
-#include "opencl_kernels.hpp"
 
 #include <math.h>
 #include <assert.h>