copy.cpp 18 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
/*M///////////////////////////////////////////////////////////////////////////////////////
//
//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
//  By downloading, copying, installing or using the software you agree to this license.
//  If you do not agree to this license, do not download, install,
//  copy or use the software.
//
//
//                           License Agreement
//                For Open Source Computer Vision Library
//
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
14
// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
//   * Redistribution's of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//
//   * Redistribution's in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//
//   * The name of the copyright holders may not be used to endorse or promote products
//     derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/

/* ////////////////////////////////////////////////////////////////////
//
//  Mat basic operations: Copy, Set
//
// */

#include "precomp.hpp"

namespace cv
{

template<typename T> static void
55
copyMask_(const uchar* _src, size_t sstep, const uchar* mask, size_t mstep, uchar* _dst, size_t dstep, Size size)
56
{
57
    for( ; size.height--; mask += mstep, _src += sstep, _dst += dstep )
58
    {
59 60
        const T* src = (const T*)_src;
        T* dst = (T*)_dst;
61
        int x = 0;
Andrey Kamaev's avatar
Andrey Kamaev committed
62
         #if CV_ENABLE_UNROLLED
63 64 65 66 67 68 69 70 71 72 73
        for( ; x <= size.width - 4; x += 4 )
        {
            if( mask[x] )
                dst[x] = src[x];
            if( mask[x+1] )
                dst[x+1] = src[x+1];
            if( mask[x+2] )
                dst[x+2] = src[x+2];
            if( mask[x+3] )
                dst[x+3] = src[x+3];
        }
Victoria Zhislina's avatar
Victoria Zhislina committed
74
        #endif
75 76 77 78 79 80
        for( ; x < size.width; x++ )
            if( mask[x] )
                dst[x] = src[x];
    }
}

Maria Dimashova's avatar
Maria Dimashova committed
81
template<> void
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
copyMask_<uchar>(const uchar* _src, size_t sstep, const uchar* mask, size_t mstep, uchar* _dst, size_t dstep, Size size)
{
    for( ; size.height--; mask += mstep, _src += sstep, _dst += dstep )
    {
        const uchar* src = (const uchar*)_src;
        uchar* dst = (uchar*)_dst;
        int x = 0;
        #if CV_SSE4_2
		if(USE_SSE4_2)//
		{
			__m128i zero = _mm_setzero_si128 ();
	
			 for( ; x <= size.width - 16; x += 16 )
			 {
				 const __m128i rSrc = _mm_lddqu_si128((const __m128i*)(src+x));
				 __m128i _mask = _mm_lddqu_si128((const __m128i*)(mask+x)); 
				 __m128i rDst = _mm_lddqu_si128((__m128i*)(dst+x));
				 __m128i _negMask = _mm_cmpeq_epi8(_mask, zero);
				 rDst = _mm_blendv_epi8(rSrc, rDst, _negMask); 
				 _mm_storeu_si128((__m128i*)(dst + x), rDst);
			 }
		}
        #endif
        for( ; x < size.width; x++ )
            if( mask[x] )
                dst[x] = src[x];
    }
}

Maria Dimashova's avatar
Maria Dimashova committed
111
template<> void
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
copyMask_<ushort>(const uchar* _src, size_t sstep, const uchar* mask, size_t mstep, uchar* _dst, size_t dstep, Size size)
{
    for( ; size.height--; mask += mstep, _src += sstep, _dst += dstep )
    {
		const ushort* src = (const ushort*)_src;
        ushort* dst = (ushort*)_dst;
        int x = 0;
        #if CV_SSE4_2
		if(USE_SSE4_2)//
		{
			__m128i zero = _mm_setzero_si128 ();
			for( ; x <= size.width - 8; x += 8 )
			{
				 const __m128i rSrc =_mm_lddqu_si128((const __m128i*)(src+x));
				 __m128i _mask = _mm_loadl_epi64((const __m128i*)(mask+x));
				 _mask = _mm_unpacklo_epi8(_mask, _mask); 
				 __m128i rDst = _mm_lddqu_si128((const __m128i*)(dst+x));
				 __m128i _negMask = _mm_cmpeq_epi8(_mask, zero);
				 rDst = _mm_blendv_epi8(rSrc, rDst, _negMask); 
				 _mm_storeu_si128((__m128i*)(dst + x), rDst);
			 }
		}
        #endif
        for( ; x < size.width; x++ )
            if( mask[x] )
                dst[x] = src[x];
    }
}

141 142
static void
copyMaskGeneric(const uchar* _src, size_t sstep, const uchar* mask, size_t mstep, uchar* _dst, size_t dstep, Size size, void* _esz)
143
{
144 145
    size_t k, esz = *(size_t*)_esz;
    for( ; size.height--; mask += mstep, _src += sstep, _dst += dstep )
146
    {
147 148 149 150 151 152 153 154 155 156
        const uchar* src = _src;
        uchar* dst = _dst;
        int x = 0;
        for( ; x < size.width; x++, src += esz, dst += esz )
        {
            if( !mask[x] )
                continue;
            for( k = 0; k < esz; k++ )
                dst[k] = src[k];
        }
157
    }
158
}
Andrey Kamaev's avatar
Andrey Kamaev committed
159 160


161
#define DEF_COPY_MASK(suffix, type) \
162 163 164 165 166
static void copyMask##suffix(const uchar* src, size_t sstep, const uchar* mask, size_t mstep, \
                             uchar* dst, size_t dstep, Size size, void*) \
{ \
    copyMask_<type>(src, sstep, mask, mstep, dst, dstep, size); \
}
Andrey Kamaev's avatar
Andrey Kamaev committed
167 168


