拡大縮小(6)

昨日のプログラムだと3$dw\lt~swなので、3$sxは毎ループ1以上増える。
なので、3$13$sxに毎ループ加算して、残りの部分を3$bigsxに加算し、3$dwを超えると3$sxを1つ増やすようにすればいい。
同様に3$2dw\lt~swの場合は、3$sxは毎ループ2以上増える。
なので、3$23$sxに毎ループ加算して、残りの部分を3$bigsxに加算し、3$dwを超えると3$sxを1つ増やすようにすればいい。
ということで、3$\frac{sw}{dw}の商と余剰を取って、それぞれを加算すればいい。

int sx = 0;
int dx = 0;
int sdiv = sw / dw;
int srem = sw % dw;
int sr = 0;
while( true ){
    if( dx >= dw) break;
    dst[ dx ] = src[ sx ];
    dx++;
    sx += sdiv; // 毎ループ sw / dw を加算する
    sr += srem; // 毎ループ sw % dw を加算する
    if( sr >= dw ){
        sx++;
        sr -= dw;  // sx を1つ増やしたので、こっちは dw だけ減る
    }
}

これで完成。
ARM は条件付き実行があるから結構高速なはず。