Skip to content

Commit 2c1b4f5

Browse files
committed
Merge pull request opencv#9795 from IgWod:refactor-scalar-to-raw-data
2 parents d25ee8a + ffb9554 commit 2c1b4f5

File tree

1 file changed

+17
-50
lines changed

1 file changed

+17
-50
lines changed

modules/core/src/matrix.cpp

Lines changed: 17 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,78 +1140,45 @@ int Mat::checkVector(int _elemChannels, int _depth, bool _requireContinuous) con
11401140
? (int)(total()*channels()/_elemChannels) : -1;
11411141
}
11421142

1143+
template <typename T> static inline
1144+
void scalarToRawData(const Scalar& s, T * const buf, const int cn, const int unroll_to)
1145+
{
1146+
int i = 0;
1147+
for(; i < cn; i++)
1148+
buf[i] = saturate_cast<T>(s.val[i]);
1149+
for(; i < unroll_to; i++)
1150+
buf[i] = buf[i-cn];
1151+
}
11431152

11441153
void scalarToRawData(const Scalar& s, void* _buf, int type, int unroll_to)
11451154
{
11461155
CV_INSTRUMENT_REGION()
11471156

1148-
int i, depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type);
1157+
const int depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type);
11491158
CV_Assert(cn <= 4);
11501159
switch(depth)
11511160
{
11521161
case CV_8U:
1153-
{
1154-
uchar* buf = (uchar*)_buf;
1155-
for(i = 0; i < cn; i++)
1156-
buf[i] = saturate_cast<uchar>(s.val[i]);
1157-
for(; i < unroll_to; i++)
1158-
buf[i] = buf[i-cn];
1159-
}
1162+
scalarToRawData<uchar>(s, (uchar*)_buf, cn, unroll_to);
11601163
break;
11611164
case CV_8S:
1162-
{
1163-
schar* buf = (schar*)_buf;
1164-
for(i = 0; i < cn; i++)
1165-
buf[i] = saturate_cast<schar>(s.val[i]);
1166-
for(; i < unroll_to; i++)
1167-
buf[i] = buf[i-cn];
1168-
}
1165+
scalarToRawData<schar>(s, (schar*)_buf, cn, unroll_to);
11691166
break;
11701167
case CV_16U:
1171-
{
1172-
ushort* buf = (ushort*)_buf;
1173-
for(i = 0; i < cn; i++)
1174-
buf[i] = saturate_cast<ushort>(s.val[i]);
1175-
for(; i < unroll_to; i++)
1176-
buf[i] = buf[i-cn];
1177-
}
1168+
scalarToRawData<ushort>(s, (ushort*)_buf, cn, unroll_to);
11781169
break;
11791170
case CV_16S:
1180-
{
1181-
short* buf = (short*)_buf;
1182-
for(i = 0; i < cn; i++)
1183-
buf[i] = saturate_cast<short>(s.val[i]);
1184-
for(; i < unroll_to; i++)
1185-
buf[i] = buf[i-cn];
1186-
}
1171+
scalarToRawData<short>(s, (short*)_buf, cn, unroll_to);
11871172
break;
11881173
case CV_32S:
1189-
{
1190-
int* buf = (int*)_buf;
1191-
for(i = 0; i < cn; i++)
1192-
buf[i] = saturate_cast<int>(s.val[i]);
1193-
for(; i < unroll_to; i++)
1194-
buf[i] = buf[i-cn];
1195-
}
1174+
scalarToRawData<int>(s, (int*)_buf, cn, unroll_to);
11961175
break;
11971176
case CV_32F:
1198-
{
1199-
float* buf = (float*)_buf;
1200-
for(i = 0; i < cn; i++)
1201-
buf[i] = saturate_cast<float>(s.val[i]);
1202-
for(; i < unroll_to; i++)
1203-
buf[i] = buf[i-cn];
1204-
}
1177+
scalarToRawData<float>(s, (float*)_buf, cn, unroll_to);
12051178
break;
12061179
case CV_64F:
1207-
{
1208-
double* buf = (double*)_buf;
1209-
for(i = 0; i < cn; i++)
1210-
buf[i] = saturate_cast<double>(s.val[i]);
1211-
for(; i < unroll_to; i++)
1212-
buf[i] = buf[i-cn];
1180+
scalarToRawData<double>(s, (double*)_buf, cn, unroll_to);
12131181
break;
1214-
}
12151182
default:
12161183
CV_Error(CV_StsUnsupportedFormat,"");
12171184
}

0 commit comments

Comments
 (0)