169 170 171 172 173 174 175 176 177 178
DEF_COPY_MASK(8u, uchar);
DEF_COPY_MASK(16u, ushort);
DEF_COPY_MASK(8uC3, Vec3b);
DEF_COPY_MASK(32s, int);
DEF_COPY_MASK(16uC3, Vec3s);
DEF_COPY_MASK(32sC2, Vec2i);
DEF_COPY_MASK(32sC3, Vec3i);
DEF_COPY_MASK(32sC4, Vec4i);
DEF_COPY_MASK(32sC6, Vec6i);
DEF_COPY_MASK(32sC8, Vec8i);
Andrey Kamaev's avatar
Andrey Kamaev committed
179

180
BinaryFunc copyMaskTab[] =
181 182
{
    0,
183 184 185 186
    copyMask8u,
    copyMask16u,
    copyMask8uC3,
    copyMask32s,
187
    0,
188
    copyMask16uC3,
189
    0,
190
    copyMask32sC2,
191
    0, 0, 0,
192
    copyMask32sC3,
193
    0, 0, 0,
194
    copyMask32sC4,
195
    0, 0, 0, 0, 0, 0, 0,
196
    copyMask32sC6,
197
    0, 0, 0, 0, 0, 0, 0,
198
    copyMask32sC8
199
};
Andrey Kamaev's avatar
Andrey Kamaev committed
200

201 202 203 204
BinaryFunc getCopyMaskFunc(size_t esz)
{
    return esz <= 32 && copyMaskTab[esz] ? copyMaskTab[esz] : copyMaskGeneric;
}
205 206

/* dst = src */
207
void Mat::copyTo( OutputArray _dst ) const
208
{
209 210 211
    int dtype = _dst.type();
    if( _dst.fixedType() && dtype != type() )
    {
Vadim Pisarevsky's avatar
Vadim Pisarevsky committed
212
        CV_Assert( channels() == CV_MAT_CN(dtype) );
213 214 215
        convertTo( _dst, dtype );
        return;
    }
Andrey Kamaev's avatar
Andrey Kamaev committed
216

217 218 219
    if( empty() )
    {
        _dst.release();
220
        return;
221
    }
Andrey Kamaev's avatar
Andrey Kamaev committed
222

223
    if( dims <= 2 )
224
    {
225 226 227 228
        _dst.create( rows, cols, type() );
        Mat dst = _dst.getMat();
        if( data == dst.data )
            return;
Andrey Kamaev's avatar
Andrey Kamaev committed
229

230 231 232 233
        if( rows > 0 && cols > 0 )
        {
            const uchar* sptr = data;
            uchar* dptr = dst.data;
Andrey Kamaev's avatar
Andrey Kamaev committed
234

235 236
            // to handle the copying 1xn matrix => nx1 std vector.
            Size sz = size() == dst.size() ?
237 238 239
                getContinuousSize(*this, dst) :
                getContinuousSize(*this);
            size_t len = sz.width*elemSize();
Andrey Kamaev's avatar
Andrey Kamaev committed
240

241
            for( ; sz.height--; sptr += step, dptr += dst.step )
242
                memcpy( dptr, sptr, len );
243
        }
244 245
        return;
    }
Andrey Kamaev's avatar
Andrey Kamaev committed
246

247 248 249 250
    _dst.create( dims, size, type() );
    Mat dst = _dst.getMat();
    if( data == dst.data )
        return;
Andrey Kamaev's avatar
Andrey Kamaev committed
251

252
    if( total() != 0 )
253
    {
254 255 256
        const Mat* arrays[] = { this, &dst };
        uchar* ptrs[2];
        NAryMatIterator it(arrays, ptrs, 2);
Andrey Kamaev's avatar
Andrey Kamaev committed
257 258
        size_t sz = it.size*elemSize();

259
        for( size_t i = 0; i < it.nplanes; i++, ++it )
Andrey Kamaev's avatar
Andrey Kamaev committed
260
            memcpy(ptrs[1], ptrs[0], sz);
261
    }
262 263
}

