| 359 | : ColumnFilter<CastOp, VecOp>(kernel_, anchor_, cast_op_, vec_op_) {} |
| 360 | |
| 361 | void operator()(const uchar** src, uchar* dst, int dststep, int count, int width) { |
| 362 | int ksize2 = this->ksize / 2; |
| 363 | const ST* ky = this->kernel.ptr() + ksize2; |
| 364 | int i, k; |
| 365 | src += ksize2; |
| 366 | |
| 367 | for (; count > 0; count--, dst += dststep, src++) { |
| 368 | DT* D = (DT*)dst; |
| 369 | i = (this->vec_op)(src, dst, count, width); |
| 370 | #if MEGCV_ENABLE_UNROLLED |
| 371 | for (; i <= width - 4; i += 4) { |
| 372 | ST f = ky[0]; |
| 373 | const ST *S = (const ST*)src[0] + i, *S2; |
| 374 | ST s0 = f * S[0], s1 = f * S[1], s2 = f * S[2], s3 = f * S[3]; |
| 375 | |
| 376 | for (k = 1; k <= ksize2; k++) { |
| 377 | S = (const ST*)src[k] + i; |
| 378 | S2 = (const ST*)src[-k] + i; |
| 379 | f = ky[k]; |
| 380 | s0 += f * (S[0] + S2[0]); |
| 381 | s1 += f * (S[1] + S2[1]); |
| 382 | s2 += f * (S[2] + S2[2]); |
| 383 | s3 += f * (S[3] + S2[3]); |
| 384 | } |
| 385 | |
| 386 | D[i] = this->cast_op(s0); |
| 387 | D[i + 1] = this->cast_op(s1); |
| 388 | D[i + 2] = this->cast_op(s2); |
| 389 | D[i + 3] = this->cast_op(s3); |
| 390 | } |
| 391 | #endif |
| 392 | for (; i < width; i++) { |
| 393 | ST s0 = ky[0] * ((const ST*)src[0])[i]; |
| 394 | for (k = 1; k <= ksize2; k++) { |
| 395 | s0 += ky[k] * (((const ST*)src[k])[i] + ((const ST*)src[-k])[i]); |
| 396 | } |
| 397 | D[i] = this->cast_op(s0); |
| 398 | } |
| 399 | } |
| 400 | } |
| 401 | }; |
| 402 | |
| 403 | template <class CastOp, class VecOp> |