110gc -- DataScope Graphics Component

gcconvの使い方

gcconvについて

gcconv.exeは、DOS上で動作するツールであり、 gcconv は、唯一つの引数として C テンプレートファイルのファイル名を取ります。 Cテンプレートファイル (拡張子.cgc) には、通常のCコードの中に、 ビットマップファイルを埋め込むための指示が記述されており、 gcconv は、この指示に従いビットマップファイルを読み込み、 110gcで扱えるビットマップデータや領域データを生成し、 C言語のソースファイル (拡張子.c) に書き出します。 開発キットのコンパイラでこのCソースファイルをコンパイルし、 リンクすることにより、 ビットマップや領域をプログラム中から使えるようになります。 テンプレートファイルの中の指示は複数記述できますので、 1回のgcconvで、複数のビットマップファイルを扱うことができます。

gcconvが変換対象とするのは、 Windowsのビットマップファイル(拡張子.bmp あるいは .dib)で、 1、4、8、24bit/ピクセルの、無圧縮タイプのものだけです。
gcconvが出力するのは、ビットマップデータにしろ領域データにしろ、 両方とも白黒データです。ではなぜカラーのビットマップが入力できるのでしょう? 実際には、カラーといっても、認識するのは次の8色だけです。

白(w)、黒(k)、赤(r)、緑(g)、青(b)、黄(y)、シアン(c)、マゼンタ(m)
この色のうち、 どの色を0データとして扱い、どの色を1データとして扱うのかを指定できます。 例えばLCD表示のビットマップの場合、通常黒が1ですので、 ビットマップファイル中で黒色の部分が1、その他の色を0として、 ビットマップデータが書き出されます。 これを、例えば、赤と白を1、それ以外の色を0などと変更できます。

この機能を利用すると、1つのビットマップファイルから、 ORマスクとXORマスクの両方のビットマップデータを一度に生成できます。 つまり、ヌキ色にしたい部分を赤、白にしたい部分は白、黒にしたい部分は黒にした ビットマップファイルを用意します。 そして、ORマスクで、黒と白を1、それ以外の色を0にし、 XORマスクで、白を1、それ以外の色を0にすれば、

ビットマップ色ORマスクXORマスク
00
10
11
のようになり、この2つのビットマップを利用し、 まずgcBitOrでOr転送して、次にgcBitXorでXor転送すれば、 お望みのヌキ色が実現できます。

なお、色の判断はそう厳密なものではなく、 各RGBの値が128を越えるか越えないかで8色を区別しています。

テンプレートファイル .cgc のフォーマット

@で始まらない行は、Cのソースファイルとしてそのまま書き出されます。

@で始まる行は、gcconvへの制御行であり、ビットマップ用と領域用の2種類あります。

<ビットマップ定義>

@bit f=mybitmap.bmp t=1 c=rw

ビットマップを定義します。データはbyte(unsigned char)型で書き出されます。

引数 f にはビットマップファイルの名前を指定します。

引数 t には、出力タイプを指定します。 t=0の場合には、ビットマップの幅情報が付け加わります。 このようなビットマップデータは、gcBitLinkDataでgcBitオブジェクトにします。 t=1の場合には、ビットマップの幅情報が付加されず、 純粋にビットマップのデータが並びます。 この場合には、gcBitAllocAddrでgcBitオブジェクトにします。 それぞれについて詳しくはgcBitリファレンスを参照してください。 デフォルトではt=0です。

引数 c には、1として扱う色を指定します。wkrgbycmの8色から指定します。 デフォルトではc=k、つまり、黒のみ1として扱います。

使用例:

const byte scene1_bit_d[]= {
@bit f=scene1.bmp
};
...
  gcBit *scene1_bit;
  scene1_bit= gcBitLinkData(scene1_bit_d, 0);
...

<領域定義>

@rgn f=myregion.bmp c=rk

領域を定義します。データはshort型で書き出されます。 引数 f にはビットマップファイルの名前を指定します。

引数 t が 1 の場合には、領域は反転します。つまり、開領域の定義になります。 デフォルトは t=0 で、閉領域になります。

引数 c で指定した色が領域内として扱われます。デフォルトはc=kです。

作成したデータは gcRgnLinkDataでgcRgnオブジェクトにします。 詳しくはgcRgnリファレンスを参照してください。

使用例:

const short mask1_rgn_d[]= {
@rgn f=mask1.bmp
};
...
  gcRgn *mask1_bit;
  mask1_bit= gcRgnLinkData(mask1_bit_d, 0);
...

プログラミング上の留意点