264
void Mat::copyTo( OutputArray _dst, InputArray _mask ) const
265
{
266
    Mat mask = _mask.getMat();
267 268
    if( !mask.data )
    {
269
        copyTo(_dst);
270 271
        return;
    }
Andrey Kamaev's avatar
Andrey Kamaev committed
272

273 274 275
    int cn = channels(), mcn = mask.channels();
    CV_Assert( mask.depth() == CV_8U && (mcn == 1 || mcn == cn) );
    bool colorMask = mcn > 1;
Andrey Kamaev's avatar
Andrey Kamaev committed
276

277
    size_t esz = colorMask ? elemSize1() : elemSize();
278
    BinaryFunc copymask = getCopyMaskFunc(esz);
Andrey Kamaev's avatar
Andrey Kamaev committed
279

280 281 282
    uchar* data0 = _dst.getMat().data;
    _dst.create( dims, size, type() );
    Mat dst = _dst.getMat();
Andrey Kamaev's avatar
Andrey Kamaev committed
283

284 285
    if( dst.data != data0 ) // do not leave dst uninitialized
        dst = Scalar(0);
Andrey Kamaev's avatar
Andrey Kamaev committed
286

287
    if( dims <= 2 )
288
    {
289
        Size sz = getContinuousSize(*this, dst, mask, mcn);
290
        copymask(data, step, mask.data, mask.step, dst.data, dst.step, sz, &esz);
291 292
        return;
    }
Andrey Kamaev's avatar
Andrey Kamaev committed
293

294 295 296
    const Mat* arrays[] = { this, &dst, &mask, 0 };
    uchar* ptrs[3];
    NAryMatIterator it(arrays, ptrs);
297
    Size sz((int)(it.size*mcn), 1);
Andrey Kamaev's avatar
Andrey Kamaev committed
298

299 300
    for( size_t i = 0; i < it.nplanes; i++, ++it )
        copymask(ptrs[0], 0, ptrs[2], 0, ptrs[1], 0, sz, &esz);
301 302 303 304
}

Mat& Mat::operator = (const Scalar& s)
{
305
    const Mat* arrays[] = { this };
Andrey Kamaev's avatar
Andrey Kamaev committed
306 307 308 309
    uchar* dptr;
    NAryMatIterator it(arrays, &dptr, 1);
    size_t elsize = it.size*elemSize();

310 311
    if( s[0] == 0 && s[1] == 0 && s[2] == 0 && s[3] == 0 )
    {
312
        for( size_t i = 0; i < it.nplanes; i++, ++it )
Andrey Kamaev's avatar
Andrey Kamaev committed
313
            memset( dptr, 0, elsize );
314 315 316
    }
    else
    {
317
        if( it.nplanes > 0 )
318
        {
319 320 321
            double scalar[12];
            scalarToRawData(s, scalar, type(), 12);
            size_t blockSize = 12*elemSize1();
Andrey Kamaev's avatar
Andrey Kamaev committed
322 323

            for( size_t j = 0; j < elsize; j += blockSize )
324
            {
Andrey Kamaev's avatar
Andrey Kamaev committed
325 326
                size_t sz = MIN(blockSize, elsize - j);
                memcpy( dptr + j, scalar, sz );
327 328
            }
        }
Andrey Kamaev's avatar
Andrey Kamaev committed
329

330
        for( size_t i = 1; i < it.nplanes; i++ )
331
        {
332
            ++it;
Andrey Kamaev's avatar
Andrey Kamaev committed
333
            memcpy( dptr, data, elsize );
334 335 336 337 338
        }
    }
    return *this;
}

