110gc -- DataScope Graphics Component

ライブラリリファレンス - gcBit

gcAppgcHeapgcObjgcRgnをまず参照してください。


gcBitクラス

ビットマップを管理し、描画を行なうクラスです。 gcBitは、次のように宣言されています。
typedef struct {
  gcBit_v* v; //予約、未使用
  void* d; //領域データへのポインタ
} gcBit;
(gcBit*)->d は、隠蔽データ構造である gcBit_d へのポインタとなっています。 通常のアプリケーションがこの隠蔽データへ直接アクセスする必要はありません。 固定のビットマップの場合は、ビットマップファイルをgcconvで変換して、 それをgcBitLinkDataでgcBitにするのが普通です。 また、ヒープ中に指定された大きさのワークエリア用ビットマップを確保する関数や、 DS110OSで使用している画面バッファをビットマップとして返す関数を 用いるのが普通です。

隠蔽データ構造gcBit_dには2種類あります。 1つは、隠蔽データの内部にビットマップデータが並ぶもので、 もう一つは、ビットマップデータへのアドレスを持つものです。

隠蔽データ自体にビットマップデータを含む場合は、次のようになります。

typedef struct {
  short 0;        //必ず0
  short bytes;    //横バイト数、偶数
  byte  bitdata[];  //データが並ぶ
} gcBit_d;
ビットマップの横幅は必ずワード界つまり16ビット単位です。 データの並びは、DS110OSの画面バッファと互換性があり、 バイト単位で最上位ビットが左側のドットとなり、 次のバイトデータがその右側の8ドット分、1行が終ると下の行の左端に続きます。

ビットマップデータのアドレスを指定する場合、次のようになります。

typedef struct {
  short 1;        //必ず1
  short bytes;    //横バイト数、偶数
  void* addr;     //データが格納されているアドレス
} gcBit_d;
いずれの場合でも、 ビットマップには横幅以外の情報を含まないことに注意してください。 つまり、gcBitの関数群では、ビットマップの大きさは承知しておらず、 どこに描画したらよいかの情報はすべて描画領域 (gcRgn) で指定されます。

gcBit* gcBitAlloc(short w, short h);

指定した大きさのビットマップをヒープに確保してそのビットマップを返します。 w, h はドット単位で与えます。 返されるビットマップはデータ内部保持形式ですが、 ビットマップの内容自体は不定です。

w, hは、あくまで使用メモリ量を算出するために渡すものであり、 実際の描画がそのエリア内にクリッピングされるわけではありません。 クリッピングしたい場合には、gcRgn関数群を使ってください。
【戻り値】0 ☆メモリ不足
その他正常


gcBit* gcBitAllocAddr(short w, void* addr);

指定したアドレスから始まるデータをビットマップとして定義し、 そのビットマップを返します。 w はドット単位で与えます。 返されるビットマップはアドレス指定形式になります。

gcconvの制御行引数 t=1 を与えて変換したビットマップデータに対して、 この関数を呼び出してビットマップを作成することが可能です。
【戻り値】0 ☆メモリ不足
その他正常


gcBit* gcBitLinkData(void* data, short mode);

隠蔽データ構造を示すビットマップを作成します。 この関数は、gcObjLinkData関数と全く同一です。modeは通常0を指定します。

ビットマップファイルをgcconvで変換してビットマップを作成する場合に この関数を用います。 その場合のgcconvの制御行の引数 t=0 (デフォルト) を指定します。
【戻り値】0 ☆メモリ不足
その他正常


gcBit* gcBitLcd();

DS110OSで使用している、画面バッファを示すビットマップを返します。 この関数は、gcBit構造体自体もスタティックに保持しているため、 必要な時に何回でも呼ぶことができますが、 返されたgcBit*を開放してはいけません。

DS110の画面バッファは、 キーボードを右側へ持っていきLCD画面を横長にした状態で定義されます。 この状態で左上のドットが最初のバイトの最上位ビットであり、 以後右方向へ進み横320ドットで40バイト、縦200ドットで計8000バイトになります。 黒いビットが1になります。 画面バッファのうち、上部320x8ドットの部分は、インジケータとして 使用されるため、アプリケーションからの使用には適しません。

画面バッファビットマップにgcBitCopyなどで転送しても、 直接LCDが書き代わるわけでもなんでもありません。 LCDに変更を反映したい場合は、gcBitDisplay関数を呼んで下さい。


void gcBitFree(gcBit* bit);

指定したビットマップを開放します。この関数はgcObjFree関数と全く同一です。 gcBitLcd関数で返されるビットマップを開放してはいけません。


short gcBitMove( gcBit* d, gcBit* s, gcRgn* rgn, short dx, short dy, short sx, short sy);

コピー元ビットマップ s から、コピー先ビットマップ d へ、 rgn で示される領域がコピーされます。 コピー元領域は、rgnをsx,syだけ移動したものであり、 コピー先領域は、rgnをdx,dyだけ移動したところです。

