| 1028 | } |
| 1029 | |
| 1030 | int compute_resize_area_tab( |
| 1031 | int ssize, int dsize, int cn, double scale, DecimateAlpha* tab) { |
| 1032 | int k = 0; |
| 1033 | for (int dx = 0; dx < dsize; dx++) { |
| 1034 | double fsx1 = dx * scale; |
| 1035 | double fsx2 = fsx1 + scale; |
| 1036 | double cellWidth = std::min(scale, ssize - fsx1); |
| 1037 | |
| 1038 | int sx1 = ceil(fsx1), sx2 = floor(fsx2); |
| 1039 | |
| 1040 | sx2 = std::min(sx2, ssize - 1); |
| 1041 | sx1 = std::min(sx1, sx2); |
| 1042 | |
| 1043 | if (sx1 - fsx1 > 1e-3) { |
| 1044 | megdnn_assert(k < ssize * 2); |
| 1045 | tab[k].di = dx * cn; |
| 1046 | tab[k].si = (sx1 - 1) * cn; |
| 1047 | tab[k++].alpha = (float)((sx1 - fsx1) / cellWidth); |
| 1048 | } |
| 1049 | |
| 1050 | for (int sx = sx1; sx < sx2; sx++) { |
| 1051 | megdnn_assert(k < ssize * 2); |
| 1052 | tab[k].di = dx * cn; |
| 1053 | tab[k].si = sx * cn; |
| 1054 | tab[k++].alpha = float(1.0 / cellWidth); |
| 1055 | } |
| 1056 | |
| 1057 | if (fsx2 - sx2 > 1e-3) { |
| 1058 | megdnn_assert(k < ssize * 2); |
| 1059 | tab[k].di = dx * cn; |
| 1060 | tab[k].si = sx2 * cn; |
| 1061 | tab[k++].alpha = |
| 1062 | (float)(std::min(std::min(fsx2 - sx2, 1.), cellWidth) / cellWidth); |
| 1063 | } |
| 1064 | } |
| 1065 | return k; |
| 1066 | } |
| 1067 | |
| 1068 | // resize Area Fast |
| 1069 | template <typename T, typename WT, typename VecOp> |
no test coverage detected