EGGX / ProCALL
ScreenShot / 特徴·機能 / 必要条件 / ソースパッケージ·インストール方法 / pdfマニュアル / FAQ / LICENSE / リンク集

 EGGX / ProCALL (えっぐえっくす / ぷろこーる) は,究極の簡単さを目指して作成した C言語,FORTRAN言語用のX11グラフィックスライブラリです(C++からも利用可能です). 懐かしの N88-BASIC 風の描画関数を使って X Window System上で簡単に 2Dグラフィックスを楽しむことができます. とにかく「簡単」に使えて「8ビットマシン時代のBASICのような楽しさ」を これからプログラミングを始める方々に伝えたいと考え, 主に初等プログラミング教育を目的として作成したものです. 10年前のPCでも十分な描画速度が確保できますから, 「アニメーションを作成しなさい」「ピコピコゲームを作成しなさい」 といった課題にも対応できます.
 また,このライブラリは数値計算の可視化においても, 強力なソリューションを提供します.一般的な可視化ツールと異なるのは, 計算コードから直接 X11 用の描画関数(サブルーチン)を呼べる という点です. 長時間の計算を要するシミュレーションなどで計算中の状況を把握をしたい場合, 一般にはめんどうな実装をする必要があります. しかし,このライブラリでは大変簡単に実装可能な上, EGGX / ProCALL は大変軽量でコンパクトなライブラリで メモリを消費しませんから,安心してリンクできます.
 EGGX / ProCALL はX11関連のライブラリはXlibしか使っていません. したがって,UNIX環境(CygwinもOK!)であればどこでも容易にインストールできます.

キーワード: EGGX / ProCALL / C言語 / C++ / FORTRAN / UNIX / Linux / MacOSX / Cygwin / X11 / X Window System / Xlib / タートル / グラフィックス / グラフィック / ライブラリ / 簡単 / 手軽 / 初心者 / ビギナー / BASIC / N88-BASIC / プログラミング入門 / 数値計算 / シミュレーション / 可視化 / プログラミング教育 / 情報教育

■EGGX / ProCALL を用いて作ったプログラムのスクリーンショットとソースコード

ちょっとしたコードでこんな事ができます.

二重振り子

上のスクリーンショットは,EGGXのソース・パッケージに収録されている,東京電機大の松田様のコードによるものです. いくつかの描画例を次に示します.

スクリーンショット ソースコード コンパイル方法
マンデルブロ集合 sshot_mandel.png mandel.c egg mandel.c -o mandel
ロッシュワールド sshot_roche.png roche.c egg roche.c -o roche
カラーバー sshot_colorbars.png colorbars.f egg colorbars.f -o colorbars
カラーバー sshot_sep_colorbars.png sep_colorbars.c egg sep_colorbar.c -o sep_colorbar
モナーとギコ (2ちゃんねるAA.要モナーフォント) sshot_2ch.png 2ch.c egg 2ch.c -o 2ch
ルパン三世 (要東風ゴシック) sshot_rupin.png rupin.c egg rupin.c -o rupin
デジタル時計 sshot_clock.png clock.c egg clock.c -o clock
AfterStep/WindowMakerドック時計 sshot_plamoclock.png plamoclock.c
plamoclock.h(画像)
egg plamoclock.c -o plamoclock
AfterStep/WindowMakerドック時計 sshot_ayuclock.png ayuclock.c
ayu.h
Web素材(回転する星) ←コレ rstar.c egg rstar.c -o rstar
銀河衝突(最も初歩的なテスト粒子による計算です) MPEGムービー int1.c egg int1.c -o int1
重力レンズ MPEGムービー COOL HOT

■EGGX / ProCALLの特徴・機能

