| 231 | } |
| 232 | |
| 233 | void resize_linear_32f(const Mat32f& src, Mat32f& dst) { |
| 234 | AlignedVector<int> tabsx(dst.rows()); |
| 235 | AlignedVector<int> tabsy(dst.cols()); |
| 236 | AlignedVector<float> tabrx(dst.rows()); |
| 237 | AlignedVector<float> tabry(dst.cols()); |
| 238 | build_tabs_linear_32f(src, dst, tabsx, tabsy, tabrx, tabry); |
| 239 | const size_t ch = src.channels(); |
| 240 | // brute-force |
| 241 | for (size_t dx = 0; dx < dst.rows(); ++dx) { |
| 242 | const float* psrc0 = src.ptr(tabsx[dx] + 0); |
| 243 | const float* psrc1 = src.ptr(tabsx[dx] + 1); |
| 244 | float* pdst = dst.ptr(dx); |
| 245 | float rx = tabrx[dx]; |
| 246 | float irx = 1.0f - rx; |
| 247 | for (size_t dy = 0; dy < dst.cols(); ++dy) { |
| 248 | float* pcdst = pdst + dy * ch; |
| 249 | const float* pcsrc00 = psrc0 + (tabsy[dy] + 0) * ch; |
| 250 | const float* pcsrc01 = psrc0 + (tabsy[dy] + 1) * ch; |
| 251 | const float* pcsrc10 = psrc1 + (tabsy[dy] + 0) * ch; |
| 252 | const float* pcsrc11 = psrc1 + (tabsy[dy] + 1) * ch; |
| 253 | float ry = tabry[dy]; |
| 254 | float iry = 1.0f - ry; |
| 255 | for (size_t c = 0; c < ch; ++c) { |
| 256 | float res = rx * (pcsrc11[c] * ry + pcsrc10[c] * iry) + |
| 257 | irx * (pcsrc01[c] * ry + pcsrc00[c] * iry); |
| 258 | pcdst[c] = res; |
| 259 | } |
| 260 | } |
| 261 | } |
| 262 | } |
| 263 | |
| 264 | // linear 8u |
| 265 | void build_tabs_linear_8u( |
no test coverage detected