| 1502 | } |
| 1503 | |
| 1504 | int compute_resize_area_tab( |
| 1505 | int ssize, int dsize, int cn, double scale, DecimateAlpha* tab) { |
| 1506 | int k = 0; |
| 1507 | for (int dx = 0; dx < dsize; dx++) { |
| 1508 | double fsx1 = dx * scale; |
| 1509 | double fsx2 = fsx1 + scale; |
| 1510 | double cellWidth = std::min(scale, ssize - fsx1); |
| 1511 | |
| 1512 | int sx1 = ceil(fsx1), sx2 = floor(fsx2); |
| 1513 | |
| 1514 | sx2 = std::min(sx2, ssize - 1); |
| 1515 | sx1 = std::min(sx1, sx2); |
| 1516 | |
| 1517 | if (sx1 - fsx1 > 1e-3) { |
| 1518 | megdnn_assert(k < ssize * 2); |
| 1519 | tab[k].di = dx * cn; |
| 1520 | tab[k].si = (sx1 - 1) * cn; |
| 1521 | tab[k++].alpha = (float)((sx1 - fsx1) / cellWidth); |
| 1522 | } |
| 1523 | |
| 1524 | for (int sx = sx1; sx < sx2; sx++) { |
| 1525 | megdnn_assert(k < ssize * 2); |
| 1526 | tab[k].di = dx * cn; |
| 1527 | tab[k].si = sx * cn; |
| 1528 | tab[k++].alpha = float(1.0 / cellWidth); |
| 1529 | } |
| 1530 | |
| 1531 | if (fsx2 - sx2 > 1e-3) { |
| 1532 | megdnn_assert(k < ssize * 2); |
| 1533 | tab[k].di = dx * cn; |
| 1534 | tab[k].si = sx2 * cn; |
| 1535 | tab[k++].alpha = |
| 1536 | (float)(std::min(std::min(fsx2 - sx2, 1.), cellWidth) / cellWidth); |
| 1537 | } |
| 1538 | } |
| 1539 | return k; |
| 1540 | } |
| 1541 | |
| 1542 | // resize Area Fast |
| 1543 | template <typename T, typename WT, typename VecOp> |
no test coverage detected