<< index

gpmodule

S.PROGRAMS NET :: HSP :: gpmodule

HSP でアンチエイリアシングされた図形を描画したい

滑らかにアンチエイリアシングされた画像は目に優しく、心地いいものです。 アンチエイリアシングされたフォントや図形に慣れているときに、急にそうでない画像を見ると、 ギラギラでとても見づらく感じてしまうものです。

さて、HSP 標準命令である line や circle を使うと、下の図のようにジャギーでざらざらの線が描画されます。 (これはおなじみなので、特に苦ではないかもしれませんが...)

	repeat 50
		hsvcolor cnt*7, 200, 200
		line rnd(300), rnd(300)
		circle rnd(300), rnd(300), rnd(300), rnd(300), 0
	loop

PC で描画する線といえばこれが普通だったのですが、Windows XP からは GDI+ という強力な描画ライブラリが用意されていて、 アンチエイリアシングのかかった滑らかな図形も描画できるようになっています。

gpmodule は、GDI+ の Flat API を HSP 用にラップし、標準命令と同じ感覚で呼び出すことができるようにしたモジュールです。 標準命令と同じ使い勝手で、下のように滑らかな線で描画できます。

#include "gpm.hsp"
	repeat 50
		gphsvcolor cnt*7, 200, 200
		gpline rnd(300), rnd(300)
		gpcircle rnd(300), rnd(300), rnd(300), rnd(300), 0
	loop
	redraw

二つのスクリーンショットを部分拡大すると、下図のようになります。gpmodule では、滑らかなアンチエイリアシングがかかっているのがわかります。

2007/09/01 gpmodule 1.03 をアップしました。
2007/06/22 gdiplus.dll ダウンロード先リンクを追加しました。
2007/03/20 gpmodule 1.02 をアップしました。
2007/03/09 GPModule 1.01 をアップしました。
2006/12/23 トラブルシューティングを追加しました。
2006/12/17 GPModule 1.0 をアップしました。

ダウンロード

gpmodule (for HSP 3.0/3.1)

gpm.hsp (4KB)

これが gpmodule 本体です。このファイルをそのままディスクに保存して、ユーザースクリプトにインクルードして使用してください。

(Windows XP 未満の環境で、gdiplus.dll が導入されていない場合は、HSP 標準命令と同等の描画機能しか果たしません。)

リリースノート

1.03 ・スクリプト終了時に gpexit が呼ばれるよう変更

1.02 ・描画結果が標準命令と 0.5 ピクセルずれる問題を解消

1.01 ・初期化処理を効率化

1.0 ・初公開版

つかいかた

gpm.hsp をインクルードすると、gpmodule の命令が使用できるようになります。

あとは、color, line, circle といった標準命令とまったく同じように、gpcolor, gpline, gpcircle 命令を使って描画を行います。 標準命令の先頭に gp をつけた名称が、gpmodule の描画命令になっています。

gpmodule を使って描画した結果は、redraw 命令で画面を更新したときに表示されます。

gpmodule に用意される命令は、下記のとおりです。パラメータは、標準命令と同じです。

・色選択命令 (GDI+ での描画色を選択するためには、これらの命令を使用する必要があります。)
  gpcolor
  gphsvcolor
  gppalcolor
  gpsyscolor

・描画命令
  gpline
  gpcircle

gpmodule は簡単に使えるモジュールなので、今のところヘルプファイルは用意されていません。

クイック トラブルシューティング

gpmodule を使用して期待した結果が得られない場合のトラブルシューティング

・図形が描画されない
 - redraw 命令で表示画面を更新していますか?

・アンチエイリアシングがかからない
 - OS のバージョンは Windows XP 以降、もしくは gdiplus.dll 導入済み環境ですか?
 - color 系命令の代わりに gpcolor 系命令を使用していますか?
 - line, circle 命令の代わりに gpline, gpcircle 命令を使用していますか?
 - 複数のスクリーン ID を切り替えて描画する場合は、スクリーン切り替え後に gpcolor 系の命令で色を再選択する必要があります。

・"文法が間違っています" というエラーになる
 - gpm.hsp は正しくインクルードされていますか?

GDI+ が存在しない環境での動作

GDI+ にはグラデーションブラシやアルファブレンドなど、まだまだたくさんの描画モードがあり、非常に強力な機能が提供されていますが、 gpmodule ではアンチエイリアシングのためだけに GDI+ を使用しています。

これは、GDI+ が存在しない環境で gpmodule の命令が実行されたときに、自動的に標準描画命令のモードで動作するようにしているためです。 gpmodule は最小限の機能しか実装されていない代わりに、gdiplus.dll (GDI+ の本体) がない環境でもアンチエイリアシング無効状態で実行できます。

ちなみに、Microsoft によると gdiplus.dll は再頒布が認められていて、DLL を同梱すれば Wiondows 98 以降なら動作することになっています。 (1.7MB もある大きな DLL なので、ちょっと配布しづらいかもしれませんが)

GDI+ 再頒布用パッケージは、 Download details: Platform SDK Redistributable: GDI+ からダウンロードできます。

著作権フリー。

sprocket は、gpmodule の著作権を主張しません。

gpmodule の改造も、gpmodule を組み込んだソフトの配布も自由です。

もしこのモジュールを拡張して GDI+ プログラミングを行う場合は、GDI+ Flat API を叩く必要があります。 この API そのものについては資料があまりないのですが、Microsoft のサイトからダウンロードできる Platform SDK の中の GdiPlus***.h (C++ 用クラス定義) と、クラス (Graphics とか Pen とか Brush とか) の使用方法とを照らし合わせれば、 間接的に API の使い方がわかると思います。

BACK