| 79 | { |
| 80 | |
| 81 | static void copyMakeBorder_8u( const uchar* src, size_t srcstep, Size srcroi, |
| 82 | uchar* dst, size_t dststep, Size dstroi, |
| 83 | int top, int left, int cn, int borderType ) |
| 84 | { |
| 85 | const int isz = (int)sizeof(int); |
| 86 | int i, j, k, elemSize = 1; |
| 87 | bool intMode = false; |
| 88 | |
| 89 | if( (cn | srcstep | dststep | (size_t)src | (size_t)dst) % isz == 0 ) |
| 90 | { |
| 91 | cn /= isz; |
| 92 | elemSize = isz; |
| 93 | intMode = true; |
| 94 | } |
| 95 | |
| 96 | AutoBuffer<int> _tab((dstroi.width - srcroi.width)*cn); |
| 97 | int* tab = _tab; |
| 98 | int right = dstroi.width - srcroi.width - left; |
| 99 | int bottom = dstroi.height - srcroi.height - top; |
| 100 | |
| 101 | for( i = 0; i < left; i++ ) |
| 102 | { |
| 103 | j = borderInterpolate(i - left, srcroi.width, borderType)*cn; |
| 104 | for( k = 0; k < cn; k++ ) |
| 105 | tab[i*cn + k] = j + k; |
| 106 | } |
| 107 | |
| 108 | for( i = 0; i < right; i++ ) |
| 109 | { |
| 110 | j = borderInterpolate(srcroi.width + i, srcroi.width, borderType)*cn; |
| 111 | for( k = 0; k < cn; k++ ) |
| 112 | tab[(i+left)*cn + k] = j + k; |
| 113 | } |
| 114 | |
| 115 | srcroi.width *= cn; |
| 116 | dstroi.width *= cn; |
| 117 | left *= cn; |
| 118 | right *= cn; |
| 119 | |
| 120 | uchar* dstInner = dst + dststep*top + left*elemSize; |
| 121 | |
| 122 | for( i = 0; i < srcroi.height; i++, dstInner += dststep, src += srcstep ) |
| 123 | { |
| 124 | if( dstInner != src ) |
| 125 | memcpy(dstInner, src, srcroi.width*elemSize); |
| 126 | |
| 127 | if( intMode ) |
| 128 | { |
| 129 | const int* isrc = (int*)src; |
| 130 | int* idstInner = (int*)dstInner; |
| 131 | for( j = 0; j < left; j++ ) |
| 132 | idstInner[j - left] = isrc[tab[j]]; |
| 133 | for( j = 0; j < right; j++ ) |
| 134 | idstInner[j + srcroi.width] = isrc[tab[j + left]]; |
| 135 | } |
| 136 | else |
| 137 | { |
| 138 | for( j = 0; j < left; j++ ) |