Merge pull request #9795 from IgWod:refactor-scalar-to-raw-data

pull/9798/merge
Alexander Alekhin 7 years ago
commit 2c1b4f5711
  1. 67
      modules/core/src/matrix.cpp

@ -1140,78 +1140,45 @@ int Mat::checkVector(int _elemChannels, int _depth, bool _requireContinuous) con
? (int)(total()*channels()/_elemChannels) : -1; ? (int)(total()*channels()/_elemChannels) : -1;
} }
template <typename T> 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<T>(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) void scalarToRawData(const Scalar& s, void* _buf, int type, int unroll_to)
{ {
CV_INSTRUMENT_REGION() 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); CV_Assert(cn <= 4);
switch(depth) switch(depth)
{ {
case CV_8U: case CV_8U:
{ scalarToRawData<uchar>(s, (uchar*)_buf, cn, unroll_to);
uchar* buf = (uchar*)_buf;
for(i = 0; i < cn; i++)
buf[i] = saturate_cast<uchar>(s.val[i]);
for(; i < unroll_to; i++)
buf[i] = buf[i-cn];
}
break; break;
case CV_8S: case CV_8S:
{ scalarToRawData<schar>(s, (schar*)_buf, cn, unroll_to);
schar* buf = (schar*)_buf;
for(i = 0; i < cn; i++)
buf[i] = saturate_cast<schar>(s.val[i]);
for(; i < unroll_to; i++)
buf[i] = buf[i-cn];
}
break; break;
case CV_16U: case CV_16U:
{ scalarToRawData<ushort>(s, (ushort*)_buf, cn, unroll_to);
ushort* buf = (ushort*)_buf;
for(i = 0; i < cn; i++)
buf[i] = saturate_cast<ushort>(s.val[i]);
for(; i < unroll_to; i++)
buf[i] = buf[i-cn];
}
break; break;
case CV_16S: case CV_16S:
{ scalarToRawData<short>(s, (short*)_buf, cn, unroll_to);
short* buf = (short*)_buf;
for(i = 0; i < cn; i++)
buf[i] = saturate_cast<short>(s.val[i]);
for(; i < unroll_to; i++)
buf[i] = buf[i-cn];
}
break; break;
case CV_32S: case CV_32S:
{ scalarToRawData<int>(s, (int*)_buf, cn, unroll_to);
int* buf = (int*)_buf;
for(i = 0; i < cn; i++)
buf[i] = saturate_cast<int>(s.val[i]);
for(; i < unroll_to; i++)
buf[i] = buf[i-cn];
}
break; break;
case CV_32F: case CV_32F:
{ scalarToRawData<float>(s, (float*)_buf, cn, unroll_to);
float* buf = (float*)_buf;
for(i = 0; i < cn; i++)
buf[i] = saturate_cast<float>(s.val[i]);
for(; i < unroll_to; i++)
buf[i] = buf[i-cn];
}
break; break;
case CV_64F: case CV_64F:
{ scalarToRawData<double>(s, (double*)_buf, cn, unroll_to);
double* buf = (double*)_buf;
for(i = 0; i < cn; i++)
buf[i] = saturate_cast<double>(s.val[i]);
for(; i < unroll_to; i++)
buf[i] = buf[i-cn];
break; break;
}
default: default:
CV_Error(CV_StsUnsupportedFormat,""); CV_Error(CV_StsUnsupportedFormat,"");
} }

Loading…
Cancel
Save