
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 初版