| 101 | } |
| 102 | |
| 103 | template<typename T> static void |
| 104 | merge_( const T** src, T* dst, int len, int cn ) |
| 105 | { |
| 106 | int k = cn % 4 ? cn % 4 : 4; |
| 107 | int i, j; |
| 108 | if( k == 1 ) |
| 109 | { |
| 110 | const T* src0 = src[0]; |
| 111 | for( i = j = 0; i < len; i++, j += cn ) |
| 112 | dst[j] = src0[i]; |
| 113 | } |
| 114 | else if( k == 2 ) |
| 115 | { |
| 116 | const T *src0 = src[0], *src1 = src[1]; |
| 117 | for( i = j = 0; i < len; i++, j += cn ) |
| 118 | { |
| 119 | dst[j] = src0[i]; |
| 120 | dst[j+1] = src1[i]; |
| 121 | } |
| 122 | } |
| 123 | else if( k == 3 ) |
| 124 | { |
| 125 | const T *src0 = src[0], *src1 = src[1], *src2 = src[2]; |
| 126 | for( i = j = 0; i < len; i++, j += cn ) |
| 127 | { |
| 128 | dst[j] = src0[i]; |
| 129 | dst[j+1] = src1[i]; |
| 130 | dst[j+2] = src2[i]; |
| 131 | } |
| 132 | } |
| 133 | else |
| 134 | { |
| 135 | const T *src0 = src[0], *src1 = src[1], *src2 = src[2], *src3 = src[3]; |
| 136 | for( i = j = 0; i < len; i++, j += cn ) |
| 137 | { |
| 138 | dst[j] = src0[i]; dst[j+1] = src1[i]; |
| 139 | dst[j+2] = src2[i]; dst[j+3] = src3[i]; |
| 140 | } |
| 141 | } |
| 142 | |
| 143 | for( ; k < cn; k += 4 ) |
| 144 | { |
| 145 | const T *src0 = src[k], *src1 = src[k+1], *src2 = src[k+2], *src3 = src[k+3]; |
| 146 | for( i = 0, j = k; i < len; i++, j += cn ) |
| 147 | { |
| 148 | dst[j] = src0[i]; dst[j+1] = src1[i]; |
| 149 | dst[j+2] = src2[i]; dst[j+3] = src3[i]; |
| 150 | } |
| 151 | } |
| 152 | } |
| 153 | |
| 154 | static void split8u(const uchar* src, uchar** dst, int len, int cn ) |
| 155 | { |