Mat& Mat::operator = (const Scalar& s) { const Mat* arrays[] = { this }; uchar* ptr; NAryMatIterator it(arrays, &ptr, 1); size_t size = it.size*elemSize(); if( s[0] == 0 && s[1] == 0 && s[2] == 0 && s[3] == 0 ) { for( size_t i = 0; i < it.nplanes; i++, ++it ) memset( ptr, 0, size ); } else { if( it.nplanes > 0 ) { double scalar[12]; scalarToRawData(s, scalar, type(), 12); size_t blockSize = 12*elemSize1(); for( size_t j = 0; j < size; j += blockSize ) { size_t sz = MIN(blockSize, size - j); memcpy( ptr + j, scalar, sz ); } } for( size_t i = 1; i < it.nplanes; i++ ) { ++it; memcpy( ptr, data, size ); } } return *this; }
template<class Op> static void binarySOpCn_( const Mat& srcmat, Mat& dstmat, const Scalar& _scalar ) { Op op; typedef typename Op::type1 T; typedef typename Op::type2 WT; typedef typename Op::rtype DT; const T* src0 = (const T*)srcmat.data; DT* dst0 = (DT*)dstmat.data; size_t step1 = srcmat.step/sizeof(src0[0]); size_t step = dstmat.step/sizeof(dst0[0]); int cn = dstmat.channels(); Size size = getContinuousSize( srcmat, dstmat, cn ); WT scalar[12]; scalarToRawData(_scalar, scalar, CV_MAKETYPE(DataType<WT>::depth,cn), 12); for( ; size.height--; src0 += step1, dst0 += step ) { int i, len = size.width; const T* src = src0; T* dst = dst0; for( ; (len -= 12) >= 0; dst += 12, src += 12 ) { DT t0 = op(src[0], scalar[0]); DT t1 = op(src[1], scalar[1]); dst[0] = t0; dst[1] = t1; t0 = op(src[2], scalar[2]); t1 = op(src[3], scalar[3]); dst[2] = t0; dst[3] = t1; t0 = op(src[4], scalar[4]); t1 = op(src[5], scalar[5]); dst[4] = t0; dst[5] = t1; t0 = op(src[6], scalar[6]); t1 = op(src[7], scalar[7]); dst[6] = t0; dst[7] = t1; t0 = op(src[8], scalar[8]); t1 = op(src[9], scalar[9]); dst[8] = t0; dst[9] = t1; t0 = op(src[10], scalar[10]); t1 = op(src[11], scalar[11]); dst[10] = t0; dst[11] = t1; } for( (len) += 12, i = 0; i < (len); i++ ) dst[i] = op((WT)src[i], scalar[i]); } }
Mat& Mat::setTo(const Scalar& s, const Mat& mask) { if( !mask.data ) *this = s; else { CV_Assert( channels() <= 4 ); SetMaskFunc func = setMaskFuncTab[elemSize()]; CV_Assert( func != 0 ); double buf[4]; scalarToRawData(s, buf, type(), 0); func(buf, *this, mask); } return *this; }
Mat& Mat::operator = (const Scalar& s) { Size sz = size(); uchar* dst = data; sz.width *= (int)elemSize(); if( isContinuous() ) { sz.width *= sz.height; sz.height = 1; } if( s[0] == 0 && s[1] == 0 && s[2] == 0 && s[3] == 0 ) { for( ; sz.height--; dst += step ) memset( dst, 0, sz.width ); } else { int t = type(), esz1 = (int)elemSize1(); double scalar[12]; scalarToRawData(s, scalar, t, 12); int copy_len = 12*esz1; uchar* dst_limit = dst + sz.width; if( sz.height-- ) { while( dst + copy_len <= dst_limit ) { memcpy( dst, scalar, copy_len ); dst += copy_len; } memcpy( dst, scalar, dst_limit - dst ); } if( sz.height ) { dst = dst_limit - sz.width + step; for( ; sz.height--; dst += step ) memcpy( dst, data, sz.width ); } } return *this; }