title: Phi::Canvas
author: YOSHIDA Kazuhiro
mailto: moriq@moriq.com

1. Phi::Canvas

1.1. super class

%c:Object%

1.1. class methods

: new : Phi::Canvas

1.1. properties

: brush : Phi::Brush
  図形と背景を塗りつぶすのに使う brush

: canvas_orientation : Fixnum

  : CO_LEFT_TO_RIGHT

  : CO_RIGHT_TO_LEFT

: clip_rect : Phi::Rect
  クリッピングする長方形の境界

: copy_mode : Fixnum
  graphic image をどのように copy するか

  #copy_rect , #draw で使われる。

  image を合成するとか，異なる %c:copy_mode% で複数の image を結合して bitmap の一部を透過させるといった効果を表現できる。

  : CM_BLACKNESS
    キャンバス上のコピー先の四角形を黒色で塗りつぶす
  : CM_DST_INVERT
    キャンバス上のイメージを反転して，ソースを無視する
  : CM_MERGE_COPY
    AND 論理演算子を使ってキャンバス上のイメージとコピー元のビットマップを結合する
  : CM_MERGE_PAINT
    反転したコピー元ビットマップとキャンバス上のイメージを OR 論理演算子を使って結合する
  : CM_NOT_SRC_COPY
    反転したコピー元ビットマップをキャンバスにコピーする
  : CM_NOT_SRC_ERASE
    OR 論理演算子を使ってキャンバス上のイメージとコピー元のビットマップを結合して，その結果を反転する
  : CM_PAT_COPY
    コピー元の模様をキャンバスにコピーする
  : CM_PAT_INVERT
    XOR 論理演算子を使ってコピー元の模様とキャンバス上のイメージを結合する
  : CM_PAT_PAINT
    反転したコピー元ビットマップとその模様を OR 論理演算子を使って結合する。この演算結果とキャンバス上のイメージを OR 論理演算子を使って結合する
  : CM_SRC_AND
    キャンバス上のイメージとコピー元のビットマップを AND 論理演算子を使って結合する
  : CM_SRC_COPY
    コピー元のビットマップをキャンバスにコピーする
  : CM_SRC_ERASE
    キャンバス上のイメージを反転し，その結果とコピー元ビットマップを AND 論理演算子を使って結合する
  : CM_SRC_INVERT
    キャンバス上のイメージとコピー元のビットマップを XOR 論理演算子を使って結合する
  : CM_SRC_PAINT
    キャンバス上のイメージとコピー元ビットマップのピクセルを OR 論理演算子を使って結合する
  : CM_WHITENESS
    キャンバス上のコピー先の四角形を白色で塗りつぶす

: font : Phi::Font
  テキストを書くときに使う font

: lock_count : Fixnum
  ロックされた回数

: pen : Phi::Pen
  線と縁の描画に使う pen

: pen_pos : Phi::Point
  #pen の現在の描画位置

: self[x, y] : Fixnum
  #clip_rect の pixel

: text_flags : Fixnum
  テキストの書き方

  #text_out または #text_rect を呼び出したときにテキストを描画する方法を指定できる。

  以下の定数を組み合わせて作る。

  : ETO_CLIPPED
    指定された長方形内に収まるテキストだけが表示される。このフラグは #text_rect の呼び出し時に自動的に追加される。 #text_out を使ってテキストを書いているときは，描画境界が #text_extent で指定されるため，このフラグは有効ではない

  : ETO_OPAQUE
    テキストを不透明な背景色で描画する。このフラグを使うと，処理速度は改善されるが，テキスト長方形の背後のイメージを透かして見ることはできない

  : ETO_RTLREADING
    テキスト文字列を右から左に表示する。これは， Windows の中東バージョンのみで使うことができる。 , 中東では，テキストを右から左に書く。これはたいてい， #canvas_orientation の %c:CO_RIGHT_TO_LEFT% と組み合わせて使う

  : ETO_GLYPH_INDEX
    テキストは， Windows GDI によって直接解析される文字配置コードから構成される。グリフインデックス付けは TrueType フォントのみに適用されるが，フラグをほかのフォントと使って GDI が言語処理なしでテキスト文字列を直接処理すべきであることを示せる。詳細については， Windows GDI のドキュメントを参照のこと

  : ETO_IGNORELANGUAGE
    これは，ドキュメントで解説されていない Microsoft フラグ。情報が提供されたときに Microsoft のドキュメントの更新内容をチェックのこと

  : ETO_NUMERICSLOCAL
    これは，ドキュメントで解説されていない Microsoft フラグ。情報を利用可能になったときに Microsoft のドキュメントの更新内容をチェックのこと

  : ETO_NUMERICSLATIN
    これは，ドキュメントで解説されていない Microsoft フラグ。情報を利用可能になったときに Microsoft のドキュメントの更新内容をチェックのこと