★究極の簡単さ,手軽さ

  • ウィンドゥサイズのみを引数とするたった1つの関数で窓を開き, 即,描画関数を使える.
  • 関数は BASIC ライク.リファレンスを見ればすぐに使え, 教育用途やビギナーに最適.
  • ウィンドゥが隠れた時の 再描画処理はライブラリ側で完全に行う のでユーザはめんどうなイベントを気にせず,単に描画関数を並べるだけでよい.
    X サーバの負担となる BackingStore 属性による暫定的な解決や タイマー割り込みを使った再描画処理ではなく, 子プロセスが常に Expose イベントを監視して, Window の再描画が必要な場合に Pixmap から瞬時にコピーするようにしています.
  • 専用のコンパイルコマンドを用意. Makefile は不要.コンパイル時のオプションも不要. gcc,gfortran(またはg77かf77)でコンパイルした事がある人なら,すぐに使える.
  • X11 関連で使用しているライブラリは Xlib のみで大変ポータブル. gcc,make,X11環境さえあれば,いつでもすぐにインストールできる.
  • GrWin や HandyGraphic のような ランタイムファイルのインストールは不要
    EGGX/ProCALL で作成した実行ファイルは, 立派なアプリケーション・ソフトウェアになります. もちろん,同一 OS の場合は実行ファイルをもっていくだけで EGGX/ProCALL をインストールしていない環境でも動作します.

★それなりの機能

機能的には,やや贅沢なファミコンといったところです.

  • ファイルと同じ感覚で複数のウィンドゥをオープン.
  • 点,線,多角形,円,文字,シンボル,様々な矢印などを 24ビットカラーで描画.
  • カラー生成関数を提供. DS9 , IDL コンパチの約50種類のカラー生成モード をライブラリに持っているため,カラーコントアの作成も楽々.
  • 24ビットのビットマップ画像データの転送(背景透過処理もOK)
    X サーバにあわせてデータフォーマットをライブラリ側で変換
  • 1ウィンドゥあたり8枚のレイヤが利用可能.ダブル(トリプル)バッファリングによるスムーズなアニメーションが簡単に実装可能.
    N88-BASIC の SCREEN 命令のような処理が可能.
    背景専用レイヤ,描画専用レイヤ,表示レイヤのように使うと スプライトに相当する処理が可能.
  • ハードウェアスクロールが可能.
  • netpbmImageMagick が対応しているすべてのフォーマットに画像を連続して保存可能.
    gif アニメーション,mpeg 動画の作成も楽々. 新しいフォーマットに対応させたい場合でも, EGGX/ProCALL の再コンパイルは不要.
  • BASICの INKEY$ を実装(ggetch 関数). シューティングゲームや落ちものゲーム等,いろんなゲームが作成可能.
  • マウス入力にも対応(ggetevent 関数).お絵描きツールやGUIが作成可能.
  • 日本語(フォントセット)の描画.
  • 必要に応じてスクロールバーを自動配置(V.0.91以降).巨大な画像データの扱いも楽々.
  • Xinerama環境の自動検出(V.0.91以降).
  • AfterStep,WindowMaker の アプレットが手軽に作成可能.
  • 商用の X サーバなどの複数の Visual を持つ X サーバに対応
    X サーバで TrueColor Visual が使えれば, デフォルトが PseudoColor でも TrueColor で窓をオープン.

■必要条件

  • Cコンパイラ, make がインストールされているUNIX系OS (Linux,MacOSX,Solaris,FreeBSD,NetBSD,IRIX 等),Cygwin, Windows Services for UNIX(要Xサーバ) など.
    gcc, Intel C++ Compiler, IRIX 純正 C コンパイラ, Solaris 純正 C コンパイラでビルド可能な事を確認.
    Linux(i386,x86_64,Alpha), Solaris 2.6-10(Sparc), FreeBSD(i386), NetBSD, IRIX(indigo2,PowerOnyx2), Mac OS X 10.2.2, HP-UX, Cygwin on WindowsXP, Windows Services for UNIX で動作を確認.
  • X11R6, X11R7 か互換のX11がインストールされている事
  • TrueColor Visual が使える X サーバ(16bpp 以上)を推奨.
    PseudoColor しか使えない X サーバの場合, いくつかの関数が利用できません.
    X サーバ は,XFree86(i386Linux,Mac OS X), Xsun(SparcSolaris), SGI PowerOnyx2 X端末, Astec-X 4.0 ,Exceed V6.1,V7.1(WindowsNT) で動作を確認.
  • ppm 形式以外でのフォーマットで画像の保存を行うためには, netpbm あるいは ImageMagick のインストールが必要.
    ./configure ; make ; make install でインストール完了!

