# DSP_ScalingFx*

## 構文

    BOOL DSP_ScalingFxAsyncEx(
            const void* src,
            void* dst,
            u16 img_width,
            u16 img_height,
            fx32 rx,
            fx32 ry,
            DSPGraphicsScalingMode mode,
            u16 x,
            u16 y,
            u16 width,
            u16 height,
            DSP_GraphicsCallback callback
        );

    BOOL DSP_ScalingFx(src, dst, img_width, img_height, rx, ry, mode);
    BOOL DSP_ScalingFxEx(src, dst, img_width, img_height, rx, ry, mode, x, y, width, height);
    BOOL DSP_ScalingFxAsync(src, dst, img_width, img_height, rx, ry, mode, callback);

## 引数

src | 変換元データを保持しているメインメモリ上のバッファ。
dst | 変換データを格納するメインメモリ上のバッファ。 変換後のデータが格納できるバッファサイズを確保しておく必要があります。
img_width | 変換元画像の横サイズ。
img_height | 変換元画像の縦サイズ。
rx | 横方向の倍率。 31〜0.001 の範囲で有効。小数点第4位以下は切り捨てられる。
ry | 縦方向の倍率。 31〜0.001 の範囲で有効。小数点第4位以下は切り捨てられる。
mode | 拡大（縮小）処理時の補間方法。DSPGraphicsScalingMode（後述）を指定する。
x | src の左上を(0, 0)とした座標空間における、処理を行いたい領域の x 座標。
y | src の左上を(0, 0)とした座標空間における、処理を行いたい領域の y 座標。
width | 処理を行いたい領域の横方向のサイズ。
height | 処理を行いたい領域の縦方向のサイズ。
callback | 処理終了時のコールバック関数。

## 返り値

処理が正常に終了した場合に TRUE を返します。
変換が正常に終了しなかった場合や、既にグラフィックスコンポーネントが何らかの処理を行っている場合はFALSEを返します。

## 説明

DSP を用いて、画像データの拡大（縮小）処理を行います。

src や dst が指すアドレスは 4バイトアラインメントする必要があります。

メインメモリから DSP(WRAM-C) 間のデータ転送は、AHBを使って行われます。
メインメモリとDSP間のデータ転送は、DMAによるデータ転送よりも優先度が低いため、Scailng 処理を行っている間に別の処理がDMA転送を頻繁に行うと、
AHBの調停によって遅延が発生してしまいます。

倍率は固定小数(fx32)で指定します。小数計算の過程で生じる桁落ちなどのため、変換後のサイズが意図した値と異なる場合がありますが、
DSP_ScalingFx* 関数による変換後のサイズは、マクロ `DSP_CALC_SCALING_SIZE_FX` で取得することができます。
また、変換後のサイズを引数にとることで、本関数に渡す倍率を取得できる `DSP_CalcScalingFactorFx32()` が用意されています。

なお、本関数には内部処理の設計上、引数として指定できる値に制約があります。詳しくは「注意」をご覧下さい。

処理時の補間方法は DSPGraphicsScalingMode として以下のように定義されています。

    typedef DSPWord DSPGraphicsScalingMode;
    #define DSP_GRAPHICS_SCALING_MODE_N_NEIGHBOR (DSPGraphicsScalingMode)0x0001
    #define DSP_GRAPHICS_SCALING_MODE_BILINEAR   (DSPGraphicsScalingMode)0x0002
    #define DSP_GRAPHICS_SCALING_MODE_BICUBIC    (DSPGraphicsScalingMode)0x0003

上から、最近傍法（ニアレストネイバー）、双線形補間法（バイリニア）、三次補間法（バイキュービック）です。
基本的に、処理時間はこの順に長くなっていきます。

非同期版（*Async)を実行した場合、変換終了は引数として登録したコールバック関数が呼ばれることで通知されます。
コールバック関数の呼び出しは DSP からの割り込みによって行われますので、`OS_DisableIrq()` などにより割り込み禁止状態になっていると、
いつまでもコールバックが返らない状態になります。非同期版と同時に行う別の処理では、DSP 割り込みを禁止しないようにしてください。

(*Ex)では、変換元画像中の任意の領域を指定して、そこだけを処理することができます。

## 注意

同期版の内部では `OS_Sleep()` によって処理の終了待ちを行っているため、`OS_InitThread(), OS_InitTick(), OS_InitAlarm()` を事前に呼んでおく必要があります。

本関数では下記の条件を満たしている場合、DSP 内部でいつまでも処理が終了しませんのでご注意下さい。
条件を満たしてしまった場合は、SDK_ASSERTMSG が呼ばれます。

- 処理後のデータサイズが元のデータサイズ以上になる場合

  mode | 条件
  DSP_GRAPHICS_SCALING_MODE_N_NEIGHBOR DSP_GRAPHICS_SCALING_MODE_BILINEAR | （出力データの幅）×（縦方向の倍率 ry）>= 8192
  DSP_GRAPHICS_SCALING_MODE_BICUBIC | （出力データの幅）×（縦方向の倍率 ry）>= 4096

- 処理後のデータサイズが元のデータサイズよりも小さくなる場合

  mode | 条件
  DSP_GRAPHICS_SCALING_MODE_N_NEIGHBOR DSP_GRAPHICS_SCALING_MODE_BILINEAR | （入力データの幅 width）>= 8192
  DSP_GRAPHICS_SCALING_MODE_BICUBIC | （入力データの幅 width）>= 4096

## 参照

`DSP_LoadGraphics, DSP_UnloadGraphics, DSP_Scaling*, OS_DisableIrq, DSP_CALC_SCALING_SIZE_FX, DSP_CalcScalingFactor*, fx32`

## 履歴

2009/04/03 「注意」項に引数に関する制約事項について追記
2008/10/22 同期関数内部の変更に伴う注意追記
2008/09/06 データ転送方法について追記
2008/08/28 初版