1.1. methods

: arc(x1, y1, x2, y2, x3, y3, x4, y4) : nil

: arc(rect, x3, y3, x4, y4) : nil
  指定した四角形と境を接する楕円の縁にそって弧を描画する。

  弧は，座標 ( %v:x1% , %v:y1% ) および ( %v:x2% , %v:y2% ) と境界を接する楕円の一部である。

  弧は，楕円の縁にそって始点から終点まで反時計回りに描画される。

  始点は，楕円の中心点と座標 ( %v:x3% , %v:y3% ) によって指定される線と楕円との交点である。

  終点は，楕円の中心点と座標 ( %v:x4% , %v:y4% ) によって指定される線と楕円との交点である。

  #pen で描画される。

: chord(x1, y1, x2, y2, x3, y3, x4, y4) : nil

: chord(rect, x3, y3, x4, y4) : nil
  線と楕円の交点で表現される弓形を描画する。

  弓形は，座標 ( %v:x1% , %v:y1% ) および ( %v:x2% , %v:y2% ) と境界を接する楕円の一部で構成される。楕円は，座標 ( %v:x3% , %v:y3% ) および ( %v:x4% , %v:y4% ) を通る線により分割される。線と楕円との交点を (x3', y3') および (x4', y4') とすると，弓形は (x3', y3') から始まり，反時計回りに楕円にそって (x4', y4') を通り，まっすぐ (x3', y3') に戻る。

  弓形の縁は #pen で描画され，内部は #brush で塗りつぶされる。

: copy_rect(dest, canvas, source) : nil
  %c:self% の image の一部を %v:canvas% に copy する。

  : rect : Phi::Rect
    image が copy される %c:self% 上の領域
  : canvas: Phi::Canvas
    copy 元 image が存在する canvas
  : source: Phi::Rect
    %v:canvas% の領域

  %v:source% は #copy_mode の値を使って copy される。

: draw(x, y, graphic) : nil
  %v:graphic% を座標 ( %v:x% , %v:y% ) に描画する。

  %c:draw% は Phi::Graphic#draw を呼び出す。

  %v:graphic% は Phi::Bitmap# , Phi::Icon# , Phi::Metafile# のいずれかである。 %v:graphic% が Phi::Bitmap# オブジェクトの場合， #copy_mode の値を使って描画される。

: draw_focus_rect(rect) : nil
  focus を受け取ったことを示すのに使うスタイルで四角形を描画する。 control が focus を取得または喪失したときに呼び出す。

  %c:draw_focus_rect% は %c:XOR% 関数を使うので，同じ四角形を指定して呼び出すと四角形は消える。

  %v:rect% の領域をスクロールするには， %c:draw_focus_rect% を呼び出して四角形を消し，領域をスクロールしてから %c:draw_focus_rect% を呼び出して四角形を新しい位置に描画する。

: ellipse(x1, y1, x2, y2) : nil

