DSP_Scaling*

構文


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

BOOL DSP_Scaling(src, dst, img_width, img_height, rx, ry, mode);
BOOL DSP_ScalingEx(src, dst, img_width, img_height, rx, ry, mode, x, y, width, height);
BOOL DSP_ScalingAsync(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の調停によって遅延が発生してしまいます。

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

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

処理時の補間方法は 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 からの終了通知を見逃し、いつまでもコールバックが返らない状態になります。非同期版と同時に行う別の処理では、DSP 割り込みを禁止しないようにしてください。

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

注意

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

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

参照

DSP_LoadGraphics, DSP_UnloadGraphics, DSP_ScalingFx*, OS_DisableIrq, DSP_CALC_SCALING_SIZE, DSP_CalcScalingFactor*

履歴

2009/04/03 「注意」項に引数に関する制約事項について追記
2008/10/22 同期関数内部の変更に伴う注意追記
2008/09/06 データ転送方法について追記
2008/08/28 「説明」項に倍率計算関数について追記、fx32版の説明とリンク追加
2008/08/18 非同期版の DSP 割り込み禁止の影響について追記
2008/05/22 初版