LIB2648(3X) — NEWS-OS Programmer’s Manual
名称
lib2648 − HP2648グラフィック端末のサブルーチン
形式
#include <stdio.h> typedef char ∗bitmat;
FILE ∗trace; cc file.c −l2648
解説
lib2648 は、 ヒューレットパッカード社 2648 グラフィック端末用の インタラクティブなグラフィックスに有用な 汎用ライブラリです。 このライブラリを 使用するには、 実行の開始時に ttyinit () ルーチンを、 また実行終了時に done () ルーチンを 呼び出さなくてはなりません。 端末での入出力は、 すべて rawcharおよび readline、 outchar、 outstr ルーチンのどれかを 通す必要があります。
getenv("term") で、 hp2648 が返される場合、 lib2648 は ^E/^F によるハンドシェイクを必ず行います。 そうするために tset でセットする必要があります。 他のいかなる値が返された時、たとえば 2648 など、 ハンドシェイクはできなくなります。
ビットマトリクス関連のルーチンが、 2648 のグラフィックメモリモデルとして提供されます。 これらのルーチンはいずれも有用ですが、 関数 update は特に有用で、 画面上にあるデータを 画面上でサポートされるデータへ、 効率的に変換します。 主なビットマトリクス関連ルーチンは、 newmat および mat、 setmat です。
ファイル trace がナルでなければ、 このファイルには、 fopen で返されるファイル記述子が必要です。 オープンを すると、 このファイルへの書き込みによって、 lib2648 は出力の状況を トレースします。 これによって、 画面を 台無しにしたり、 エスケープシーケンスが送られたりすることなく、 グラフィックスを用いたプログラムの出力が得られ、 デバッグを容易にします。 トレースの代表的な使い方は、 次のプログラムを 含みます。
switch (argv[1][1]) {
case ’T’:
trace = fopen("trace", "w");
break;
...
if (trace)
fprintf(trace, "x is %d, y is %d", x, y);
...
dumpmat("before update", xmat);
ルーチン
agoto(x,y)
文字カーソルを 座標(x,y)へ移動します。 座標(x,y)は、 画面の左上端を 原点として数えます。
aoff() 文字画面を、 オフにします。
aon() 文字画面を オンにします。
areaclear(rmin,cmin,rmax,cmax)
4個の引数で囲まれたグラフィック画面上の領域を クリアします。 通常モードの場合、 クリアされた範囲はすべて、 黒に設定されます。 また、 反転ビデオモードの場合はすべて、 白に設定されます。
beep()
端末上で、 ベルを 鳴らします。
bitcopy(dest,src,rows,cols)bitmat dest,
rows × cols のビットマトリクスを、 src から dest (ユーザが用意している)へコピーします。
cleara()
文字画面を クリアします。
clearg()
グラフィック画面を クリアします。 ただし、 2648 端末では、 画像が拡大されている場合、 表示されている部分しかクリアしません。
curoff()
グラフィックカーソルを 消します。
curon()
グラフィックカーソルを 表示します。
dismsg(str,x,y,maxlen) char ∗str;
グラフィックテキストの座標 (x,y) に、 メッセージ str を表示します。 メッセージの最大文字数を maxlen に与えます。 これは、 メッセージを 描画する前に、 どれだけの範囲を クリアすれば良いかを dspmsg に知らせるために必要です。 座標 (x,y) は、 出力メッセージの第1文字目の左下端を示します。
done()
プログラム終了前に必ず呼ばれなければなりません。 tty を 通常に戻し、 グラフィック画面を オフにし、 そして文字画面を オンにして標準出力を フラッシュするなどの処理を 行います。
draw(x,y)
現在のペン位置から座標 (x,y) へ線を 描きます。 すべてのグラフィック座標と同じように、 座標 (x,y) は、 画面の左下端を 原点として数えます。 座標 (x,y) は、 普通のデカルトシステムの第1象限を 表します。
drawbox(r,c,color,rows,cols)
グラフィック画面に矩形を 描きます。 矩形は、 左下端が (r,c) に位置し、 高さ rows 行、 幅 cols 列の大きさを 持ちます。 色指定 color が 1 ならば矩形が表示され、 0ならば消去されます。 座標 (r,c) は、 画面左下を 原点とした、 垂直位置と水平位置の絶体座標です。 これらは、 順番が逆になることを 除けば、 先に述べた座標 (x,y) と同じです。
dumpmat(msg,m,rows,cols) char ∗msg; bitmat m;
ファイル trace がナルでなければ、 ASCII表記されたマトリックス m を、 trace ファイルに書き出します。 msg は、 出力を 識別するためのラベルです。
emptyrow(m,rows,cols,r)bitmat m;
マトリクス m の r 行目の値がすべて 0 ならば 1 を 返し、 そうでなければ 0 を 返します。 このルーチンが、 ライブラリに加えられているわけは、 一連の mat 呼び出しを するよりも、 マトリクスの内部表現を 熟知することによって、 より効率的に実行できるからです。
error(msg) char ∗msg;
デフォルトのエラーハンドラ。 message(msg) を 呼び出し、 リターンします。 このルーチンは、 lib2648 中の特定のルーチンから呼び出されます。 また、 ユーザプログラムから呼び出すこともできます。 凝ったグラフィックプログラムが、 独自のエラープロシージャを 持ち、 プログラムを 再開するために setjmp(3) を 使用する場合には、 とても良い方法です。
gdefault()
端末に、 デフォルトのグラフィックモードを セットします。
goff() グラフィック画面を オフにします。
gon() グラフィック画面を オンにします。
koff() キーパッドを オフにします。
kon() キーパッドを オンにします。 つまり、 端末にあるたいていの特殊キー(例えばカーソル用の矢印キーなど)は、 それらの機能を ローカルに動作する代わりに、 エスケープシーケンスを 送信します。
line(x1,y1,x2,y2)
現モードで座標 (x1,y1) と (x2,y2) を 結ぶ直線を 描きます。 同じ位置から何度も直線を 描くという端末のバグが補正されることを 除けば、 このルーチンは、 move(x1,y1); draw(x2,y2); と同じです。
lowleft()
文字カーソルを、 画面の左下端へ移動(ホームダウン)します。
mat(m,rows,cols,r,c) bitmat m;
ビットマトリクスから要素を 取り出すのに使用します。 高さ rows ×幅 cols のマトリクス m の要素 [r,c] の値として、 1 または 0 を 返します。 座標 (r,c) は、 マトリクスの左上端を (0,0) として数えます。 r は垂直位置を 表し、 c は水平位置を 表します。
message(str) char ∗str;
グラフィック画面の最下行に、 テキストメッセージ str を 表示します。
minmax(g,rows,cols,rmin,cmin,rmax,cmax) bitmat g;
int ∗rmin, ∗cmin, ∗rmax, ∗cmax;
ビットマトリクス g 中から、 すべての要素の値が 1(オン) である、 最も小さい矩形を 検索します。 その座標は、 rmin、 cmin、 rmax、 cmax で指し示される各変数に返されます。
move(x,y)
ペンを 座標 (x,y) へ移動します。 この移動は内部的なもので、 後述される sync() を 起動するまで、 出力されません。
movecur(x,y)
グラフィックカーソルを 座標 (x,y) へ移動します。
bitmat newmat(rows,cols)
rows × cols の大きさの、 新しいビットマトリクスを 作成します (malloc(3) を使用する)。 作成された値(例えば、 最初の位置を 指すポインタ)が返されます。 ビットマトリクスは、 ‘free’ によって直接解放されます。
outchar(c) char c;
標準出力に、 文字 c を出力します。 端末への出力はすべて、 このルーチンか、 あるいは outstr ルーチンを 通らなければなりません。
outstr(str) char ∗str
標準出力に、 文字列 str を 出力します。 これは、 outchar ルーチンを 何回も呼び出して実現しています。
printg()
グラフィック画面に表示してあるデータを、 プリンタへ出力します。 プリンタは、 HPIB のデバイス6(デフォルト) と同じに構成されていなければなりません。
char rawchar()
端末から 1 文字入力し、 その値を 返します。 getchar(3) よりはむしろ、 rawchar あるいは readline ルーチンの方を すべての入力を 受け取るのに使うべきです。
rboff()
ラバーバンドラインを オフにします。
rbon()
ラバーバンドラインを オンにします。
char ∗rdchar(c) char c;
文字 c を表示可能なように変換して 返します。 c が印刷可能な文字ならば c 自身を 返し、 コントロール文字ならば ^X 表記で返します。 また、 c が負の値であれば、 アポストロフィーを 先頭に付けて返されます。 スペースであれば ^´ を 返し、 rubout であれば ^? を 返します。
注意 : スタティック領域を 指すポインタが返されます。 このため、 同じ fprintf/sprintf ルーチンの呼び出しに対して、 rdchar の値を 2回渡すと正しく動作しません。 代わりに、 strcpy を 使用して、 自分で定義したバッファに値の 1つを 格納しておかなくてはなりません。
readline(prompt,msg,maxlen) char ∗prompt,∗msg;
グラフィック画面の最下行に、 プロンプト (prompt) を表示し、 復帰改行文字で終了する1行のテキストを、 ユーザから読み込みます。 この文字列を、 maxlen 文字分のサイズを 持つバッファ msg にセットします。 また、 バックスペース処理がサポートされています。
setclear()
消去モードで直線を 描くようにディスプレイを 設定します (反転ビデオモードの場合には、 逆になります)。
setmat(m,rows,cols,r,c,val) bitmat m;
ビットマトリクスの要素に値を 格納するという、 基本的な操作です。 マトリクス m の要素 [r,c] に、 値 val を セットします。 valは、 0 あるいは 1 のどちらかにしてください。
setset()
ノーマル(ソリッド)モードで、 直線を 描くようにディスプレイを 設定します (反転ビデオモードの場合には、 逆になります)。
setxor()
排他的論理和モードで、 直線を 描くようにディスプレイを 設定します。
sync()
保持されている出力を すべて、 強制的に画面に表示させます。 これに続いて、 fflush(stdout) が実行されます。 カーソルには、 この機能による影響はありません。 ただし、 rawchar および readline が、 自動的に sync() と fflush(stdout) を 呼び出しているので、 通常、 sync を 呼び出す必要はありません。
togvid()
ビデオの状態を 切り替えます。 ノーマルモードであれば、 反転ビデオモードになり、 逆も同様になります。 画面は、 ライブラリの内部状態と同様に反転されます。
ttyinit()
処理に備えて、 端末を 準備します。 このルーチンは、 実行の前に呼び出されなければなりません。 また、 これは、 端末を CBREAKモードにして、 エコーを オフにし、 種々のモードを 適切に設定し、 さらにライブラリを 初期化します。
updata(mold,mnew,rows,cols,baser,basec) bitmat mold,mnew;
画面上のウィンドウを mnew のように見せるために必要な、 すべての変更を 行います。 mold は、 画面上のウィンドウが、 現在どのように見えるかを 示します。 ウィンドウは、 rows × cols のサイズで、 その左下端の画面上での座標は、 [baser,basec] です。
注意 : update は、 画面全体を 使用するようには意図されていません。 画面全体を 使用した場合、 動作はしますが、 処理速度は遅い上に、 mold と mnew に 64K バイトもメモリを 使います。 この関数は、画面中央の 100×100 程度の大きさでオブジェクトを持つ ウィンドウのようなもののために作られました。 また、この程度のものには大変高速です。
vidinv()
反転ビデオモードに設定します。
vidnorm()
ノーマルビデオモードに設定します。
zermat(m,rows,cols) bitmat m;
ビットマトリクス m を、 すべて 0 にセットします。
zoomn(size)
ハードウェアズームを 値 size に設定します。 値は、 1 から 15 の範囲です。
zoomoff()
ズームを オフにします。 このルーチンは、 現在の内部ズーム番号に関係なく、 強制的に画面を ズームレベル 1 にします。
zoomon()
ズームを オンにします。 このルーチンは、 あらかじめ指定されたズームサイズに画面を 復元します。
診断
error ルーチンは、 エラーが検出されたときに呼び出されます。 検出されるエラーは、 readline に与えられたバッファのオーバーフローのみです。
setmat に関するオーバーフローは、 何も設定しないで戻ります。
関連ファイル
/usr/lib/lib2648.a
関連事項
著者
Mark Horton
バグ
このライブラリは、 サポートされていません。 端末のすべての機能を 使用するようにはできていません。 このライブラリは、 fed で使用するに必要なものだけです。 ライブラリの機能強化には、 ユーザからの助力が必要です。
^E または ^F でハンドシェイクしても、 HP2648 端末は通信速度が 2400 ボーを 超えると、 少々信頼できなくなります。 信頼性を 向上させるためには、 32文字毎にハンドシェイクします(マニュアルには、 ハンドシェイクを 80文字毎にすればよいと書いてあります)。 しかし、 それでも、 I/Oエラーがよく起こります。
ライブラリのソースを 修正なしで、 トレースファイル に書き込まれるデバッグ情報を コントロールする方法はありません。
NEWS-OSRelease 4.2.1R