FrontPage  ページ一覧  検索  更新履歴  RSS  ログイン

Change in Psychlops 1.3

概要

今回の変更では、特にメモリアクセス時の安全性を強化しています。操作不能のまま再起動が必要な状態になることを防止し、実行時エラーが発生してもできる限り適切なエラーメッセージを出して安全に強制終了するよう変更しました。

そのほか、マルチディスプレイへの予備対応と、それに向けたCanvasの一般化(Drawableの導入)と、Rectangle以外の図形クラスの一般化(Figureの導入)を行いました。

(MacOSX版限定)プロジェクト変更

!既存プロジェクト修正の必要あり!

 今回の更新の前後で、Mac版はプロジェクトファイルの作り直しが必要になります。プロジェクトを新しいテンプレートで作り直すか、"External Frameworks and Libraries"に"/System/Library/Frameworks/AGL.framework"(システム/ライブラリ/Frameworks/AGL.framework)を追加(下図参照)してください。

migrating_1.3_1.png

Imageにおける透明度の取り扱い変更

!表示色への影響あり!

Imageに透明度付きColorを書き込む際、Canvasへの書き込みと同じく

(source_color * alpha) + ( destination_color * (1-alpha) )

の式を適用して書き込むよう変更しました。この変更は

のすべてに対して適用されます。 Image.clearのみはこの例外で、透明度は適用されずそのまま書き込まれます。

透明度を直接書き込む場合は、

Image.alpha(int x, int y, double alpha)

命令で書き込んでください。

ウィンドウ表示のサポート

フルスクリーンではなくウィンドウモードでCanvasを作ることができます。プログラムの製作時に、より管理しやすくなります。特に、ウィンドウモードを使えばMacOSXにて画面が真っ黒になったまま操作不能になるエラーが解消します'。この問題はフルスクリーン起動中にエラーで強制終了した場合デバッガが起動して操作不能になるために起きましたが、ウィンドウモードではデバッガを操作することができ、デバッガによる問題位置の把握や安全な強制終了が可能になります。

Canvas canvas(Canvas::window)
Canvas::set(Canvas::window)
デフォルトの幅と高さでウィンドウを開き、表示。
Canvas canvas(int width, int height, Canvas::window)
Canvas::set(int width, int height, Canvas::window)
指定の幅と高さでウィンドウを開き、表示。

マルチディスプレイの部分的サポート

Display型を、標準Canvasへの名前空間として残す一方、クラス自体はディスプレイ機器そのものを表す型へと変更しました。現在はDisplay\:\:primaryとDisplay\:\:secondaryが扱えます。

Canvasのコンストラクタかset命令の末尾の引数にDisplay指定を付け加えると、そのディスプレイがあればそこに確保しようとします。以下のコードは、セカンダリディスプレイにフルスクリーンを確保しようとします。セカンダリがない場合にはプライマリに表示されます。

Canvas canvas(Canvas::fullscreen, Display::secondary)

Figure / Shape関係のクラスの新設

Figure

Figureは「描画されることができるもの」を表す抽象クラス(クラスインターフェース)です。Figureとして扱いたい構造はこのクラスをpublic継承し、以下の関数をオーバーライドする必要があります。

Shape関係

それ自体は形のみを表し、色や線を別に考えることができる構造を扱うクラスの一群です。draw関数で塗り色(Color)と線の種類(Stroke)を指定することができます。

Line

直線を表すクラスです。

Rectangle

長方形を表すクラスです。以前より継続して使えますが、Figure / Shapeの派生クラスになっています。

Ellipse

楕円を表すクラスです。

Polygon

多角形一般を表すクラスです。

Group

Figureをグループ化して取り扱います。また、同時にまとめて平行移動、回転、拡大縮小ができるようになります。

その他

Figures::Arrow

矢印を表示します。

Figures::Cross

十字形が描画できます。注視点の提示などによいと思われます。

Canvasの防御機構の導入と将来のマルチディスプレイ対応への予備対応

マルチディスプレイ機能を導入することを前提として、複数のCanvasを作る機能の導入準備を行いました。この変更による互換性の喪失はありません。

また、この変更の副作用として、Canvasを必要とする命令をCanvas実体を確保する前に実行した場合にハングアップする問題が一部緩和され、一部の命令については、適切なエラーメッセージを表示して安全に終了するよう改善しました。

実験メソッド法 ExperimentalMethods / Procedure の統合と仕様変更

デモコンソール

古いProcedureという名前とExperimentalMethods::Demoの二つの実装がありましたが、同じ実装を利用するように変更しました。この変更より、デモコンソールの数字の表示サイズが小さくなります。また、マウスによって値を操作することができます。また、Procedureの安全性が高まりました。

JPEG読み込み機能の追加

Image.load(filename)でfilenameの拡張子をjpgとするとJPEGファイルを読み込むようにしました。Psychlopsは心理物理実験に用いることのできる精度を求める都合、不可逆圧縮であるJPEG形式は推奨しませんので書き込み機能は後回しになりますが、自然画像資料を読み込む便宜のため読み込みはサポートします。 Windows版が不調のため一時中止します。

Range型の名称変更

数学における区間を表す型をRangeとしていましたが、数学における用語に対応してIntervalに改名しました。当面、RangeIntervalの別名として残されます。

Keyboard / Mouse の命令簡素化

Input::getの表記を不要にしました。旧来の表記法も互換性のため残されます。

旧
Input::get(Keyboard::esc, Keyboard::pressed);
Input::get(Mouse::left, Mouse::pushed);
新
Keyboard::esc.pressed();
Mouse::left.pushed();

例外送出による強制終了の安全化

Psychlopsが検出可能な致命的エラーを検出した場合において、強制終了時に適切なエラーメッセージを表示し、安全に強制終了できるようになりました。メッセージ表示ウィンドウはPsychlops本体の表示ウィンドウに隠されている場合があるので、そのような場合にはExposeやalt+Tabキーでウィンドウを選んで表示してください。

SVGCanvasクラス(仮)

SVGを吐くDrawableを仮に作りました。

void SVGoutput() {
  SVGBCanvas svg(800, 600);

  Psychlops::Rectangle rect(100,100);
  rect.centering().draw(Color::green);
  Psychlops::Ellipse ell(50,100);
  ell.centering().shift(100,100).draw(Stroke(Color::black, 5, Stroke::SOLID));

  svg.save("test.svg");
}
更新日時:2009/09/29 19:22:27
キーワード:
参照:[更新履歴]