━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ グラフィック自由変形サブルーチン XGTPUT.C ─────────────────────────────────  グラフィック画面の矩形の領域を変形して任意の4点の囲む四角形の領 域内に張り付けるサブルーチンです。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 使用方法 ─────────────────────────────────  このサブルーチンの使用手順はだいたい次のようになります。 1.バッファ領域の確保 g_alloc() or g_set() 2.画像の取り込み g_get() 3.変形出力 gtput() 4.バッファの開放 g_free(),g_free_all()  いかに細かい説明をいれます。 1.バッファ領域の確保  始めに元画像を格納するバッファ領域を確保する必要があります。  バッファの確保は XGTPUT が自前でメモリブロックを確保する方法と、 ユーザーが用意したメモリ領域を割り当てる方法があります。前者には g _alloc() を、後者には g_set() を使用します。  必要なバッファの大きさは元画像の大きさと画面モードによって決まり ます。  元画像の縦、横の長さをそれぞれXL、YLとすると、  65536色モードでは XL×YL×2  byte  256色モードでは XL×YL×1  byte  16色モードでは XL×YL/2  byte となります。  g_set() では既に画像を取り込んであるバッファ領域を割り当てること もできます。  g_alloc() ではテキスト画面のプレーン2と3(マウス画面)またはテ キスト画面全部をバッファとして使うこともできます。この場合、テキス トパレットを変更してバッファに使用する画面は見えなくしています。 2.画像の取り込み  g_get() で確保したバッファにグラフィック画面を取り込みます。  実際は iocsコールの GETGRAM を呼んでいるだけです。 3.変形出力  gtput() でバッファ内の画像を変形して出力します。  バッファを開放するまでは元画像は残っているので、何度でも出力でき ます。 4.バッファの開放  g_free() を実行すれば確保したバッファを開放し、g_get()、gtput() から使えなくします。 また、テキスト画面をバッファに使用していた場合は、バッファ内容をク リアし、テキストパレットを元に戻して画面を表示します。  ただし、g_free() では g_alloc() で作製したメモリブロックの開放は 行わず、次に g_alloc() で要求したバッファの容量が現在確保してある メモリブロックのサイズより小さければそのままバッファとして利用しま す。  メモリブロックの開放まで行う時は g_free_all() を使用して下さい。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 特殊機能 ───────────────────────────────── ・クリップ領域の設定  g_clip() で指定した範囲外には書き込まなくなります。 ・透明色機能  元画像の特定の色を透明色として、出力しない機能です。  g_t_color() で指定します。 ・合成色機能  背景(出力先のグラフィック画面)上の指定した色の上にのみ変形後の 出力を書き込む機能です。(クロマキー合成のようなもの)  g_x_color() で指定します。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ アルゴリズム ─────────────────────────────────  グラフィックの自由変形サブルーチンはX-BASIC用の外部関数G_TRANS.F NC(電脳倶楽部Vol19・1989年12月号掲載)や X68000マシン語入門・グラ フィックス編にも紹介されています。  これらのアルゴリズムは基本的に同じで、元画像の水平ライン1本分に 対応する変形後の線分を求めていくものです。変形後の出力は斜めの線が 順に描かれていく様子が見られます。  基本的に斜め線で領域を埋め尽くそうとすると重複や隙間を無くすこと は困難です。このアルゴリズムでは重複を許して隙間を無くしているため かなりの無駄を生じています。  ところで、自由変形のアルゴリズムがもう1つあります。それはZ'sSTA FFの自由変形です。Z'sSTAFFの場合、自由変形の出力は上から下へ真っ直 ぐ降りる水平線で描かれます(でもって、けっこう速い)。  私は思わず考え込んでしまいました。Z'sSTAFFは何をやっているのだろ う。気が付いてみると簡単で元画像の水平線に対応する変形後の斜め線を 求める代わりに、変形後の水平線に対応する元画像上での斜め線を求めれ ばよいだけでした。  具体的には多角形フィルの要領で変形後の四角形の外形を求め、スキャ ンラインを描くときに元画像の対応する点を求めて色を拾います。  基本的に2次元および3次元のラインルーチンです。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ リファレンス ───────────────────────────────── ●関数 int g_clip( xs, ys, xe, ye ); int xs, ys, xe, ye ; ○機能  クリップ領域を (xs,ys)-(xe,ye) にします。 ○返り値  終了コード  0 なら正常終了 ●関数 int g_t_color( col ); int col ; ○機能  透明色を指定します。  元画像でパレットコードが透明色に指定された領域は変形出力後画面に 書き込まれません。 col >= 0 : col を透明色にします。 col = -1 : 透明色は無し。 col = -2 : 最下位ビットが1の色を全て透明色とする。 col = -3 : 最下位ビットが0の色を全て透明色とする。 ○ 返り値  終了コード  0 ならば正常終了 ●関数 int g_x_color( col ); int col ; ○機能  合成色を指定します。  出力先の画像でパレットコードが合成色に指定された領域に変形出力後 の画像が書き込まれます。 col >= 0 : col を合成色にします。 col = -1 : 合成色は無し(全色)。 col = -2 : 最下位ビットが1の色を全て合成色とする。 col = -3 : 最下位ビットが0の色を全て合成色とする。 ○ 返り値  終了コード  0 ならば正常終了 ●関数 int g_alloc( size ); int size ; ○機能  size byteのメモリ領域をバッファとして確保します。  size = -1:テキストVRAMのプレーン2と3をバッファとします。  size = -2:テキストVRAMの全領域をバッファとします。 ○返り値  バッファのサイズ  負ならばエラー ●関数 int g_free_all( void ); ○機能  バッファに割り当てられた領域を開放し、確保したメモリブロックがあ ればこれも開放します。  テキスト画面をバッファにしていた場合は内容をクリアして表示をもと に戻します。 ○返り値  終了コード  0 ならば正常終了 ●関数 int g_free( void ); ○機能  バッファに割り当てられた領域を開放します。確保したメモリブロック は開放しません。  テキスト画面をバッファにしていた場合は内容をクリアして表示をもと に戻します。 ○返り値  終了コード  0 ならば正常終了 ●関数 int g_set( xl, yl, size, buff ); int xl, yl, size ; void *buff ; ○機能  大きさが size byteの領域 buff を縦横 xl,yl の画像のバッファ として割り当てます。  GETGRM でグラフィック画面を取り込んだ領域ならばそのまま gtput() で使用できます。 ○返り値  終了コード  0 ならば正常終了 ●関数 int g_get( x0, y0, x1, y1 ); int x0,y0,x1,y1 ; ○機能  バッファに (x0,y0)-(x1,y1) の領域のグラフィック画面を取り込みま す。 ○返り値  終了コード  0 ならば正常終了 ●関数 int gtput( x0, y0, x1, y1, x2, y2, x3, y3 ); int x0,y0,x1,y1,x2,y2,x3,y3 ; ○機能  バッファに取り込んだ画像を (x0,y)〜(x3,y3) の作る四辺形の中に張 り付けます。 ○返り値  終了コード  0 ならば正常終了 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 参考文献 ───────────────────────────────── 1)Zバッファアルゴリズム 丹 明彦 Oh!X 1989/7   特集 3Dグラフィックへの飛翔 2)X68000マシン後プログラミング グラフィックス編 村田 敏幸 (EOF)