spatialGradient: Remove pointers caching
authorSeon-Wook Park <seon.wook@swook.net>
Tue, 30 Jun 2015 01:51:10 +0000 (10:51 +0900)
committerSeon-Wook Park <seon.wook@swook.net>
Tue, 30 Jun 2015 01:51:10 +0000 (10:51 +0900)
modules/imgproc/src/spatialgradient.cpp

index 178e20c..c00ec1d 100644 (file)
@@ -102,12 +102,7 @@ void spatialGradient( InputArray _src, OutputArray _dx, OutputArray _dy,
     int i = 0,
         j = 0;
 
-    // Store pointers to rows of input/output data
-    // Padded by two rows for border handling
-    std::vector<uchar*> P_src(H+2);
-    std::vector<short*> P_dx (H+2);
-    std::vector<short*> P_dy (H+2);
-
+    // Handle border types
     int i_top    = 0,     // Case for H == 1 && W == 1 && BORDER_REPLICATE
         i_bottom = H - 1,
         j_offl   = 0,     // j offset from 0th   pixel to reach -1st pixel
@@ -127,16 +122,6 @@ void spatialGradient( InputArray _src, OutputArray _dx, OutputArray _dy,
         }
     }
 
-    P_src[0]   = src.ptr<uchar>(i_top); // Mirrored top border
-    P_src[H+1] = src.ptr<uchar>(i_bottom); // Mirrored bottom border
-
-    for ( i = 0; i < H; i++ )
-    {
-        P_src[i+1] = src.ptr<uchar>(i);
-        P_dx [i]   =  dx.ptr<short>(i);
-        P_dy [i]   =  dy.ptr<short>(i);
-    }
-
     // Pointer to row vectors
     uchar *p_src, *c_src, *n_src; // previous, current, next row
     short *c_dx,  *c_dy;
@@ -158,8 +143,19 @@ void spatialGradient( InputArray _src, OutputArray _dx, OutputArray _dy,
     // Example: umn is offset -1 in row and offset 0 in column
     for ( i = 0; i < H - 1; i += 2 )
     {
-        p_src = P_src[i]; c_src = P_src[i+1]; n_src = P_src[i+2]; m_src = P_src[i+3];
-        c_dx = P_dx[i]; c_dy = P_dy[i]; n_dx = P_dx[i+1]; n_dy = P_dy[i+1];
+        if   ( i == 0 ) p_src = src.ptr<uchar>(i_top);
+        else            p_src = src.ptr<uchar>(i-1);
+
+        c_src = src.ptr<uchar>(i);
+        n_src = src.ptr<uchar>(i+1);
+
+        if ( i == H - 2 ) m_src = src.ptr<uchar>(i_bottom);
+        else              m_src = src.ptr<uchar>(i+2);
+
+        c_dx = dx.ptr<short>(i);
+        c_dy = dy.ptr<short>(i);
+        n_dx = dx.ptr<short>(i+1);
+        n_dy = dy.ptr<short>(i+1);
 
         // Process rest of columns 16-column chunks at a time
         for ( j = 1; j < W - 16; j += 16 )
@@ -266,9 +262,16 @@ void spatialGradient( InputArray _src, OutputArray _dx, OutputArray _dy,
     uchar v00, v01, v02, v10, v11, v12, v20, v21, v22;
     for ( i = 0; i < H; i++ )
     {
-        p_src = P_src[i]; c_src = P_src[i+1]; n_src = P_src[i+2];
-        c_dx  = P_dx [i];
-        c_dy  = P_dy [i];
+        if   ( i == 0 ) p_src = src.ptr<uchar>(i_top);
+        else            p_src = src.ptr<uchar>(i-1);
+
+        c_src = src.ptr<uchar>(i);
+
+        if ( i == H - 1 ) n_src = src.ptr<uchar>(i_bottom);
+        else              n_src = src.ptr<uchar>(i+1);
+
+        c_dx = dx.ptr<short>(i);
+        c_dy = dy.ptr<short>(i);
 
         // Process left-most column
         j = 0;