Skip to content

Commit

Permalink
spatialGradient: Remove pointers caching
Browse files Browse the repository at this point in the history
  • Loading branch information
swook committed Jun 30, 2015
1 parent cf0fdfa commit 5dddb47
Showing 1 changed file with 24 additions and 21 deletions.
45 changes: 24 additions & 21 deletions modules/imgproc/src/spatialgradient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand All @@ -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 )
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 5dddb47

Please sign in to comment.