| 76 | sptr = sptrs[n]; |
| 77 | } |
| 78 | rep(ow, OW) { |
| 79 | float numeratorw = mptr[0] * ow + mptr[1] * oh + mptr[2]; |
| 80 | float numeratorh = mptr[3] * ow + mptr[4] * oh + mptr[5]; |
| 81 | float denominator = mptr[6] * ow + mptr[7] * oh + mptr[8]; |
| 82 | float alphaw = numeratorw / denominator; |
| 83 | float alphah = numeratorh / denominator; |
| 84 | |
| 85 | int iw0 = get_real_coord(std::floor(alphaw) + 0, IW); |
| 86 | int iw1 = get_real_coord(std::floor(alphaw) + 1, IW); |
| 87 | int ih0 = get_real_coord(std::floor(alphah) + 0, IH); |
| 88 | int ih1 = get_real_coord(std::floor(alphah) + 1, IH); |
| 89 | |
| 90 | alphaw -= floor(alphaw); |
| 91 | alphah -= floor(alphah); |
| 92 | if (bmode != BorderMode::CONSTANT) { |
| 93 | rep(c, C) { |
| 94 | visit_dst(c, oh, ow) = output_converter( |
| 95 | visit_src(c, ih0, iw0) * (1.0f - alphaw) * (1.0f - alphah) + |
| 96 | visit_src(c, ih0, iw1) * alphaw * (1.0f - alphah) + |
| 97 | visit_src(c, ih1, iw0) * (1.0f - alphaw) * alphah + |
| 98 | visit_src(c, ih1, iw1) * alphaw * alphah); |
| 99 | } |
| 100 | } else { |
| 101 | rep(c, C) { |
| 102 | auto val = visit_src_bd(c, ih0, iw0) * (1.0f - alphaw) * |
| 103 | (1.0f - alphah) + |
| 104 | visit_src_bd(c, ih0, iw1) * alphaw * (1.0f - alphah) + |
| 105 | visit_src_bd(c, ih1, iw0) * (1.0f - alphaw) * alphah + |
| 106 | visit_src_bd(c, ih1, iw1) * alphaw * alphah; |
| 107 | visit_dst(c, oh, ow) = |
| 108 | output_converter(std::isfinite(val) ? val : border_val); |
| 109 | } |
| 110 | } |
| 111 | } |
| 112 | } |
| 113 | MIDOUT_END(); |
| 114 | } |