: ellipse(rect) : nil

  : alias draw_oval

  外接長方形で定義される楕円をキャンバスに描画する。外接長方形が正方形の場合は，円が描画される。楕円のアウトラインは #pen の値を使って描画され，内部は #brush の値を使って塗りつぶされる。

: fill_rect(rect) : nil
  キャンバス上の指定した四角形を #brush で塗りつぶす。四角形の左と上の端は領域に含まれるが，右と下の端は含まれない。

  : rect : Phi::Rect

: flood_fill(x, y, color, fill_style) : nil
  座標 ( %v:x% , %v:y% ) から %v:color% で指定する色境界まで #brush で塗りつぶす。

  : %v:fill_style%
    %v:color% の領域を塗りつぶすか， %v:color% 以外の領域を塗りつぶすか

    : FS_SURFACE
      %v:color% 以外の色に達するまで， %v:color% の色を持つすべての領域を塗りつぶす。
    : FS_BORDER
      %v:color% の色に達するまで， %v:color% 以外の色を持つすべての領域を塗りつぶす。

  #self[] を使うと， %c:FS_SURFACE% の %v:fill_style% を使うときに，座標 ( %v:x% , %v:y% ) の色の正確な値を取得できる。同様に， %v:fill_style% が %c:FS_BORDER% のときは，境界の座標が分かっている場合に， #self[] を使って境界色の正確な値を取得できる。

: frame_rect(rect) : nil
  長方形を描画する。

  %v:rect% の周囲に 1 ピクセル幅の境界線を描画できる。 %c:frame_rect% は， %v:rect% の内部を #brush の模様で塗りつぶさない。

: line_to(x, y) : nil
  #pen_pos で指定される位置から，座標 ( %v:x% , %v:y% ) まで線を引き， #pen_pos を ( %v:x% , %v:y% ) に設定する。

: move_to(x, y) : nil
  #pen_pos を座標 ( %v:x% , %v:y% ) に変更する。

: pie(x1, y1, x2, y2, x3, y3, x4, y4) : nil

: pie(rect, x3, y3, x4, y4) : nil
  キャンバス上の四角形 ( %v:x1% , %v:y1% ) と ( %v:x2% , %v:y2% ) に外接する楕円の扇形を描画する。

  扇形は，座標 ( %v:x1% , %v:y1% ) と ( %v:x2% , %v:y2% ) で形成される長方形と外接する楕円によって定義される。描画される扇形の形は，楕円の中心から始まって座標 ( %v:x3% , %v:y3% ) と ( %v:x4% , %v:y4% ) を通過する 2 つの線で決まる。

  輪郭は #pen で描画され，内部は #brush で塗りつぶされる。

: poly_bezier(points) : nil
  ベジェ曲線を描画する。

  %v:points% で指定したエンドポイントおよびコントロールポイントを使って，立体ベジェ曲線を描画する。

  最初の曲線は，最初の点と 4 番目の点を結んで描画され， 2 番目と 3 番目の点はコントロールポイントとして使われる。

  シーケンスで後続する各曲線は，必ずさらに 3 個の点を必要とする。

  先行する曲線の終点は，次の曲線の始点として，次の 2 個の点はコントロールポイントとして， 3 番目の点が終点として使われる。

  現行のペンを使って線を描画する。

  : points : array of Point

: poly_bezier_to(points) : nil
  ベジェ曲線を描画し， #pen_pos の値を更新する。

  %v:points% で指定したエンドポイントおよびコントロールポイントを使って，立体ベジェ曲線を描画する。

  最初の曲線は，最初の点と 4 番目の点を結んで描画され， 2 番目と 3 番目の点はコントロールポイントとして使われる。

  シーケンスで後続する各曲線は，必ずさらに 3 個の点を必要とする。

  先行する曲線の終点は次の曲線の始点として，次の 2 個の点はコントロールポイントとして， 3 番目の点が終点として使われる。

  現行のペンを使って線を描画し， #pen_pos の値を最後のエンドポイントの値に更新する。

  : points : array of Point