この関数では、dとsに同一のビットマップを指定することにより、 オーバーラップするコピー、つまり、スクロールを行なうことができます。
【戻り値】-1 ☆開領域/全領域
1正常
2正常 (空領域、コピーなし)


short gcBitCopy( gcBit* d, gcBit* s, gcRgn* rgn, short dx, short dy, short sx, short sy);

コピー元ビットマップ s から、コピー先ビットマップ d へ、 rgn で示される領域がコピーされます。 コピー元領域は、rgnをsx,syだけ移動したものであり、 コピー先領域は、rgnをdx,dyだけ移動したところです。

gcBitCopyでは重なりはうまく処理できません。 ではなぜこの関数があるのかというと、gcBitMoveに比べると、 3kbほどコード使用が少なくて済むからです。
【戻り値】-1 ☆開領域/全領域
1正常
2正常 (空領域、コピーなし)


short gcBitCopyNot( ... );
short gcBitAnd( ... );
short gcBitAndNot( ... );
short gcBitOr( ... );
short gcBitOrNot( ... );
short gcBitXor( ... );
short gcBitXorNot( ... );

演算コピーを行ないます。引数はgcBitCopy関数と同様です。 オーバーラップは正しく扱えません。
gcBitCopyNotdst = ~src;
gcBitAnddst &= src;
gcBitAndNotdst &= ~src;
gcBitOrdst |= src;
gcBitOrNotdst |= ~src;
gcBitXordst ^= src;
gcBitXorNotdst ^= ~src;
【戻り値】-1 ☆開領域/全領域
1正常
2正常 (空領域、変化なし)

short gcBitClear( gcBit* d, gcRgn* rgn, short dx, short dy);
short gcBitFill( gcBit* d, gcRgn* rgn, short dx, short dy);
short gcBitInvert( gcBit* d, gcRgn* rgn, short dx, short dy);

rgn領域をdx,dyだけ移動した部分をぬりつぶします。 gcBitClearでは0クリア、 gcBitFillでは1にセット、 gcBitInvertは領域内のビットを反転します。
【戻り値】-1 ☆開領域/全領域
1正常
2正常 (空領域、変化なし)

short gcBitFillPat( gcBit* d, dword pat, gcRgn* rgn, short dx, short dy);
short gcBitAndPat( gcBit* d, dword pat, gcRgn* rgn, short dx, short dy);
short gcBitOrPat( gcBit* d, dword pat, gcRgn* rgn, short dx, short dy);
short gcBitXorPat( gcBit* d, dword pat, gcRgn* rgn, short dx, short dy);

指定のパターンで領域をぬりつぶします。パターンは8x4ドットであり、 上位バイト側が上の行、下位バイトが下の行にしたdwordで直接指定します。

パターンはビットマップ上にはりついており、 塗りつぶすエリアを変更しても、同じドットは同じ色で塗られます。

gcBitFillPatdst = pat;
gcBitAndPatdst &= pat;
gcBitOrPatdst |= pat;
gcBitXorPatdst ^= pat;
【戻り値】-1 ☆開領域/全領域
1正常
2正常 (空領域、変化なし)


short gcBitCopyMask( gcRgn* d, gcRgn* s, dword mask, gcRgn* rgn, short dx, short dy, short sx, short sy);

gcBitCopy関数と同様ですが、 8x4ドットのmaskで指定された部分だけがコピーされます。 maskの中で0の部分はコピーされません。オーバーラップは正しく扱えません。 半透明の感じを出したり、あるいはdissolve場面転回に用います。
【戻り値】-1 ☆開領域/全領域
1正常
2正常 (空領域、変化なし)

short gcBitDisplay( gcBit* s, gcRgn* rgn, short dx, short dy, short sx, short sy);

LCD画面にビットマップの内容を転送します。 rgnとdx,dyで指定される範囲は、決してLCD画面を越えないでください。

通常、転送元ビットマップsには、 gcBitLcd関数で返される画面バッファビットマップを指定し、 (dx,dy)は(sx,sy)に一致します。 dx, dy, sx, syは、例えば、画面よりも大きいビットマップをメモリ上に確保し、 その中の一部を直接LCDへ転送する時に用います。但し、ビットがずれた転送を 行なうことはできません。つまり、(dx-sx)は、8の倍数となっている必要があります。 そうでない場合は、 一度gcBitCopyで画面バッファビットマップに転送してから、 gcBitDisplayで画面バッファビットマップをLCDへ転送するようにしてください。

実際にLCDに書き込みが行なわれる領域は、ワード界にそろえられるため、 若干大きめの領域になります。
【戻り値】 -2 ☆(dx-sx)が8の倍数ではない
-1 ☆開領域/全領域
1正常
2正常 (空領域、変化なし)