■ソースパッケージとインストール方法

最新安定版 Version 0.93r4 (2011年6月17日公開) → eggx-0.93r4.tar.gz
 シミュレーションのサンプルプログラムの追加と更新(東京電機大学の松田様に感謝)
pdfマニュアル → eggx_procall.ja.pdf
Cプログラミングガイド with EGGX (by京都産業大学の安田様)

◇Version 0.93r3 (2010年4月14日公開)
 英語ドキュメントの整備
◇Version 0.93r2 (2010年3月30日公開)
 readimage(),writeimage()等の内部実装の改良.シミュレーションのサンプルプログラムの追加と更新(東京電機大学の松田様に感謝)
◇Version 0.93 (2010年3月8日公開)
 イベント処理の大幅改良.newgcfunction(),readimage(),writeimage(),gputimage(),ggetimage(),gputarea(), gresize() を追加.ゲーム,シミュレーションのサンプルプログラムの追加と更新(東京電機大学の松田様に感謝)
◇Version 0.92 (2010年2月23日リリース)
 内部実装の改良.デフォルトのMakefileでCygwinでビルドできるように改良.標準関数のdouble型,float型引数の両対応.
◇Version 0.91 (2010年2月19日リリース)
 saveimg()の高速化,背景透過処理のサポート,レイヤは8枚までOK,スクロールバー・インタフェースのサポート,newlinewidth(),newlinestyle(),gscroll(),coordinate()関数の追加,サンプルプログラム追加,等々
◇Version 0.90 (2010年1月31日リリース)
 UTF-8環境での日本語描画対応,フォント選択のfallback強 化,色切替関数の高速化,描画関数の追加,手動flush対応,Cygwin向けの改良など,改良多数
【eggx-0.90 での API 変更に関するお願い】
  Version 0.85 から導入されたノンブロッキングモードでの API 整合性を改善するため,
Version 0.90 にて,次の 2 つの関数の仕様を変更しました.
  お手数ですが,教材等のアップデートをお願いします.

 ・ggetch()

   引数 win が無くなり,EGGX の全ウィンドゥからのキー入力を返すようになりました.
     key = ggetch(win);  /* Version 0.85 まで */
       ↓
     key = ggetch();     /* Version 0.90 から */
   のように変更をお願いします.

 ・ggetxpress()

   第一引数が int win から int *type に変更,返り値がウィンドゥ番号に変更となり,
   ggetevent() とほぼ同じ API 仕様となりました.
     type = ggetxpress(win,&b,&x,&y)                   /* Version 0.85 まで */
       ↓
     if ( ggetxpress(&type,&b,&x,&y) == win ) { ... }  /* Version 0.90 から */
   のように変更をお願いします.

  また,line()関数は,moveto()・lineto()関数に置き換える事を推奨します.

☆Version 0.85r1(2010年1月22日リリース)
 ggetevent()等にノンブロッキングモードを使えるようにしました.newhsvcolor()を追加しました(京都産業大学の安田様に感謝).月面着陸ゲームを収録しました(東京電機大学の松田様に感謝)
☆Version 0.84(2009年11月14日リリース)
 Fedora11等の環境で,フォントが見つからない時にSEGVするバグを修正
☆Version 0.83(2008年2月9日リリース)
 ggetevent() を追加(マウスのモーションイベントにも対応).使い方は sample/mousetst2.cを参照してください.
☆Version 0.81(2006年2月17日リリース)
 stdarg まわりのバグ修正.
 0.81用のRPM specファイル(嶋田様,金様に感謝)
☆Version 0.80(2004年1月26日リリース)
 eggxlib.h を include することで,eggx_ で始まる関数名で 使えるようにしました.また,FORTRAN の rtoc サブルーチンのバグを修正しました.
☆Version 0.79r1(2003年3月16日リリース)
cygwin,X on Windows対応、drawstr() での不具合修正、HP-UX,HP-UX64,Solaris64 用 Makefile を用意しました.

★インストール方法

 RPMな方は spec ファイルを取得して rpm でビルドする事もできます.
