| 50 | \****************************************************************************************/ |
| 51 | |
| 52 | template<typename T> static void |
| 53 | split_( const T* src, T** dst, int len, int cn ) |
| 54 | { |
| 55 | int k = cn % 4 ? cn % 4 : 4; |
| 56 | int i, j; |
| 57 | if( k == 1 ) |
| 58 | { |
| 59 | T* dst0 = dst[0]; |
| 60 | for( i = j = 0; i < len; i++, j += cn ) |
| 61 | dst0[i] = src[j]; |
| 62 | } |
| 63 | else if( k == 2 ) |
| 64 | { |
| 65 | T *dst0 = dst[0], *dst1 = dst[1]; |
| 66 | for( i = j = 0; i < len; i++, j += cn ) |
| 67 | { |
| 68 | dst0[i] = src[j]; |
| 69 | dst1[i] = src[j+1]; |
| 70 | } |
| 71 | } |
| 72 | else if( k == 3 ) |
| 73 | { |
| 74 | T *dst0 = dst[0], *dst1 = dst[1], *dst2 = dst[2]; |
| 75 | for( i = j = 0; i < len; i++, j += cn ) |
| 76 | { |
| 77 | dst0[i] = src[j]; |
| 78 | dst1[i] = src[j+1]; |
| 79 | dst2[i] = src[j+2]; |
| 80 | } |
| 81 | } |
| 82 | else |
| 83 | { |
| 84 | T *dst0 = dst[0], *dst1 = dst[1], *dst2 = dst[2], *dst3 = dst[3]; |
| 85 | for( i = j = 0; i < len; i++, j += cn ) |
| 86 | { |
| 87 | dst0[i] = src[j]; dst1[i] = src[j+1]; |
| 88 | dst2[i] = src[j+2]; dst3[i] = src[j+3]; |
| 89 | } |
| 90 | } |
| 91 | |
| 92 | for( ; k < cn; k += 4 ) |
| 93 | { |
| 94 | T *dst0 = dst[k], *dst1 = dst[k+1], *dst2 = dst[k+2], *dst3 = dst[k+3]; |
| 95 | for( i = 0, j = k; i < len; i++, j += cn ) |
| 96 | { |
| 97 | dst0[i] = src[j]; dst1[i] = src[j+1]; |
| 98 | dst2[i] = src[j+2]; dst3[i] = src[j+3]; |
| 99 | } |
| 100 | } |
| 101 | } |
| 102 | |
| 103 | template<typename T> static void |
| 104 | merge_( const T** src, T* dst, int len, int cn ) |