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

Canvas

概要

CanvasはPsychlopsの扱える表示領域で、Drawableを継承しています。現在はフルスクリーン画面を確保し(マルチディスプレイ環境ではプライマリディスプレイ)、ダブルバッファリングをサポートしています。

関数

初期化

ここではコンストラクタのみ記述していますが、同じ引数セットのset関数がすべて用意されています。

Canvas(Canvas::fullscreen, const Display disp = Display::primary)
現在の画面モードでフルスクリーン画面を確保する場合に使います。マルチディスプレイ環境では、最後の引数でどのディスプレイに表示するか指定できます。省略時はプライマリディスプレイになります。詳細はDisplayを参照ください。
Canvas(Canvas::window, const Display disp = Display::primary)
ウィンドウを確保する場合に使います。
Canvas(int width, int height, CanvasMode mode = Canvas::window, const Display disp = Display::primary)
指定の幅と高さでウィンドウを確保します。
Canvas(Rectangle rect, CanvasMode mode = Canvas::window, const Display disp = Display::primary)
バーチャルスクリーン上の指定の矩形でウィンドウを確保します。
Canvas(int width, int height, int colordepth, double refreshrate, const Display disp = Display::primary)
画面モードを指定してフルスクリーン画面を確保します。指定した画面モードが選べなかった場合は、例外が送出されプログラムは強制終了します。また、CRTは機器によってリフレッシュレートが小数点以下の桁でわずかに異なります(60Hzと表示されていても、厳密には60.2Hzなど小数点以下の桁があります)。初期化時には小数点以下の桁は無視して確保しますが、正確なタイミングでflipするには、ディスプレイ装置の設定等で小数点以下の桁をあらかじめ調べて、正確な値を指定することをお勧めします。
void setGammaValue(const double gamma_r, const double gamma_g, const double gamma_b)
表示装置の機能を利用したガンマ補正を行います。補正が行われるかどうかは表示機器(主にビデオカード)の能力に依存します。

フレーム管理

void flip(int duration = 1)
フレームをduration回分の垂直同期の間表示します。durationに不動小数点型は入れられません。コンパイルエラーとなります。

フレームバッファはダブルバッファリングされており、flip命令では「現在の裏画面を表画面に移してduration回分の垂直同期の間表示するよう予約する」という動作を行います。

psychlops_flip.png

flip後のバックバッファの内容は不定です。必ずclearなどの方法で一度全画面を書き直す必要があります。

描画

void clear(Color col = Color::black)
フレームをクリアします。比較的重いのでフレームの描き始めに一回だけ使うのがよいと思われます。
void pix(double x, double y, const Color/Stroke &col/strk)
void pix(const Point &po, const Color/Stroke &col/strk)
(x, y)またはpoで指定した座標にcolで指定した色のドットを描画します。
void line(const Line &drawee, const Color/Stroke &col/strk)
void line(double x1, double y1, double x2, double y2, const Color/Stroke &col/strk)
void line(const Point &po1, const Point &po2, const Color/Stroke &col/strk)
Lineで指定した直線または(x1, y1)から(x2, y2)まで、またはpo1からpo2までの直線を、指定した色またはストロークで描画します。
void rect(const Rectangle &drawee, const Color/Stroke &col/strk)
Rectangleで指定した長方形を指定した色またはストロークで描画します。
void ellipse(const Ellipse &drawee, const Color/Stroke &col/strk)
void ellipse(const Rectangle &rect, const Color/Stroke &col/strk)
Ellipseで指定された楕円またはrectの内接楕円を、指定した色またはストロークで描画します。
void polygon(const Polygon &drawee, const Color/Stroke &col/strk)
色またはストロークで描画します。
void polygon(Point *vertices, unsigned int nVertices, const Color/Stroke &col/strk)
Polygonで指定された多角形またはnVertices個の頂点数を持つ頂点配列verticesで定義された多角形を、指定した色またはストロークで描画します。