- X11/X.h が入っているかを確認する
/usr/include/X11/X.h または /usr/X11R6/include/X11/X.h が存在するかどうかを確認してください. ディストリビューションによっては, EGGX の構築に必要なヘッダファイルが標準ではインストールされない事があります. その場合は,各ディストリビューションが用意している X11 の開発用の パッケージをインストールしてください.
Vine Linux の例を以下に示します.
% su
# apt-get install XOrg-devel
# exit
Fedora の例を以下に示します(フォントもついでにインストールしています).
% su
# yum install libX11-devel
# yum install xorg-x11-fonts-ISO8859-1-75dpi
# yum install xorg-x11-fonts-ISO8859-1-100dpi
# yum install xorg-x11-fonts-misc
# yum install japanese-bitmap-fonts
# exit
Ubuntu 例を以下に示します.
% su
# apt-get install libx11-dev
# exit
Cygwinの場合は,パッケージの選択を このようにして Cygwinをインストールしてください(赤で囲ったところを「Install」に変更します).
- ソースを展開する
% gzip -dc eggx-0.93r4.tar.gz | tar xvf -
% cd eggx-0.93r4
- Makefileを選び,必要に応じて編集
Linux, Solaris用などの Makefile を用意してあるので,OS にあわせて
% ln -sf Makefile.linux Makefile    ← Linux,MacOSX,FreeBSD, Cygwinなどの場合(デフォルト)
% ln -sf Makefile.linux64 Makefile  ← 64-bit Linux の場合
のようにリンクし, MakefileIINC, LLIB を環境にあわせて 変更してください (ほとんどの場合,変更の必要はありません).
 Makefile の CC, USERCC, USERFC の部分を確認し, 必要に応じて修正してください (これらもほとんどの場合,変更の必要はありません). EGGX/ProCALL をビルドする時のコンパイラと, ユーザが使うコンパイラを別々に指定できます.
 EGGX のライブラリファイル,ヘッダファイルはデフォルトでは /usr/local/lib/, /usr/local/include/ にインストールする設定 になっています. これは MakefilePREFIX で変更できます.
 root になれない場合は /usr/local/ 以下にはインストールできないと思いますが, その場合はユーザのホームディレクトリ上の 1 つのディレクトリに EGGX のコンパイル用スクリプト, ライブラリファイル,ヘッダファイルをまとめて入れる事をお勧めします (この後のステップで説明します). このようにしておくと,コンパイル用スクリプトは, インクルードファイル,ヘッダファイルのパスを 自動的に設定するようになっており,この場合は MakefilePREFIX の修正は不要です.
- make します.
% make
- egg , eggx*.hlibeggx.a をコピーします.
su で root になり,make install します. なお,Cygwinの場合,「su」は不要です.
【例】- root になれる場合
% su
# make install
 root になれない場合は,次のように libeggx.a, eggx*.h, egg を同一ディレクトリにコピーしてください.
【例】- root になれない場合 (ホーム上の EGGX というディレクトリに入れる)
% mkdir ~/EGGX
% cp libeggx.a eggx*.h egg ~/EGGX/.
% cd ~/EGGX/
※コンパイルには egg コマンドを使いますが,この場合 は ~/EGGXPATH を通すか,フルパスで実行してください.
 Mac OS X の場合は,念のため以下のように ranlib しておいてください.
# ranlib /usr/local/lib/libeggx.a
- パッケージャの方へ
Makefile では PREFIXDESTDIR が使えるようになっています.ご利用ください.

★動作テスト

 ディレクトリ examples_tutorialexamples.eucexamples.utf-8 にいくつかのサンプルプログラムが入っているので, それで動作確認をしましょう.
- examples_tutorial/clock.c … シンプルなデジタル時計
% cd examples_tutorial
% make clock
% ./clock &
- examples.{euc,utf-8}/nihongo.c … 基本的な日本語の表示のテスト
% cd examples.euc
% make nihongo
% ./nihongo &
環境にあわせて,適切なディレクトリ examples.eucexamples.utf-8 を選んでください. もし,nihongo を実行した時,日本語が表示されない場合は, Xサーバのフォントのインストールが不十分ですので, フォントをインストールしてください.

