Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ ibs_2drzoom(3X) — NEWS-os 4.2.1R

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

libibs(3X)

ibs_zoom(3X)

ibs_encode(3X)

ibs_decode(3X)

ibs_geioerror(3X)

IBS_2DZOOM(3X)  —  NEWS-OS Programmer’s Manual

名称

ibs_2dzoom_open, ibs_2dzoom, ibs_2dzoom_getworksize, ibs_2drzoom_open, ibs_2drzoom − イメージデータの拡大縮小を行う

形式

ibs_2dzoom_open(iniw, inx, inw, inh, outiw, outx, outw, outh,
flag, mode, work, inf, inarg, outf, outarg)
int iniw, inx, inw, inh;
int outiw, outx, outw, outh, flag, mode;
int ∗work;
int (∗inf)();
int inarg;
int (∗outf)();
int outarg;

ibs_2dzoom(inimgadr, outimgadr, work)
char ∗inimgadr, ∗outimgadr;
int ∗work;

ibs_2drzoom_open(iniw, inx, inw, inrh, outiw, outx, outw, outrh,
flag, mode, work, inf, inarg, outf, outarg)
int iniw, inx, inw, inrh;
int outiw, outx, outw, outrh, flag, mode;
int ∗work;
int (∗inf)();
int inarg;
int (∗outf)();
int outarg;

ibs_2drzoom(c, inimgadr, outimgadr, work)
int c;
char ∗inimgadr, ∗outimgadr;
int ∗work;

ibs_2dzoom_getworksize(iniw, inw, outiw, outw, flag, mode)
int iniw, inw, outiw, outw, flag, mode;

解説

これらの関数はイメージデータを 1 行ずつ水平 (x) 方向に 拡大縮小した後に垂直 (y) 方向に拡大縮小する関数です。

ibs_2dzoom_open 、 ibs_2dzoom は垂直方向の拡大縮小を inh、outh の値を そのまま、高さとして実行します。

ibs_2drzoom_open 、 ibs_2drzoom は垂直方向の拡大縮小を inrh、outrh の値を 入力データと出力データの高さの比として実行します。

ibs_2dzoom_open は、拡大縮小を行うために必要な変数をセットします。
iniw 、 inx 、 inw 、 inh は入力データの領域を指示します。
outiw 、 outx 、 outw 、 outh は出力データを格納する領域を指示します。
iniw 、 outiw はイメージ幅(ドット)で、8 の倍数でなければなりません。
inx 、 outx は行の中で実際にデータが置かれる位置を左端を 0 として ドット単位で指示します。
inw 、 outw はイメージデータの長さ(ドット)です。 どのような場合でも ( inx + inw ) が iniw を、あるいは ( outx + outw ) が outiw を超えてはいけません。
inh は入力イメージの高さ、 outh は出力イメージの高さです。
flag は、 outf にそのまま渡されます。
mode に 0 を指定すると、縮小時に隣接するドットとの論理和を取ります。
work は内部で使う作業領域で、 関数 ibs_2dzoom_getworksize によって得られる値より大きな 領域を確保しておかなければなりません。
この作業領域 は拡大、縮小がすべて終わるまで変更してはいけません。
inf 、 outf は、入出力関数へのポインタです。 inf 、 outf には 0 を指定することができ、その場合には デフォルトの入出力関数が使われます。 この場合、入出力関数の形式や内部表現についての知識は必要ありません。
inarg 、 outarg はそれぞれ関数 inf  、  outf にそのまま渡されます。

inf はイメージデータを読み込んで変化点の配列に変換するための入力関数です。
inf に 0 が指定された場合、デフォルトの入力関数 ibs_encode が呼ばれます。 inf は次のような形をしていて、 エラーのときは負となるようなリターン値を持たなくてはなりません。

int (∗inf)(inarg, imgadr, iw, w, x, sline, flag)
int inarg;
char ∗imgadr;
int iw, w, x;
int ∗sline;
int flag;

inarg 、 flag は ib_2dzoom_open で設定されたものが渡されます。
iw 、 w 、 x にはそれぞれ、 iniw 、 inw 、 inx が渡されます。
imgadr には inimgadr が渡されます。
この関数の中では imgadr で示されるイメージデータを変更してはいけません。
sline は変化点の配列です。 ( inw + 2 ) ∗ 4 バイトの大きさを持っています。
変化点については、 ibs_encode あるいは、 ibs_decode を参照してください。

outf は変化点の配列をイメージデータに復元して、 出力バッファへ書き出すための出力関数です。 outf に NULL が指定された場合、デフォルトの出力関数 ibs_decode が呼ばれます。
ここで、出力関数 outf は次のような形をしていて、 エラーのときは負となるようなリターン値を持たなくてはなりません。

int (∗outf)(outarg, imgadr, iw, w, x, sline, flag)
int outarg;
char ∗imgadr;
int iw, w, x;
int ∗sline;
int flag;

