Plan 9におけるgraphics programmingの分かり易い文書が見あたらないので, ここに軽い気持でメモを書いて見る気になりました. ただし, 私のPlan 9の理解もいまだ完全ではないので, ややもすると間違った事を 書くかも知れませんが, それらについては, 徐々に改善して行きたいと思います.
<<8½の実装>>
Plan 9では, bitmap graphicsは8½上で行われる事になります. 8½はファイルサーバと
して実装されていますので, graphics関係の機能の呼びだしは, 8½が提供する
ファイルへのwrite/readで行われます. これだけならば, 非常にすっきりしていて
理解もずっと易しいのですが, 実際の実装では, 直接画面に書いたり, マウスからの
イベントを取得したりするもっとも基本的な機能はカーネルに内臓されたデバイス
(ファイルシステムとして)が行います. これはbit(3)と呼ばれるPlan 9のカーネル
デバイス(/sys/src/9/port/devbit.c)で, システムが立ち上がった時,
bind -a '#'b /dev
で/devディレクトリ下に
この中で, /dev/screenは読み出し専用でterminalのscreenの内容を示すbitmapを保持して
います. /dev/mouseをreadすると,
m buttons[1] x[4] y[4] msec[4]
のフォーマットでマウスの状態を返します. /dev/mousectlにwriteする事で, マウスを
configureしたり, controlしたりできます. これらは名前から直観的に分る通りの
働きですので, 詳しい事はオンラインマニュアルのbit(3)を読んで下さい.
問題は/dev/bitblt (bit block transfer)ですが, このファイルに命令をwriteする事に よって, 全てのgraphic routineの基本的な操作が行われます. 全体で23個の命令があり, その命令のフォーマットは, 先頭にアルファベット小文字で一文字で命令の種類を示し, その種類毎に可変なテキスト形式のargumentsが続きます. その種類とは, 大きく分けて, 1)bimap 2)font 3)subfontを操作するものに分かれます. これも詳しくはbit(3)を見て 下さい. この最下層をなすルーティンのソースは/sys/src/libgnotの下にgnotマシンを抽象 マシンとして書かれています.
命令の種類によっては, /dev/bitbltにwriteしたあと, 引きつづいてreadすれば, 必要な 情報が返されます(a, i, j, m, n, r命令).
8½が起動されると, 更に幾つかのファイルが/mnt/8½にmountされ, これらが/devに
bindされますので, これらのファイルにread/writeすることで, Plan 9におけるgraphicsを
行う事になります. それらのファイルとは,
<<ユーザプログラムからgraphics routineの呼び出し>>
Plan 9においては, ユーザレベルで呼びだし可能なlow level関数群がlibg(libg.h), high levelな関数群がlibframe(frame.h), liblayer(layer.h), libpanel(panel.h)に それぞれ用意されています. またPlan 9でのdefaultのimage file formatであるpicfile(9.6)形式はlibfb(fb.h)で 定義され, そのopen, close, read/write等が定義されています.
libframeはテキストをあるwindow(:=bitmap)中で見えるか見えないかを扱うのに frameという概念を導入し, 8½で長いテキストを扱うのを簡単にします. liblayeはPlan 9の特徴であるoverlap windowを簡単に扱える様にしますし, libpanelはwindow中でbutton等の各種のwidgetを扱い易くします.
<<参考>>
以下のman pagesがそれぞれのライブラリのより詳しい情報を与えてくれます.
April 20, 1999 Kenji Okamoto
okamoto@granite.las.osakafu-u.ac.jp