result;
result.d = 0;
NAryMatIterator it(arrays, ptrs);
- int j, total = (int)it.size, blockSize = total, intSumBlockSize = 0, count = 0;
- bool blockSum = (normType == NORM_L1 && depth <= CV_16S) ||
- ((normType == NORM_L2 || normType == NORM_L2SQR) && depth <= CV_8S);
- int isum = 0;
- int *ibuf = &result.i;
- size_t esz = 0;
-
- if( blockSum )
- {
- intSumBlockSize = (normType == NORM_L1 && depth <= CV_8S ? (1 << 23) : (1 << 15))/cn;
- blockSize = std::min(blockSize, intSumBlockSize);
- ibuf = &isum;
- esz = src.elemSize();
- }
+ CV_CheckLT((size_t)it.size, (size_t)INT_MAX, "");
- for( size_t i = 0; i < it.nplanes; i++, ++it )
+ if ((normType == NORM_L1 && depth <= CV_16S) ||
+ ((normType == NORM_L2 || normType == NORM_L2SQR) && depth <= CV_8S))
{
- for( j = 0; j < total; j += blockSize )
+ // special case to handle "integer" overflow in accumulator
+ const size_t esz = src.elemSize();
+ const int total = (int)it.size;
+ const int intSumBlockSize = (normType == NORM_L1 && depth <= CV_8S ? (1 << 23) : (1 << 15))/cn;
+ const int blockSize = std::min(total, intSumBlockSize);
+ int isum = 0;
+ int count = 0;
+
+ for (size_t i = 0; i < it.nplanes; i++, ++it)
{
- int bsz = std::min(total - j, blockSize);
- func( ptrs[0], ptrs[1], (uchar*)ibuf, bsz, cn );
- count += bsz;
- if( blockSum && (count + blockSize >= intSumBlockSize || (i+1 >= it.nplanes && j+bsz >= total)) )
+ for (int j = 0; j < total; j += blockSize)
{
- result.d += isum;
- isum = 0;
- count = 0;
+ int bsz = std::min(total - j, blockSize);
+ func(ptrs[0], ptrs[1], (uchar*)&isum, bsz, cn);
+ count += bsz;
+ if (count + blockSize >= intSumBlockSize || (i+1 >= it.nplanes && j+bsz >= total))
+ {
+ result.d += isum;
+ isum = 0;
+ count = 0;
+ }
+ ptrs[0] += bsz*esz;
+ if (ptrs[1])
+ ptrs[1] += bsz;
}
- ptrs[0] += bsz*esz;
- if( ptrs[1] )
- ptrs[1] += bsz;
+ }
+ }
+ else
+ {
+ // generic implementation
+ for (size_t i = 0; i < it.nplanes; i++, ++it)
+ {
+ func(ptrs[0], ptrs[1], (uchar*)&result, (int)it.size, cn);
}
}
if( normType == NORM_INF )
{
if( depth == CV_64F )
- ;
+ return result.d;
else if( depth == CV_32F )
- result.d = result.f;
+ return result.f;
else
- result.d = result.i;
+ return result.i;
}
else if( normType == NORM_L2 )
- result.d = std::sqrt(result.d);
+ return std::sqrt(result.d);
return result.d;
}
result;
result.d = 0;
NAryMatIterator it(arrays, ptrs);
- int j, total = (int)it.size, blockSize = total, intSumBlockSize = 0, count = 0;
- bool blockSum = (normType == NORM_L1 && depth <= CV_16S) ||
- ((normType == NORM_L2 || normType == NORM_L2SQR) && depth <= CV_8S);
- unsigned isum = 0;
- unsigned *ibuf = &result.u;
- size_t esz = 0;
-
- if( blockSum )
- {
- intSumBlockSize = normType == NORM_L1 && depth <= CV_8S ? (1 << 23) : (1 << 15);
- blockSize = std::min(blockSize, intSumBlockSize);
- ibuf = &isum;
- esz = src1.elemSize();
- }
+ CV_CheckLT((size_t)it.size, (size_t)INT_MAX, "");
- for( size_t i = 0; i < it.nplanes; i++, ++it )
+ if ((normType == NORM_L1 && depth <= CV_16S) ||
+ ((normType == NORM_L2 || normType == NORM_L2SQR) && depth <= CV_8S))
{
- for( j = 0; j < total; j += blockSize )
+ // special case to handle "integer" overflow in accumulator
+ const size_t esz = src1.elemSize();
+ const int total = (int)it.size;
+ const int intSumBlockSize = normType == NORM_L1 && depth <= CV_8S ? (1 << 23) : (1 << 15);
+ const int blockSize = std::min(total, intSumBlockSize);
+ int isum = 0;
+ int count = 0;
+
+ for (size_t i = 0; i < it.nplanes; i++, ++it)
{
- int bsz = std::min(total - j, blockSize);
- func( ptrs[0], ptrs[1], ptrs[2], (uchar*)ibuf, bsz, cn );
- count += bsz;
- if( blockSum && (count + blockSize >= intSumBlockSize || (i+1 >= it.nplanes && j+bsz >= total)) )
+ for (int j = 0; j < total; j += blockSize)
{
- result.d += isum;
- isum = 0;
- count = 0;
+ int bsz = std::min(total - j, blockSize);
+ func(ptrs[0], ptrs[1], ptrs[2], (uchar*)&isum, bsz, cn);
+ count += bsz;
+ if (count + blockSize >= intSumBlockSize || (i+1 >= it.nplanes && j+bsz >= total))
+ {
+ result.d += isum;
+ isum = 0;
+ count = 0;
+ }
+ ptrs[0] += bsz*esz;
+ ptrs[1] += bsz*esz;
+ if (ptrs[2])
+ ptrs[2] += bsz;
}
- ptrs[0] += bsz*esz;
- ptrs[1] += bsz*esz;
- if( ptrs[2] )
- ptrs[2] += bsz;
+ }
+ }
+ else
+ {
+ // generic implementation
+ for (size_t i = 0; i < it.nplanes; i++, ++it)
+ {
+ func(ptrs[0], ptrs[1], ptrs[2], (uchar*)&result, (int)it.size, cn);
}
}
if( normType == NORM_INF )
{
if( depth == CV_64F )
- ;
+ return result.d;
else if( depth == CV_32F )
- result.d = result.f;
+ return result.f;
else
- result.d = result.u;
+ return result.u;
}
else if( normType == NORM_L2 )
- result.d = std::sqrt(result.d);
+ return std::sqrt(result.d);
return result.d;
}