Andrey Kamaev's avatar
Andrey Kamaev committed
339

340
Mat& Mat::setTo(InputArray _value, InputArray _mask)
341
{
342 343
    if( !data )
        return *this;
Andrey Kamaev's avatar
Andrey Kamaev committed
344

345
    Mat value = _value.getMat(), mask = _mask.getMat();
Andrey Kamaev's avatar
Andrey Kamaev committed
346

347 348
    CV_Assert( checkScalar(value, type(), _value.kind(), _InputArray::MAT ));
    CV_Assert( mask.empty() || mask.type() == CV_8U );
Andrey Kamaev's avatar
Andrey Kamaev committed
349

350 351
    size_t esz = elemSize();
    BinaryFunc copymask = getCopyMaskFunc(esz);
Andrey Kamaev's avatar
Andrey Kamaev committed
352

353 354 355
    const Mat* arrays[] = { this, !mask.empty() ? &mask : 0, 0 };
    uchar* ptrs[2]={0,0};
    NAryMatIterator it(arrays, ptrs);
Andrey Kamaev's avatar
Andrey Kamaev committed
356
    int totalsz = (int)it.size, blockSize0 = std::min(totalsz, (int)((BLOCK_SIZE + esz-1)/esz));
357 358 359
    AutoBuffer<uchar> _scbuf(blockSize0*esz + 32);
    uchar* scbuf = alignPtr((uchar*)_scbuf, (int)sizeof(double));
    convertAndUnrollScalar( value, type(), scbuf, blockSize0 );
Andrey Kamaev's avatar
Andrey Kamaev committed
360

361
    for( size_t i = 0; i < it.nplanes; i++, ++it )
362
    {
Andrey Kamaev's avatar
Andrey Kamaev committed
363
        for( int j = 0; j < totalsz; j += blockSize0 )
364
        {
Andrey Kamaev's avatar
Andrey Kamaev committed
365
            Size sz(std::min(blockSize0, totalsz - j), 1);
366 367 368 369 370 371 372 373 374 375
            size_t blockSize = sz.width*esz;
            if( ptrs[1] )
            {
                copymask(scbuf, 0, ptrs[1], 0, ptrs[0], 0, sz, &esz);
                ptrs[1] += sz.width;
            }
            else
                memcpy(ptrs[0], scbuf, blockSize);
            ptrs[0] += blockSize;
        }
376 377 378 379 380
    }
    return *this;
}


381 382
static void
flipHoriz( const uchar* src, size_t sstep, uchar* dst, size_t dstep, Size size, size_t esz )
383
{
384
    int i, j, limit = (int)(((size.width + 1)/2)*esz);
385 386
    AutoBuffer<int> _tab(size.width*esz);
    int* tab = _tab;
Andrey Kamaev's avatar
Andrey Kamaev committed
387

388 389
    for( i = 0; i < size.width; i++ )
        for( size_t k = 0; k < esz; k++ )
390
            tab[i*esz + k] = (int)((size.width - i - 1)*esz + k);
391

392
    for( ; size.height--; src += sstep, dst += dstep )
393
    {
394
        for( i = 0; i < limit; i++ )
395
        {
396 397 398
            j = tab[i];
            uchar t0 = src[i], t1 = src[j];
            dst[i] = t1; dst[j] = t0;
399 400 401 402 403
        }
    }
}