: polygon(points) : nil
  与えられた点を結んでキャンバス上に一連の線を描画してから，最後の点から最初の点へ線を描画して閉じた図形にする。

  #pen の値を使ってキャンバス上に閉じた多角形を描画できる。図形が完成すると， #brush の値を使ってその図形を塗りつぶす。

  キャンバスに多角形を塗りつぶさずに描画するには， #polyline を使って，最後に始点をもう一度指定する。

: polyline(points) : nil
  現在のペンを使って， %v:points% で渡された個々の点を結んでキャンバス上に連続線を描画する。

  %c:polyline% を呼び出すと，キャンバス上の各点を結ぶことができる。点が 2 つしかない場合は 1 本だけ線を引くことになる。最初の点の値で #move_to を呼び出して，連続する各点で #line_to を繰り返し呼び出せば， %c:polyline% を使うのと同じである。 %c:polyline% は %c:line_to% とは違って #pen_pos の値は変更しない。

: rectangle(x1, y1, x2, y2) : nil

: rectangle(rect) : nil

  : alias draw_rect

  %c:rectangle% を呼び出すと， #pen を使って長方形を描画して，その図形を #brush で塗りつぶすことができる。長方形の座標は 4 つの point かひとつの rect で指定できる。

  現在のペンで境界を描画しないで長方形部分を塗りつぶすには #fill_rect を使う。長方形部分を塗りつぶさずに外枠を描画するには #frame_rect か #polygon を使う。角の丸い長方形を描画するには #round_rect を使う。

: round_rect(x1, y1, x2, y2, x3, y3) : nil
  角の丸い長方形をキャンバス上に描画する。

  角の丸い長方形を #pen で描画して，その図形を #brush で塗りつぶすことができる。長方形の端は座標 ( %v:x1% , %v:y1% ), ( %v:x2% , %v:y1% ), ( %v:x2% , %v:y2% ), ( %v:x1% , %v:y2% ) で定義されるが，その角は丸く削られる。丸く削れらた角の曲率は，幅 %v:x3% ，高さ %v:y3% の楕円の曲率と一致する。

  楕円を描画するには #ellipse を使う。正方形を描画するには #rectangle を使う。

: stretch_draw(rect, graphic) : nil
  %v:rect% で指定した四角形の中に収まるように %v:graphic% を描画する。

  %c:stretch_draw% は Phi::Graphic#draw を呼び出す。

  %v:graphic% は image の四角形への収め方を指定する。これにより， image の伸縮率や縦横比が変更される場合もある。

  %v:graphic% を実際の size で描画するには， %c:stretch_draw% ではなく #draw を使う。

  %v:graphic% は Phi::Bitmap# , Phi::Icon# , Phi::Metafile# のいずれかである。 %v:graphic% が Bitmap object の場合， bitmap は #copy_mode の値を使って描画される。

  : rect : Phi::Rect

  : graphic : Phi::Graphic

: text_extent(text) : Size
  #font で描画された文字列の幅と高さをピクセル数で返す。

: text_width(text) : Fixnum
  #font で描画された文字列の幅をピクセル単位で返す。 text_extent#cx と同じ。

  : text : String

: text_height(text) : Fixnum
  #font で描画された文字列の高さをピクセル単位で返す。 text_extent#cy と同じ。

  : text : String

: text_rect(rect, x, y, text) : nil
  四角形にクリッピングして文字列を書き込む。

  四角形の外にはみ出してしまう文字列部分はクリッピングされ，画面上には表示されない。

  : rect : Phi::Rect
    クリッピングする四角形

  : x, y : Fixnum
    テキストの左上隅の位置

  : text : String
    書き込む文字列

: text_out(x, y, text) : nil
  キャンバス上に文字列を描画して， #pen_pos の値を文字列の最後の値に更新する。

: lock { ... }
  他の Delphi Thread がキャンバスに描画できないようにする。
