110gc -- DataScope Graphics Component

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

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


gcRgnクラス

gcRgnクラスでは、画面上の領域を扱います。 領域 (region) とは、画面やビットマップ上の任意の「形」であり、 複数の四角形で定義されます。
例えば、Windowsで、上に別のウィンドウが重なっている場合には、 その一部しか画面上に見えていません。この「見えているところ」が、 領域となります。その他、あらゆる形に領域は定義することができます。

領域には4種類あります。

ビットマップへの描画、 例えばgcBitFill関数で塗りつぶしが実際に行なわれるのは閉領域の場合だけで、 空領域では全く塗りつぶしは行なわれず、 開領域や全領域を指定するとエラーとなります。 開領域などは、主に、領域同士の演算のために定義されています。

gcRgnは、次のように宣言されています。

typedef struct {
  gcRgn_v* v; //予約、未使用
  void* d; //領域データへのポインタ
} gcRgn;
(gcRgn*)->d は、隠蔽データ構造である gcRgn_d へのポインタとなっています。 通常のアプリケーションがこの隠蔽データへ直接アクセスする必要はありません。 四角形の領域を定義するgcRgnRect関数、あるいは、 領域を示すビットマップファイルをgcconvで変換して、 それをgcRgnLinkDataで領域にするのが普通です。

隠蔽データ構造gcRgn_dは、short型の配列として定義できる、 以下のようなデータとなります。
short rgn_d[]= {
  100, 100, //境界四角形 x,y
  300, 300, //境界四角形 w,h
  0, //領域種別 0=閉領域
  1, //固定値
  -100, 2, 0, 300,           //1段め
  -100, 3, 0, 100, 100, 100, //2段め
  -100, 2, 100, 200,         //3段め
  0, 1, //エンドマーク固定値
};

領域は、横に1段づつスライスされ、その段単位で定義されます。 1段の中は、高さ(負で示す)、段内の四角形数+1、 最初の四角形までの幅、最初の四角形の幅、次の四角形までの幅、次の四角形の幅、 の繰り返しとなります。 領域種別は、0=閉領域、1=空領域、2=開領域、3=全領域となります。 空領域、全領域の場合には、境界四角形の値はすべて0であり、 隠蔽データの長さは10バイトになります。

通常のアプリケーションからこのデータ構造を直接作成する必要はまずありませんが、 もし作成する場合は、必ず、正規化しておく必要があります。つまり、

を守るようにしてください。


gcRgn* gcRgnRect(short x, short y, short w, short h, short inv);

単一四角形の閉領域を作成して返します。 高さや幅が0の場合は空領域になります。 invが1の場合には、領域を反転し、開領域あるいは全領域になります。

作成した領域を開放するのを忘れないようにしましょう。
【戻り値】0 ☆メモリ不足
その他正常


gcRgn* gcRgnLinkData(void* data, short mode)

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

ビットマップファイルをgcconvで変換して領域を作成する場合にこの関数を用います。

const short mask1_rgn_d[]= {
@rgn f=mask1.bmp
};
...
  gcRgn *mask1_bit;
  mask1_bit= gcRgnLinkData(mask1_bit_d, 0);
...
こうして作成された領域は、あくまでリンクデータですので、 gcObjSizeや、gcObjDup関数を用いることはできません。 代わりに、gcRgnSizeやgcRgnDup関数を用います。
【戻り値】0 ☆メモリ不足
その他正常

void gcRgnFree(gcRgn* rgn);

領域データを開放します。gcRgnLinkDataで作成された領域もこれで開放します。 この関数は、gcObjFreeと全く同一です。


short gcRgnGetMode(gcRgn* rgn);

領域種別を返します。
0 閉領域
1 空領域
2 開領域
3 全領域


gcRgn* gcRgnAnd(gcRgn*a, gcRgn*b, short ax, short ay, short bx, short by);

2つの領域の積 (両方の領域に含まれている部分) を新規に作成して返します。 領域aをax,ayだけ移動したものと、領域bをbx,byだけ移動したものの積になります。

この関数では、引数に指定した領域は開放しないので注意してください。つまり、

  rest= gcRgnAnd(rest, hoe, 0, 0, 0, 0);
のようなことをすると、restの以前の領域が開放されずに残ります。
【戻り値】0 ☆メモリ不足
その他正常

gcRgn* gcRgnOr(gcRgn*a, gcRgn*b, short ax, short ay, short bx, short by);

2つの領域の和を新規に作成して返します。
【戻り値】0 ☆メモリ不足
その他正常

gcRgn* gcRgnDiff(gcRgn*a, gcRgn*b, short ax, short ay, short bx, short by);

領域aから領域bを除いた部分を返します。
【戻り値】0 ☆メモリ不足
その他正常

long gcRgnSize(gcRgn*);

領域のサイズを返します。この関数は、gcObjSizeと違い、 領域の隠蔽データ構造を追いかけてサイズを返すので、 gcRgnLinkDataで作成した領域に関しても使用できます。


void gcRgnMove(gcRgn* t, short x, short y, short inv);

指定した領域をx,yだけ移動します。 さらに、invが1の場合には、その領域を反転します。

この関数は、引数の領域自体に作用する唯一の関数です。


gcRgn* gcRgnDup(gcRgn* a, short x, short y, short inv);

指定した領域をコピーして、x,yだけ移動させます。 さらに、invが1の場合には、その領域を反転します。

この関数は、gcRgnLinkDataで作成した領域に対しても適用できます。
【戻り値】0 ☆メモリ不足
その他正常