static void
404
flipVert( const uchar* src0, size_t sstep, uchar* dst0, size_t dstep, Size size, size_t esz )
405
{
406 407 408 409 410 411
    const uchar* src1 = src0 + (size.height - 1)*sstep;
    uchar* dst1 = dst0 + (size.height - 1)*dstep;
    size.width *= (int)esz;

    for( int y = 0; y < (size.height + 1)/2; y++, src0 += sstep, src1 -= sstep,
                                                  dst0 += dstep, dst1 -= dstep )
412 413
    {
        int i = 0;
414
        if( ((size_t)src0|(size_t)dst0|(size_t)src1|(size_t)dst1) % sizeof(int) == 0 )
415 416 417
        {
            for( ; i <= size.width - 16; i += 16 )
            {
418
                int t0 = ((int*)(src0 + i))[0];
419 420
                int t1 = ((int*)(src1 + i))[0];

421
                ((int*)(dst0 + i))[0] = t1;
422 423
                ((int*)(dst1 + i))[0] = t0;

424
                t0 = ((int*)(src0 + i))[1];
425 426
                t1 = ((int*)(src1 + i))[1];

427
                ((int*)(dst0 + i))[1] = t1;
428 429
                ((int*)(dst1 + i))[1] = t0;

430
                t0 = ((int*)(src0 + i))[2];
431 432
                t1 = ((int*)(src1 + i))[2];

433
                ((int*)(dst0 + i))[2] = t1;
434 435
                ((int*)(dst1 + i))[2] = t0;

436
                t0 = ((int*)(src0 + i))[3];
437 438
                t1 = ((int*)(src1 + i))[3];

439
                ((int*)(dst0 + i))[3] = t1;
440 441 442 443 444
                ((int*)(dst1 + i))[3] = t0;
            }

            for( ; i <= size.width - 4; i += 4 )
            {
445
                int t0 = ((int*)(src0 + i))[0];
446 447
                int t1 = ((int*)(src1 + i))[0];

448
                ((int*)(dst0 + i))[0] = t1;
449 450 451 452 453 454
                ((int*)(dst1 + i))[0] = t0;
            }
        }

        for( ; i < size.width; i++ )
        {
455
            uchar t0 = src0[i];
456 457
            uchar t1 = src1[i];

458
            dst0[i] = t1;
459 460 461 462 463
            dst1[i] = t0;
        }
    }
}

464
void flip( InputArray _src, OutputArray _dst, int flip_mode )
465
{
466
    Mat src = _src.getMat();
Andrey Kamaev's avatar
Andrey Kamaev committed
467

468
    CV_Assert( src.dims <= 2 );
469 470 471
    _dst.create( src.size(), src.type() );
    Mat dst = _dst.getMat();
    size_t esz = src.elemSize();
472

473 474
    if( flip_mode <= 0 )
        flipVert( src.data, src.step, dst.data, dst.step, src.size(), esz );
475
    else
476
        flipHoriz( src.data, src.step, dst.data, dst.step, src.size(), esz );
Andrey Kamaev's avatar
Andrey Kamaev committed
477

478 479
    if( flip_mode < 0 )
        flipHoriz( dst.data, dst.step, dst.data, dst.step, dst.size(), esz );
480 481 482
}


483
void repeat(InputArray _src, int ny, int nx, OutputArray _dst)
484
{
485
    Mat src = _src.getMat();
486
    CV_Assert( src.dims <= 2 );
Andrey Kamaev's avatar
Andrey Kamaev committed
487

488 489
    _dst.create(src.rows*ny, src.cols*nx, src.type());
    Mat dst = _dst.getMat();
490 491 492 493 494 495 496 497 498 499 500 501 502 503 504
    Size ssize = src.size(), dsize = dst.size();
    int esz = (int)src.elemSize();
    int x, y;
    ssize.width *= esz; dsize.width *= esz;

    for( y = 0; y < ssize.height; y++ )
    {
        for( x = 0; x < dsize.width; x += ssize.width )
            memcpy( dst.data + y*dst.step + x, src.data + y*src.step, ssize.width );
    }

    for( ; y < dsize.height; y++ )
        memcpy( dst.data + y*dst.step, dst.data + (y - ssize.height)*dst.step, dsize.width );
}

505 506 507 508 509 510 511 512 513
Mat repeat(const Mat& src, int ny, int nx)
{
    if( nx == 1 && ny == 1 )
        return src;
    Mat dst;
    repeat(src, ny, nx, dst);
    return dst;
}

514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548
}

