fixed UMat::copyTo(UMat)
authorIlya Lavrenov <ilya.lavrenov@itseez.com>
Tue, 17 Dec 2013 10:14:04 +0000 (14:14 +0400)
committerIlya Lavrenov <ilya.lavrenov@itseez.com>
Tue, 17 Dec 2013 11:23:39 +0000 (15:23 +0400)
modules/core/src/matrix.cpp
modules/core/src/umatrix.cpp
modules/core/test/ocl/test_matrix_operation.cpp

index 871fb38..17f8bcd 100644 (file)
@@ -134,11 +134,11 @@ void MatAllocator::copy(UMatData* usrc, UMatData* udst, int dims, const size_t s
     {
         CV_Assert( sz[i] <= (size_t)INT_MAX );
         if( sz[i] == 0 )
-        return;
+            return;
         if( srcofs )
-        srcptr += srcofs[i]*(i <= dims-2 ? srcstep[i] : 1);
+            srcptr += srcofs[i]*(i <= dims-2 ? srcstep[i] : 1);
         if( dstofs )
-        dstptr += dstofs[i]*(i <= dims-2 ? dststep[i] : 1);
+            dstptr += dstofs[i]*(i <= dims-2 ? dststep[i] : 1);
         isz[i] = (int)sz[i];
     }
 
index 1248387..50522bd 100644 (file)
@@ -643,11 +643,10 @@ void UMat::copyTo(OutputArray _dst) const
     if( _dst.kind() == _InputArray::UMAT )
     {
         UMat dst = _dst.getUMat();
-        void* srchandle = handle(ACCESS_READ);
-        void* dsthandle = dst.handle(ACCESS_WRITE);
-        if( srchandle == dsthandle && dst.offset == offset )
+        if( u == dst.u && dst.offset == offset )
             return;
         dst.ndoffset(dstofs);
+        dstofs[dims-1] *= esz;
         CV_Assert(u->currAllocator == dst.u->currAllocator);
         u->currAllocator->copy(u, dst.u, dims, sz, srcofs, step.p, dstofs, dst.step.p, false);
     }
index 599eb06..aabbb3f 100644 (file)
@@ -103,9 +103,27 @@ OCL_TEST_P(ConvertTo, Accuracy)
     }
 }
 
+typedef MatrixTestBase CopyTo;
+
+OCL_TEST_P(CopyTo, Accuracy)
+{
+    for (int j = 0; j < test_loop_times; j++)
+    {
+        generateTestData();
+
+        OCL_OFF(src_roi.copyTo(dst_roi));
+        OCL_ON(usrc_roi.copyTo(udst_roi));
+
+        OCL_EXPECT_MATS_NEAR(dst, 0);
+    }
+}
+
 OCL_INSTANTIATE_TEST_CASE_P(MatrixOperation, ConvertTo, Combine(
                             OCL_ALL_DEPTHS, OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
 
+OCL_INSTANTIATE_TEST_CASE_P(MatrixOperation, CopyTo, Combine(
+                                OCL_ALL_DEPTHS, Values((MatDepth)0), OCL_ALL_CHANNELS, Bool()));
+
 } } // namespace cvtest::ocl
 
 #endif