From ffb9554787192131473b6edc3f9d3eb94fd7e6d0 Mon Sep 17 00:00:00 2001 From: Igor Wodiany Date: Sat, 7 Oct 2017 19:46:45 +0100 Subject: [PATCH] Extract code from scalarToRawData The same code was repeated several time for different data types, so it was extracted as a templated function to improve maintability and make a code more clear. --- modules/core/src/matrix.cpp | 67 ++++++++++++--------------------------------- 1 file changed, 17 insertions(+), 50 deletions(-) diff --git a/modules/core/src/matrix.cpp b/modules/core/src/matrix.cpp index 2a6673d..e2a258f 100644 --- a/modules/core/src/matrix.cpp +++ b/modules/core/src/matrix.cpp @@ -1140,78 +1140,45 @@ int Mat::checkVector(int _elemChannels, int _depth, bool _requireContinuous) con ? (int)(total()*channels()/_elemChannels) : -1; } +template static inline +void scalarToRawData(const Scalar& s, T * const buf, const int cn, const int unroll_to) +{ + int i = 0; + for(; i < cn; i++) + buf[i] = saturate_cast(s.val[i]); + for(; i < unroll_to; i++) + buf[i] = buf[i-cn]; +} void scalarToRawData(const Scalar& s, void* _buf, int type, int unroll_to) { CV_INSTRUMENT_REGION() - int i, depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type); + const int depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type); CV_Assert(cn <= 4); switch(depth) { case CV_8U: - { - uchar* buf = (uchar*)_buf; - for(i = 0; i < cn; i++) - buf[i] = saturate_cast(s.val[i]); - for(; i < unroll_to; i++) - buf[i] = buf[i-cn]; - } + scalarToRawData(s, (uchar*)_buf, cn, unroll_to); break; case CV_8S: - { - schar* buf = (schar*)_buf; - for(i = 0; i < cn; i++) - buf[i] = saturate_cast(s.val[i]); - for(; i < unroll_to; i++) - buf[i] = buf[i-cn]; - } + scalarToRawData(s, (schar*)_buf, cn, unroll_to); break; case CV_16U: - { - ushort* buf = (ushort*)_buf; - for(i = 0; i < cn; i++) - buf[i] = saturate_cast(s.val[i]); - for(; i < unroll_to; i++) - buf[i] = buf[i-cn]; - } + scalarToRawData(s, (ushort*)_buf, cn, unroll_to); break; case CV_16S: - { - short* buf = (short*)_buf; - for(i = 0; i < cn; i++) - buf[i] = saturate_cast(s.val[i]); - for(; i < unroll_to; i++) - buf[i] = buf[i-cn]; - } + scalarToRawData(s, (short*)_buf, cn, unroll_to); break; case CV_32S: - { - int* buf = (int*)_buf; - for(i = 0; i < cn; i++) - buf[i] = saturate_cast(s.val[i]); - for(; i < unroll_to; i++) - buf[i] = buf[i-cn]; - } + scalarToRawData(s, (int*)_buf, cn, unroll_to); break; case CV_32F: - { - float* buf = (float*)_buf; - for(i = 0; i < cn; i++) - buf[i] = saturate_cast(s.val[i]); - for(; i < unroll_to; i++) - buf[i] = buf[i-cn]; - } + scalarToRawData(s, (float*)_buf, cn, unroll_to); break; case CV_64F: - { - double* buf = (double*)_buf; - for(i = 0; i < cn; i++) - buf[i] = saturate_cast(s.val[i]); - for(; i < unroll_to; i++) - buf[i] = buf[i-cn]; + scalarToRawData(s, (double*)_buf, cn, unroll_to); break; - } default: CV_Error(CV_StsUnsupportedFormat,""); } -- 2.7.4