/* dst = src */
CV_IMPL void
cvCopy( const void* srcarr, void* dstarr, const void* maskarr )
{
    if( CV_IS_SPARSE_MAT(srcarr) && CV_IS_SPARSE_MAT(dstarr))
    {
        CV_Assert( maskarr == 0 );
        CvSparseMat* src1 = (CvSparseMat*)srcarr;
        CvSparseMat* dst1 = (CvSparseMat*)dstarr;
        CvSparseMatIterator iterator;
        CvSparseNode* node;

        dst1->dims = src1->dims;
        memcpy( dst1->size, src1->size, src1->dims*sizeof(src1->size[0]));
        dst1->valoffset = src1->valoffset;
        dst1->idxoffset = src1->idxoffset;
        cvClearSet( dst1->heap );

        if( src1->heap->active_count >= dst1->hashsize*CV_SPARSE_HASH_RATIO )
        {
            cvFree( &dst1->hashtable );
            dst1->hashsize = src1->hashsize;
            dst1->hashtable =
                (void**)cvAlloc( dst1->hashsize*sizeof(dst1->hashtable[0]));
        }

        memset( dst1->hashtable, 0, dst1->hashsize*sizeof(dst1->hashtable[0]));

        for( node = cvInitSparseMatIterator( src1, &iterator );
             node != 0; node = cvGetNextSparseNode( &iterator ))
        {
            CvSparseNode* node_copy = (CvSparseNode*)cvSetNew( dst1->heap );
            int tabidx = node->hashval & (dst1->hashsize - 1);
549
            memcpy( node_copy, node, dst1->heap->elem_size );
550 551 552 553 554 555
            node_copy->next = (CvSparseNode*)dst1->hashtable[tabidx];
            dst1->hashtable[tabidx] = node_copy;
        }
        return;
    }
    cv::Mat src = cv::cvarrToMat(srcarr, false, true, 1), dst = cv::cvarrToMat(dstarr, false, true, 1);
556
    CV_Assert( src.depth() == dst.depth() && src.size == dst.size );
Andrey Kamaev's avatar
Andrey Kamaev committed
557

558 559 560 561 562
    int coi1 = 0, coi2 = 0;
    if( CV_IS_IMAGE(srcarr) )
        coi1 = cvGetImageCOI((const IplImage*)srcarr);
    if( CV_IS_IMAGE(dstarr) )
        coi2 = cvGetImageCOI((const IplImage*)dstarr);
Andrey Kamaev's avatar
Andrey Kamaev committed
563

564 565 566 567
    if( coi1 || coi2 )
    {
        CV_Assert( (coi1 != 0 || src.channels() == 1) &&
            (coi2 != 0 || dst.channels() == 1) );
Andrey Kamaev's avatar
Andrey Kamaev committed
568

569 570 571 572 573 574
        int pair[] = { std::max(coi1-1, 0), std::max(coi2-1, 0) };
        cv::mixChannels( &src, 1, &dst, 1, pair, 1 );
        return;
    }
    else
        CV_Assert( src.channels() == dst.channels() );
Andrey Kamaev's avatar
Andrey Kamaev committed
575

576 577 578 579 580 581 582 583 584 585 586 587 588
    if( !maskarr )
        src.copyTo(dst);
    else
        src.copyTo(dst, cv::cvarrToMat(maskarr));
}

CV_IMPL void
cvSet( void* arr, CvScalar value, const void* maskarr )
{
    cv::Mat m = cv::cvarrToMat(arr);
    if( !maskarr )
        m = value;
    else
589
        m.setTo(cv::Scalar(value), cv::cvarrToMat(maskarr));
590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611
}

CV_IMPL void
cvSetZero( CvArr* arr )
{
    if( CV_IS_SPARSE_MAT(arr) )
    {
        CvSparseMat* mat1 = (CvSparseMat*)arr;
        cvClearSet( mat1->heap );
        if( mat1->hashtable )
            memset( mat1->hashtable, 0, mat1->hashsize*sizeof(mat1->hashtable[0]));
        return;
    }
    cv::Mat m = cv::cvarrToMat(arr);
    m = cv::Scalar(0);
}

CV_IMPL void
cvFlip( const CvArr* srcarr, CvArr* dstarr, int flip_mode )
{
    cv::Mat src = cv::cvarrToMat(srcarr);
    cv::Mat dst;
Andrey Kamaev's avatar
Andrey Kamaev committed
612

613 614 615 616
    if (!dstarr)
      dst = src;
    else
      dst = cv::cvarrToMat(dstarr);
Andrey Kamaev's avatar
Andrey Kamaev committed
617

618 619 620 621 622 623 624 625 626 627 628 629 630
    CV_Assert( src.type() == dst.type() && src.size() == dst.size() );
    cv::flip( src, dst, flip_mode );
}

CV_IMPL void
cvRepeat( const CvArr* srcarr, CvArr* dstarr )
{
    cv::Mat src = cv::cvarrToMat(srcarr), dst = cv::cvarrToMat(dstarr);
    CV_Assert( src.type() == dst.type() &&
        dst.rows % src.rows == 0 && dst.cols % src.cols == 0 );
    cv::repeat(src, dst.rows/src.rows, dst.cols/src.cols, dst);
}

Maria Dimashova's avatar
Maria Dimashova committed
631
/* End of file. */