| 2135 | { |
| 2136 | |
| 2137 | template<typename T> static void |
| 2138 | cmp_(const T* src1, size_t step1, const T* src2, size_t step2, |
| 2139 | uchar* dst, size_t step, Size size, int code) |
| 2140 | { |
| 2141 | step1 /= sizeof(src1[0]); |
| 2142 | step2 /= sizeof(src2[0]); |
| 2143 | if( code == CMP_GE || code == CMP_LT ) |
| 2144 | { |
| 2145 | std::swap(src1, src2); |
| 2146 | std::swap(step1, step2); |
| 2147 | code = code == CMP_GE ? CMP_LE : CMP_GT; |
| 2148 | } |
| 2149 | |
| 2150 | if( code == CMP_GT || code == CMP_LE ) |
| 2151 | { |
| 2152 | int m = code == CMP_GT ? 0 : 255; |
| 2153 | for( ; size.height--; src1 += step1, src2 += step2, dst += step ) |
| 2154 | { |
| 2155 | int x = 0; |
| 2156 | #if CV_ENABLE_UNROLLED |
| 2157 | for( ; x <= size.width - 4; x += 4 ) |
| 2158 | { |
| 2159 | int t0, t1; |
| 2160 | t0 = -(src1[x] > src2[x]) ^ m; |
| 2161 | t1 = -(src1[x+1] > src2[x+1]) ^ m; |
| 2162 | dst[x] = (uchar)t0; dst[x+1] = (uchar)t1; |
| 2163 | t0 = -(src1[x+2] > src2[x+2]) ^ m; |
| 2164 | t1 = -(src1[x+3] > src2[x+3]) ^ m; |
| 2165 | dst[x+2] = (uchar)t0; dst[x+3] = (uchar)t1; |
| 2166 | } |
| 2167 | #endif |
| 2168 | for( ; x < size.width; x++ ) |
| 2169 | dst[x] = (uchar)(-(src1[x] > src2[x]) ^ m); |
| 2170 | } |
| 2171 | } |
| 2172 | else if( code == CMP_EQ || code == CMP_NE ) |
| 2173 | { |
| 2174 | int m = code == CMP_EQ ? 0 : 255; |
| 2175 | for( ; size.height--; src1 += step1, src2 += step2, dst += step ) |
| 2176 | { |
| 2177 | int x = 0; |
| 2178 | #if CV_ENABLE_UNROLLED |
| 2179 | for( ; x <= size.width - 4; x += 4 ) |
| 2180 | { |
| 2181 | int t0, t1; |
| 2182 | t0 = -(src1[x] == src2[x]) ^ m; |
| 2183 | t1 = -(src1[x+1] == src2[x+1]) ^ m; |
| 2184 | dst[x] = (uchar)t0; dst[x+1] = (uchar)t1; |
| 2185 | t0 = -(src1[x+2] == src2[x+2]) ^ m; |
| 2186 | t1 = -(src1[x+3] == src2[x+3]) ^ m; |
| 2187 | dst[x+2] = (uchar)t0; dst[x+3] = (uchar)t1; |
| 2188 | } |
| 2189 | #endif |
| 2190 | for( ; x < size.width; x++ ) |
| 2191 | dst[x] = (uchar)(-(src1[x] == src2[x]) ^ m); |
| 2192 | } |
| 2193 | } |
| 2194 | } |