| 1907 | } |
| 1908 | |
| 1909 | int compute_resize_area_tab( |
| 1910 | int ssize, int dsize, int cn, double scale, DecimateAlpha* tab) { |
| 1911 | int k = 0; |
| 1912 | for (int dx = 0; dx < dsize; dx++) { |
| 1913 | double fsx1 = dx * scale; |
| 1914 | double fsx2 = fsx1 + scale; |
| 1915 | double cellWidth = std::min(scale, ssize - fsx1); |
| 1916 | |
| 1917 | int sx1 = ceil(fsx1), sx2 = floor(fsx2); |
| 1918 | |
| 1919 | sx2 = std::min(sx2, ssize - 1); |
| 1920 | sx1 = std::min(sx1, sx2); |
| 1921 | |
| 1922 | if (sx1 - fsx1 > 1e-3) { |
| 1923 | megdnn_assert(k < ssize * 2); |
| 1924 | tab[k].di = dx * cn; |
| 1925 | tab[k].si = (sx1 - 1) * cn; |
| 1926 | tab[k++].alpha = (float)((sx1 - fsx1) / cellWidth); |
| 1927 | } |
| 1928 | |
| 1929 | for (int sx = sx1; sx < sx2; sx++) { |
| 1930 | megdnn_assert(k < ssize * 2); |
| 1931 | tab[k].di = dx * cn; |
| 1932 | tab[k].si = sx * cn; |
| 1933 | tab[k++].alpha = float(1.0 / cellWidth); |
| 1934 | } |
| 1935 | |
| 1936 | if (fsx2 - sx2 > 1e-3) { |
| 1937 | megdnn_assert(k < ssize * 2); |
| 1938 | tab[k].di = dx * cn; |
| 1939 | tab[k].si = sx2 * cn; |
| 1940 | tab[k++].alpha = |
| 1941 | (float)(std::min(std::min(fsx2 - sx2, 1.), cellWidth) / cellWidth); |
| 1942 | } |
| 1943 | } |
| 1944 | return k; |
| 1945 | } |
| 1946 | |
| 1947 | // resize Area Fast |
| 1948 | template <typename T, typename WT, typename VecOp> |
no test coverage detected