■FAQ

★「cannot open display」と出てグラフィックスが表示できません!

 MacOSX や Cygwin の場合,まず X を起動する必要があります.
 Cygwin で X を起動するには, このスクリーンショット のように,XWin Server を実行します.しばらくすると, xtermのウィンドゥ が開きますので,この xterm 上でコマンドを入力してください. CygwinやMacOSXの通常のターミナルウィンドゥでは, グラフィックス用のウィンドゥを開く事はできません.
 UNIX系OSでこのエラーが出る場合は,ssh の「-X -Y」オプションの 付け忘れが考えられます. EGGXがインストールされたホストに対し,「ssh -X -Y user@hostname」のように ログインしてみてください.

★描画速度が遅いです! なんとかなりませんか?

 そのプログラム,表示レイヤに直接描画していませんか?
 EGGX/ProCALL では,ウィンドゥが隠れて露出した時の再描画を行なうため, 表示レイヤに描画する場合は,「表示しているウィンドゥ」と バックアップ用の「見えないウィンドゥ」との両方に描画命令を送っています. さらに,描画命令をすぐに反映するために,毎回命令をフラッシュしています. こういった理由から,表示レイヤへの直接描画は Xサーバによっては遅くなる事があります.
 この描画速度の低下を回避する方法は,layer()関数を使って, 非表示レイヤーに対して描画関数を一気に使い, 最後にcopylayer()関数を使って表示レイヤにコピーする事です. これにより,描画命令の数とフラッシュの頻度を最小限にする事ができ, 高速な描画が可能となります.
 次にコードの例を示します.

  win = gopen(640, 400);
  layer(win, 0, 1);          /* 表示対象をレイヤ0,描画対象をレイヤ1に設定 */
  while ( 1 ) {
      gclr(win);             /* レイヤ1を消去 */
      my_drawing(...);       /* ←ユーザの描画関数等,ここで絵を描く関数を使う */
      copylayer(win, 1, 0);  /* レイヤ1をレイヤ0に瞬時にコピー */
  }

 非表示レイヤーに対して描画しても十分な速度が得られない場合は, インストールされているディスプレイアダプタのドライバが メーカー純正ではない可能性があります. たいていのLinuxディストリビューションでは, メーカー純正のドライバはインストールされません. 最高のパフォーマンスを得るには, nVidia,ATI等の純正ドライバをインストールしてください.

★文字サイズは24ドットまでしか使えません! 日本語が描けません!

 EGGX/ProCALL では,巨大な文字も日本語も描く事ができます(Ver.0.90からはUTF-8でもOK).
 以下は,96ドットで「日本語も描けます」という文字を描画する例です. xfontsel などを使って,スケーラブルフォントのフォント名を確認し, gsetfontset()の第2引数をセットします.

  gsetfontset(win,"-*-gothic-medium-r-normal--%d-*-*-*-c-*-*-*",96);
  drawstr(win,x,y,FONTSET,0,"日本語も描けます。");

■ライセンス

 GPL とします. このライブラリの個人利用,商用利用を問わず,金品を要求するつもりは 全くありません.どなたでも無料でご利用いただけます. 商用利用の場合で,GPLでは困る,といった場合はご連絡さえいただければ MITライセンス等でも許諾いたします.
 強制ではありませんが,個人利用以外の場合(教育機関等の実習での利用や二次配布を行う場合など)については一応 電子メール にて御連絡いただくと助かります(利用状況を把握しておきたいので). もちろん,インストールがうまくいかないといった質問にもお答えしています. お気軽にどうぞ.


■リンク集

 EGGX/ProCALL を使って何かいいものができましたらご連絡ください.

●派生ライブラリ・アプリケーション等

●収録されているディストリビューション等

●情報教育や研究での活用

●類似ライブラリ

 微妙に競合したりしなかったりするライブラリを紹介しておきます. 基本的にどれもベクトルデータを出力する事を主たる目的としており, EGGXとはコンセプトが異なるものです. ここに挙げたライブラリとのコンセプトの違いについては, Ichinomiya様のページ がかなりいいところをついていると思います(最近のEGGXでは,点線での描画や線の太さの変更ができます)