画像の転送

Canvas.copy(Rectangle source, Rectangle target, bool delete_source = false, Color clearcolor = Color::black)
画面内のsourceに当たる矩形で囲まれた一部分を、targetで囲まれた部分に複製します。領域が重なった時の動作は未定です。3番目の引数にtrue、4番目の引数に色を指定すると、コピー元(source)の領域を指定色で塗りつぶします。
Canvas.to(Image target, Rectangle source)
画面内のsourceに当たる矩形で囲まれた一部分を、targetで指定されたImageに複製します。targetは中身が破棄され強制的に新しいImageに書き変わるので注意してください。
Canvas cnvs(Canvas::window);
Image img;
Rectangle rect(100,100);

...

cnvs.to(img, rect);
img.save("screenshot.png");

文字表示

void var(int number, double x, double y, Color col=Color::white, bool fillForward=false)
void var(double number, double x, double y, Color col=Color::white, bool fillForward=false)
numberで指定した数値をx, y座標に表示します。数値以外は表示できません。通常は右詰めで表示しますが、fillForwardにtrueを指定すると左詰めで表示します。
void msg(char* string, double x, double y, Color col=Color::white, const int horiz_align=Letters::TEXT_ALIGN_LEFT)
void msg(std::string string, double x, double y, Color col=Color::white, const int horiz_align=Letters::TEXT_ALIGN_LEFT)
stringで指定した文字列をx, y座標に表示します。現在は英数字(ASCII文字)のみが表示できます。デフォルトでは左詰で表示します。
canvas.msg("Psychlops Test", 100, 100) // 100,100を始点として"Psychlops Test"と表示する。
void msg(wchar_t* string, double x, double y, Color col=Color::white, const int horiz_align=Letters::TEXT_ALIGN_LEFT)
void msg(std::wstring string, double x, double y, Color col=Color::white, const int horiz_align=Letters::TEXT_ALIGN_LEFT)
stringで指定した多倍長文字列(漢字を含む)をx, y座標に表示します。多倍長文字列リテラルはL"..."という形式で指定します。
canvas.msg(L"テスト", 100, 100) // 100,100を始点として"テスト"と表示する。

ユーティリティ

void watchFPS()
void ignoreFPS()
FPSチェッカの記録開始・記録停止を制御します。刺激提示時など、フレームが落ちていたか否かを判断するのに必要な部分を記録し、回答待ち時間などは切っておくと求めていた動作が行われていたか確認できます。なお、チェッカを起動しなくてもフレームレートの制御は常時行われています。
void showFPS()
void hideFPS()
FPSチェッカの記録を表示する・しないを制御します。表示していなくても記録は行われています。
void initFPS()
FPSチェッカをリセットします。
void progressbar(double ratio);
void progressbar(X now, X max)
プログレスバーを表示します。プログレスバーは強制的にフロントバッファに表示されるため、flipする必要はありません。double型ひとつで指定するとそれを比率(0.0〜1.0)と解釈し、数値型を二つ入れると(現在値 / 最大値)として比率を計算して表示します。
for(int i=0; i<MAX, i++) {
    canvas.progressbar(i, MAX);
}
void progressbar(Rectangle &rect, Color fillcol=Color::blue, Color empcol=Color(0.25,0.25,0.25))
プログレスバーの基本表示設定を変更します。場所をrectで指定し、前景色をfillcol、背景色をempcolで指定します。

座標取得

それぞれの関数名のとおりの長方形の情報を取得します。例えば、getWidthなら長方形の幅を返します。

double getWidth() const
double getHeight() const
Point getCenter() const
double getHcenter() const
double getVcenter() const
int getColorDepth() const
double getRefreshRate() const

その他

更新日時:2011/06/13 12:10:46
キーワード:[Class] [Drawable] [Graphic]
参照:[(ProgramGuide) Basics of Drawing] [リファレンスマニュアル] [(逆引き) なんでも]