outarg 、 flag は ib_2dzoom_open で設定されたものが渡されます。
iw 、 w 、 x にはそれぞれ、 outiw 、 outw 、 outx が渡されます。
imgadr には outimgadr が渡されます。
sline は変化点の配列をさしています。 この関数の中で sline については何も変更してはいけません。
変化点については、 ibs_encode あるいは、 ibs_decode を参照してください。

ibs_2drzoom_open は、 ibs_2dzoom_open と同様に拡大縮小を行うために必要な変数をセットしますが、 ibs_2dzoom_open での inh、outh のかわりに inrh、outrh には、入力イメージと出力イメージとの高さの比をセットします。

ibs_2dzoom は実際に拡大縮小を行います。
inimgadr、 outimgadr は入力、出力バッファを指し示すのに使われます。
inimgadr、 outimgar は偶数アドレスになければなりません。

ibs_2drzoom は実際に拡大縮小を行います。
c が 0 でないときは、ibs_2dzoom と同じ動作をします。
c が 0 のときには、ibs_2dzoom は、もしまだ書き出していない 行があれば書き出して、0 を返します。

ibs_2dzoom_getworksize は work に必要な領域の大きさを返します。 たとえば、大きさの異なるイメージを扱うときには得られた値の最大値を 使用しなければなりません。 現在のバージョンでは、 (( inw + 2) ∗ 8) + outiw ∗ 2 / 8 + 256 が返されます。

使用例

以下は、 ibs_2dzoom_open 、 ibs_2dzoom の使用例です。

.
.
.
w8 = iniw / 8;
ow8 = outiw / 8;
if ((err = ibs_2dzoom_open(iniw, inx, inw, inh,
outiw, outx, outw, outh, flag, mode, work, inf, inarg,
outf, outarg)) < 0) {
exit(1);
}
do {
switch(err = ibs_2dzoom(inimgadr, outimgadr, work)) {
case 1: /∗ 出力行のみの更新 ∗/
outimgadr += ow8;
break;
case 2: /∗ 入力行のみの更新 ∗/
inimgadr += w8;
break;
case 3: /∗ 入力、出力行ともに更新 ∗/
inimgadr += w8;
outimgadr += ow8;
break;
case 0: /∗ すべての行の処理が終了 ∗/
goto end;
default: /∗ エラー ∗/
exit(1);
}
}while(1);
end:
.
.
.

二次元の拡大縮小では、水平方向については関数を呼び出すだけで 拡大縮小がなされますが、垂直方向については関数のリターン値によって、 入力行を読みとばす場合(縮小)、同じ入力行をもういちど使用する場合(拡大)、 入力出力行ともに新しい行を使用する場合があります。
すべての行の処理が終了した場合には 0 が返ります。

また、 ibs_2drzoom_open 、 ibs_2drzoom を使用した場合は以下のようになります。

.
.
.
w8 = iniw / 8;
ow8 = outiw / 8;
if((err = ibs_2drzoom_open(iniw, inx, inw, inrh,
outiw, outx, outw, outrh, flag, mode, work, inf, inarg,
outf, outarg)) < 0) {
exit(1);
}
for(c = outh; −−c >= 0;) {
switch(err = ibs_2drzoom(c, inimgadr, outimgadr, work)) {
case 1: /∗ 出力行のみの更新 ∗/
outimgadr += ow8;
break;
case 2: /∗ 入力行のみの更新 ∗/
inimgadr += w8;
break;
case 3: /∗ 入力、出力行ともに更新 ∗/
inimgadr += w8;
outimgadr += ow8;
break;
case 0: /∗ すべての行の処理が終了 ∗/
goto end;
default: /∗ エラー ∗/
exit(1);
}
};
.
.
.

ibs_2drzoom_open 、 ibs_2drzoom の場合は、 ibs_2dzoom_open 、 ibs_2dzoom の inh、outh (入力、出力の実際の高さ)ではなく、 inrh、outrh (入力、出力の高さの比)が用いられます。 また、c を 0 にすること によって明示的に最後の行であることを指示しなければなりません。
ibs_2drzoom は c が 0 である場合に 0 を返します。

リターン値

正常に終了したときには ibs_2dzoom_open、ibs_2drzoom_open は 0 を ibs_2dzoom、ibs_2drzoom の場合はともに 0、1、2、3 の 4 種類の値のうちのどれかを返します。 値については、使用例をご覧ください。
パラメータにエラーがあったときは −1 が返されます。

inf にエラーが生じたときは −2 が返されます。 outf にエラーが生じたときは −3 が返されます。
また、作業領域 work が破壊されている場合は −4 を返します。

inf 、 outf で生じたエラーについては、 ibs_getioerror を呼ぶことによって何が返されたか知ることができます。

関連ファイル

/usr/sony/lib/libibs.a

関連事項

libibs(3X), ibs_zoom(3X), ibs_encode(3X), ibs_decode(3X), ibs_geioerror(3X)

NEWS-OSRelease 4.2.1R

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026