FB(4) — UNIX Programmer’s Manual
名称
fb − NEWS フレームバッファデバイスのインタフェース
形式
fb0 at iop addr ffe5d0 intr 44
/dev/fb
#include <newsiop/framebuf.h>
解説
fb インタフェースは、NEWS フレームバッファデバイスへのアクセスを行います。 白黒のビットマップディスプレイは、2048 × 2048 ピクセルの フレームバッファを持ち、そのうち 816 × 1024 が表示されます。 カラービットマップディスプレイのフレームバッファは 2048 × 1024 ピクセルで、 そのうち 1280 × 1024 が表示されます。 このフレームバッファのインタフェースによって、 データの読み書き、ラスタ操作、線引きなどが行えます。
操作は、 ioctl(2) システムコールを使用して行なわれます。 ioctl コールにより、フレームバッファの操作と同様にユーザ定義 (ユーザスペース) ビットマップ上の操作ができます。
カラー
カラービットマップディスプレイのフレームバッファは、4(または 8)個 のプレーンから成り、16(または 256)色が同時に表示されます。 赤、緑、青の 3 色は各 4(または 8)ビットで表され、 ユーザは、4096(または 1670 万)色のカラーパレットから色を選ぶことができます。
データタイプ
次のデータ構造体は、ビットマップ操作に使用されます。
typedef unsigned shortWord;
#define BitsPerWord16
typedef struct {
shortx, y;
} sPoint;
typedef struct {
sPoint origin;
sPoint extent;
} sRectangle;
typedef struct {
chartype;/∗ BM_FB、BM_MEM または BM_0 ∗/
chardepth;/∗ ビットマップのプレーン数 ∗/
unsigned short width;/∗ 幅(ワード単位) ∗/
sRectanglerect;/∗ 定義領域 ∗/
Word∗base;/∗ BM_MEM 用 ∗/
} sBitmap;
#define BM_FB0/∗ フレームバッファ ∗/
#define BM_MEM1/∗ メモリ内のビットマップ(XY 形式) ∗/
#define BM_02/∗ データ ‘0’ の仮想ビットマップ ∗/
Word は、サインなしの 16 ビット(1 ワード)と、定義されます。
sPoint 構造体は、ポイントのために使用します。
sRectangle の構造体は、矩形を作ることに使用されます。その origin (原点)は、左上角にあり、 extent は矩形の縦と横の長さを示します。
sBitmap の構造体は、ビットマップを定義するために使用されます。 type のフィールドは、ビットマップがメインメモリ内にあるか、 フレームバッファ内にあるかを示します。 BM_FB は、フレームバッファ内のビットマップであり、 BM_MEM は、メインメモリ内のビットマップです。 BM_MEM ビットマップは、XY 形式でデータが格納されています。 また、プレーン 0 のデータの次にプレーン 1 のデータがあり、 以降その順でずっと続いています。 BM_0 は仮想ビットマップで、そのデータは、すべて 0 です。BM_0 ビットマップは、 ラスタ操作において、ソースビットマップとしてのみ使用することができます。 depth フィールドは、ビットマップのプレーン数を与えます。 白黒フレームバッファのビットマップはプレーン数 1 をもち、 カラーフレームバッファでは 4 または 8 のプレーン数をもっています。 メインメモリ中のビットマップや BM_0 ビットマップでは、 カラー表示が使用されているかいないかにかかわらず、 1 または 4、8 プレーン数をもつことができます。
BM_MEM ビットマップの width (横幅)は、X 方向のワード数で与えます。 width は、BM_FB と BM_0ビットマップに指定することはできません。
rect フィールドは、ビットマップの大きさを与えます。 この領域内でのみ、操作が可能です。
base フィールドは、データのスタートポイントを指定します。
BM_MEM ビットマップの場合、データはワード境界で整列させなければなりません。 最初の列の最初のワードの最初のビットが、 rect.origin で指定した場所に対応します。 これは、1 のプレーン数をもつビットマップが (width ∗ rect.extent.y) ワードを 必要とすることを意味します。 ここで、width は rect.extent.x ビットを十分に含む大きさであるものとします。
IOCTL
FBIOCSETDIM
FBIOCGETDIM
これらは、ユーザが白黒ディスプレイの輝度を調べたり設定するためのものです。 輝度には、0 から 3 までのレベルがあります。 0 が最も明るく、デフォルト値になっています。 カラーディスプレイには、この機能がありません。
int dimmer_level;
ioctl(fildes, FBIOCSETDIM, &dimmer_level);
ioctl(fildes, FBIOCGETDIM, &dimmer_level);
FBIOCSETSCRMODE
FBIOCGETSCRMODE
これらは、ユーザがスクリーンモードを調べたり設定するために発行するもので、 BLACK_ON_WHITE(デフォルトの白地に黒) または WHITE_ON_BLACK(黒地に白)を 選ぶことができます。 BLACK_ON_WHITE モードでは、1 は黒、0 は白です。 WHITE_ON_BLACK モードでは、この値は反対になります。 これらは現在 サポートされていません。
/∗
∗ スクリーンモードの設定
∗/
#define BLACK_ON_WHITE 0 /∗ 白 - 0, 黒 - 1(デフォルト) ∗/
#define WHITE_ON_BLACK 1 /∗ 白 - 1, 黒 - 0 ∗/
int scrmode;
ioctl(fildes, FBIOCSETSCRMODE, &scrmode);
ioctl(fildes, FBIOCGETSCRMODE, &scrmode);
FBIOCBITBLT
このリクエストは、2 オペランドのラスタ操作(bitblt)のためのものです。 ソースおよびデスティネーションビットマップは、 メインメモリまたはフレームバッファにあるものです。 BM_0 ビットマップはソースのみに使用することができます。 ソースとデスティネーションビットマップのプレーン数は、 等しいか、またはいずれかのビットマップのプレーン数が 1 でなければなりません。
/∗ 2 オペランド bitblt ∗/
typedef struct {
unsigned char func; /∗ ファンクションコード ∗/
char transp; /∗ 透過性 ∗/
int fore_color; /∗ フォアグラウンド色 ∗/
int aux_color; /∗ 補色 ∗/
int planemask; /∗ プレーン選択 ∗/
sBitmap srcBitmap; /∗ ソースビットマップ ∗/
sRectangle srcRect; /∗ ソース矩形 ∗/
sBitmap destBitmap; /∗ デスティネーションビットマップ ∗/
sRectangle destClip; /∗ クリップ矩形 ∗/
sPoint destPoint; /∗ デスティネーションポイント ∗/
} sBitblt;
/∗ 機能 ∗/
#define BF_0 0x0 /∗ 0 ∗/
#define BF_SDA 0x1 /∗ Src(ソース) & Dest(デスティネーション) ∗/
#define BF_SDIA 0x2 /∗ Src & ~Dest ∗/
#define BF_S 0x3 /∗ Src ∗/
#define BF_SIDA 0x4 /∗ ~Src & Dest ∗/
#define BF_D 0x5 /∗ Dest ∗/
#define BF_SDX 0x6 /∗ Src ^ Dest ∗/
#define BF_SDO 0x7 /∗ Src | Dest ∗/
#define BF_SDOI 0x8 /∗ ~(Src | Dest) ∗/
#define BF_SDXI 0x9 /∗ ~(Src ^ Dest) ∗/
#define BF_DI 0xa /∗ ~Dest ∗/
#define BF_SDIO 0xb /∗ Src | ~Dest ∗/
#define BF_SI 0xc /∗ ~Src ∗/
#define BF_SIDO 0xd /∗ ~Src | Dest ∗/
#define BF_SDAI 0xe /∗ ~(Src & Dest) ∗/
#define BF_1 0xf /∗ 1 ∗/
/∗ プレーンマスク ∗/
#define FB_PLANEALL 0xff
#define FB_PLANE0 0x1
#define FB_PLANE1 0x2
#define FB_PLANE2 0x4
#define FB_PLANE3 0x8
#define FB_PLANE4 0x10
#define FB_PLANE5 0x20
#define FB_PLANE6 0x40
#define FB_PLANE7 0x80
sBitblt 構造体は、パラメータとして使用されます。 func フィールドは、ラスタ操作の機能コードを示します。 transp フィールドは、透過性に関するもので、値は 0 または 1 です。1 の場合、 0 の値をもつソースピクセルに対応するデスティネーションのピクセルは、 影響を受けません。
fore_color と aux_color のフィールドは、ソースビットマップのプレーン数が 1 の場合、 意味を持ちません。 値 1 をもつソースビットは、 対応するデスティネーションのピクセルとの操作を実行する前に、 fore-color(に対応したビットパターン)を値としてとります。 一方、bitblt は、その機能実行中、 値が 0 のソースビットは aux-color であるものとみなします。 たとえば、func が BF_S(ソースからデスティネーションへのコピー)であるならば、 値 1 をもつソースビットに対応するピクセルが、fore-color で表示され、 他のピクセルが aux-color で表示されます。
planemask フィールドは、操作にどのプレーンを使用するかを指定します。 planemask 中の 1 は、対応するプレーンを操作の対象とすることを bitblt に知らせます。 それが 0 であった場合には、そのプレーンは無視されます。 ビット N は、プレーン N と対応します。
フィールド srcBitmap と srcRect は、どのソースビットマップを操作に使用するかということを示します。
フィールド destBitmap と destPoint は、デスティネーションのビットマップを指定します。 destPoint は左上隅を示し、 ラスタ操作が行われる矩形の大きさは srcRect と同じです。 フィールド destClip は、デスティネーションのどの部分をクリッピングするかを指定する ために使用されます。
sBitblt bitblt;
ioctl(fildes, FBIOCBITBLT, &bitblt);
FBIOCBATCHBITBLT
このリクエストは、多くの bitblt 操作をバッチ処理で実行するために使用されます。 ソースやデスティネーションのビットマップは、 各操作を通じて同じですが、 ソースの矩形とデスティネーションポイントは、 それぞれで違っていてもかまいません。
typedef struct {
sRectangle srcRect; /∗ ソース矩形 ∗/
sPoint destPoint; /∗ デスティネーションポイント ∗/
} sSrcDest
/∗
∗ batch bitblt
∗/
typedef struct {
unsigned char func; /∗ 機能コード ∗/
char transp; /∗ 透過性 ∗/
int fore_color; /∗ フォアグラウンド色 ∗/
int aux_color; /∗ 補色 ∗/
int planemask; /∗ プレーン選択 ∗/
sBitmap srcBitmap; /∗ ソースビットマップ ∗/
sBitmap destBitmap; /∗ デスティネーションビットマップ ∗/
sRectangle destClip; /∗ クリップ矩形 ∗/
int nSrcDest; /∗ リスト中の src-dest の数 ∗/
sSrcDest ∗srcDestList; /∗ src-dest 指定のポインタ ∗/
} sBatchBitblt;
#define MAX_BATCHBITBLT 1024 /∗ src-dest リストの最大数 ∗/
sBatchBitblt 構造体は、sBitblt 構造体と似ており、 ソースとデスティネーションのビットマップを含んでいます。 srcDestList フィールドは、ソース矩形のリストとデスティネーションポイントのリストを指定し、その要素の数は nSrcDest フィールドに与えられます。
sBatchBitblt bbitblt;
ioctl(fildes, FBIOCBATCHBITBLT, &bbitblt);
FBIOCTILEBITBLT
このリクエストは、 ‘パターン塗りつぶし’ のラスタ操作で使用します。
/∗ タイル 2 オペランド bitblt ∗/
typedef struct {
unsigned char func; /∗ 機能コード ∗/
char transp; /∗ 透過性 ∗/
int fore_color; /∗ フォアグラウンド色 ∗/
int aux_color; /∗ 補色 ∗/
int planemask; /∗ プレーン選択 ∗/
sBitmap ptnBitmap; /∗ パターンビットマップ ∗/
sRectangle ptnRect; /∗ パターン矩形 ∗/
sPoint refPoint; /∗ 参照ポイント ∗/
sBitmap destBitmap; /∗ デスティネーションビットマップ ∗/
sRectangle destClip; /∗ クリップ矩形 ∗/
sRectangle destRect; /∗ デスティネーション矩形 ∗/
} sTileBitblt;
sTileBitblt 構造体は、パラメータの受け渡しに使用されます。 ptnBitmap と ptnRect フィールドは、使用するパターンを指定します。 refPoint フィールドは、塗りつぶし操作の参照ポイントを示します。 これは、その参照ポイントとパターンの左上隅が、 デスティネーションビットマップ上で一致するように作られるという意味です。 参照ポイントは、デスティネーション矩形またはそのクリップ矩形の 外側に指定することもできます。
sTileBitblt tbitblt;
ioctl(fildes, FBIOCTILEBITBLT, &tbitblt);
FBIOCPOLYLINE
このリクエストは、ユーザがポリライン(直線)を引くためのものです。 ユーザは自由に、線の色、線のパターン、ラスタ操作の機能コードを 指定することができます。
/∗ 線 ∗/
typedef struct {
unsigned int lptn; /∗ ラインパターン ∗/
short np; /∗ ポイント数 ∗/
sPoint ∗plist; /∗ ポイントリスト ∗/
int fore_color; /∗ フォアグラウンド色 ∗/
int aux_color; /∗ 補色 ∗/
int planemask; /∗ プレーン選択 ∗/
char transp; /∗ 透過性 ∗/
unsigned char func; /∗ ラスタ操作機能コード ∗/
char dlpf; /∗ 最終ポイント描画フラグ ∗/
sRectangle clip; /∗ クリップ矩形 ∗/
sBitmap drawBM; /∗ 描画するビットマップ ∗/
} sPrimLine;
/∗ ラインパターン(例) ∗/
#define LINE_SLD (unsigned)0xffffffff /∗ ソリッド ∗/
#define LINE_DSH (unsigned)0xfcfcfcfc /∗ ダッシュ - ∗/
#define LINE_DOT (unsigned)0xcccccccc /∗ ドット . ∗/
#define LINE_DSHDOT (unsigned)0xfff18fff /∗ ダッシュドット -. ∗/
#define LINE_DSHDOTDOT (unsigned)0xff8c63ff /∗ ダッシュドットドット -.. ∗/
sPrimLine 構造体は、ポリラインをリクエストするために使用します。 lptn フィールドを使って 32 ビットのラインパターンを指定することができます。 plist フィールドは、呼び出しにおいて np ポイントの受け渡しに使用します。np は、 ポイント数であって線の数ではありません。 fore_color、aux_color、planemask、transp と func フィールドの説明は、 FBIOCBITBLT を参照してください。 dlpf フラグは、リスト中の最後のポイントを描くか描かないかを指定します。 つまり、フラグが 0 であればそのポイントは描かれず、 他の場合は描かれます。 閉じた図形を描く場合に、このフィールドに 0 が使われます。 drawBM と clip フィールドは、ビットマップとクリップ矩形を別々に指定するのに使用されます。
sPrimline primline;
ioctl(fildes, FBIOCPOLYLINE, &primline);
FBIOCDJPOLYLINE
このリクエストは FBIOCPOLYLINE と似ています。 FBIOCPOLYLINE は、連続する線分を描くため使用されますが、 FBIOCDJPOLYLINE は不連続線に使用されます。 dlpf フィールドは、各線セグメントの終点を描くか描かないかを指定する ために使用されます。
sPrimline primline;
ioctl(fildes, FBIOCDJPOLYLINE, &primline);
FBIOCPOLYMARKER
このリクエストは、ポリマーカーを描くために使用します。 これは、指定したパターンといくつかのビットマップ間で ラスタ操作を実行するためのものです。
/∗ マーカー ∗/
typedef struct {
short np; /∗ ポイント数 ∗/
sPoint ∗plist; /∗ ポイントリスト ∗/
sRectangle ptnRect; /∗ パターン矩形 ∗/
sBitmap ptnBM; /∗ パターンビットマップ ∗/
int fore_color; /∗ フォアグラウンド色 ∗/
int aux_color; /∗ 補色 ∗/
int planemask; /∗ プレーン選択 ∗/
char transp; /∗ 透過性 ∗/
unsigned char func; /∗ ラスタ操作機能コード ∗/
sRectangle clip; /∗ クリップ矩形 ∗/
sBitmap drawBM; /∗ 描画するビットマップ ∗/
} sPrimMarker;
sPrimMaker 構造体は、ポリマーカーの描画に使用されます。 ptnBM と ptnRect フィールドは、ラスタ操作でどのパターンを使用するかを指定します。 フィールド plist と np は、ポイントリストとポイント数をそれぞれ与えます。
sPrimMarker primmarkers;
ioctl(fildes, FBIOCPOLYMARKER, &primmaker);
FBIOCRECTANGLE
矩形を与えられたパターンで埋めます。
/∗ 矩形を塗りつぶす ∗/
typedef struct {
sRectangle rect; /∗ 矩形 ∗/
sPoint refPoint; /∗ 塗りつぶし参照ポイント ∗/
sRectangle ptnRect; /∗ パターン矩形 ∗/
sBitmap ptnBM; /∗ パターンビットマップ ∗/
int fore_color; /∗ フォアグラウンド色 ∗/
int aux_color; /∗ 補色 ∗/
int planemask; /∗ プレーン選択 ∗/
char transp; /∗ 透過性 ∗/
unsigned char func; /∗ ラスタ操作機能コード ∗/
sRectangle clip; /∗ クリップ矩形 ∗/
sBitmap drawBM; /∗ 描画するビットマップ ∗/
} sPrimRect;
このリクエストは、 sPrimRect 構造体を使用します。 rect フィールドは、矩形を指定し、一方、 ptnBM と ptnRect フィールドは、その矩形を塗りつぶすパターンを指定します。 refPoint フィールドは、パターンの左上隅に一致させるポイントを含みます。 refPoint は、矩形とクリップ内にある必要はありません。
sPrimRect rect;
ioctl(fildes, FBIOCRECTANGLE, &rect);
FBIOCFILLSCAN
パターンによる塗りつぶしが、指定された走査線にそって実行されます。
/∗ 走査線配列 ∗/
#define SSCANL
typedef struct {
short y;
short x0, x1;
} sScanl;
/∗ パターンを塗りつぶす ∗/
typedef struct {
short nscan; /∗ 走査数 ∗/
sScanl ∗scan; /∗ 走査線データ ∗/
sPoint refPoint; /∗ 塗りつぶし参照ポイント ∗/
sRectangle ptnRect; /∗ パターン矩形 ∗/
sBitmap ptnBM; /∗ パターンビットマップ ∗/
int fore_color; /∗ フォアグラウンド色 ∗/
int aux_color; /∗ 補色 ∗/
int planemask; /∗ プレーン選択 ∗/
char transp; /∗ 透過性 ∗/
unsigned char func; /∗ ラスタ操作機能コード ∗/
sRectangle clip; /∗ クリップ矩形 ∗/
sBitmap drawBM; /∗ 描画するビットマップ ∗/
} sPrimFill;
sScanl 構造体は、走査線のために使用します。 一方、 sPrimFill 構造体は、すべてのパラメータの受け渡しに使用します。 scan フィールドは走査線の配列へのポインタを含み、 nscan フィールドは何本の走査線があるかを示します。パターンは、 ptnBM と ptnRect フィールドを使用することによって指定します。 また、 refPoint は、パターンの左上隅に設定しておく必要のある参照ポイントです。
sPrimFill fill;
ioctl(fildes, FBIOCFILLSCAN, &fill);
FBIOCTEXT
文字列が指定したフォントで書き込まれます。 使用されるフォントは、ビットマップフォントや ROM フォントです。
/∗ テキスト ∗/
typedef struct {
char type; /∗ ROM フォント、etc ∗/
short len; /∗ 文字列長 ∗/
unsigned char ∗str; /∗ 文字列 ∗/
sPoint p;
int dx, dy; /∗ ベクトル (左へ 16 bit シフトされている) ∗/
char ex_factor; /∗ 拡大ファクタ ∗/
sPoint fp; /∗ ビットマップフォント左上 ∗/
short width, height; /∗ フォント幅、フォントの高さ ∗/
short column; /∗ 1 列の文字数 ∗/
sBitmap fontBM; /∗ フォントビットマップ ∗/
int fore_color; /∗ フォアグラウンド色 ∗/
int aux_color; /∗ 補色 ∗/
char transp; /∗ 透過性 ∗/
unsighed char func; /∗ ラスタ操作機能コード ∗/
sRectangle clip; /∗ クリップ矩形 ∗/
sBitmap drawBM; /∗ 描画するビットマップ ∗/
} sPrimText;
/∗ ビットマップフォントタイプ ∗/
#define ROM_ASCII 0
#define ROM_KANJI 1
#define ASCII 2
文字を書くためには、 sPrimText 構造体を使用しなければなりません。 type フィールドは、どのフォントを使用するかを示します。
ROM_ASCIIROM font (1 バイトコード)
ROM_KANJIROM font (JIS 漢字コード)
ASCIIビットマップフォント(1 バイトコード)
len フィールドには、バイト単位で文字列の長さを与えます。 漢字を使用する場合、これが文字数と一致しないことに注意してください。 str フィールドは、文字列へのポインタです。 p フィールドは、最初の文字の左上角に一致するポイントにします。 dx と dy フィールドは、文字列を書く方向を示します。 たとえば、前に書かれた文字の 26 ドット右に水平に文字を書くとき、 dx=26<<16;dy=0 というように使用します。 ex_factor フィールドは、水平方向の拡大ファクタを示します。 たとえば、1 であれば通常の幅になり、2 であればその幅は 2 倍になります。 fp、width、height、 column フィールドは、フォントビットマップを定義します。 フォントビットマップの左上隅は fp で、 文字の幅や高さは、width と height によって決まります (文字の大きさは、一定であり、可変ピッチのフォントは、 サポートされていません)。 column フィールドには、一列の文字数が入ります。 フィールド first_chr と last_chr は、フォントビットマップの中にある最初と最後の文字を示します。
sPrimtText text;
ioctl(fildes, FBIOCTEXT, &text);
FBIOCGETSCRTYPE
このリクエストは、ビットマップディスプレイの型を返します。
/∗
∗ スクリーンタイプ
∗/
typedef struct {
short colorwidth; /∗ カラー幅 ∗/
short plane; /∗ プレーン数 ∗/
sRectangle bufferrect; /∗ フレームバッファ領域 ∗/
sRectangle visiblerect; /∗ 表示画面領域 ∗/
} sScrType;
sScrType 構造体は、パラメータを受け渡すために使用されます。 colorwidth フィールドは、カラーパレットの赤、緑、青の各値に使われるビット数を示します。 幅は 4 または 8 です。4 ならばバイト中の上位の 4 ビットが使用され、 8 ならば 8 ビット全部が使用されます。 plane フィールドはプレーンの数を示し、1 ならばモノクロディスプレイであり、 4(または 8)ならばカラーディスプレイです。 bufferrect フィールドは、フレームバッファの大きさを、 visiblerect フィールドは、フレームバッファの表示部分を示します。
sScrType scrtype;
ioctl(fildes, FBIOCGETSCRTYPE, &scrtype);
FBIOCGETPALETTE
FBIOCSETPALETTE
これらは、カラーパレットデータの読み書きをします。
/∗
∗ カラー
∗/
typedef struct {
short index; /∗ パレット番号 ∗/
struct {
short r, g, b;
} rgb;
} sPalette;
パレット番号は、0 から 15(4 プレーン)または 0 から 255(8 プレーン)の範囲です。 FBIOCGETPALETTE は、 index フィールドに渡されたパレット番号を要求します。 rgb フィールドは、コールされた後に書き込まれます。 FBIOCSETPALETTE は、index と rgb フィールドをユーザが設定するために使用します (rgb = 赤、緑、青)。
sPalette palette;
ioctl(fildes, FBIOCGETPALETTE, &palette);
ioctl(fildes, FBIOCSETPALETTE, &palette);
バグ
FBIOCSETSCRMODE と FBIOCGETSCRMODE は、サポートされていません。
関連ファイル
/dev/fb フレームバッファ
関連事項
NEWS-OSRelease 3.3