リージョン
ラスタオペレーション
ピクセルの描画は、描画される前にある二つの値が比較されます
それは、描画される色(ソース)と画面の色(ディスティネーション)です
簡単に考えて、白を0黒を1として比較するとします
描画しようとしている色と画面の色を比較して、その結果で描画命令を実行するとすれば
ピクセルレベルの操作を全体的に、しかも簡易に行うことができるのです
このようなピクセルレベルのビットの操作をラスタオペレーション(ROP)と呼ばれ
2つのピクセルを操作することをバイナリラスタオペレーション(ROP2)と呼びます
2つのピクセルとは、描画する色と画面の色の二つです
さて、このラスタオペレーションで一体何ができるのでしょうか
例えば、画面の色が白の時は黒を出力し、画面の色が黒の時は白を出力するというような
排他的な論理演算による操作などは、このラスタオペレーションで行うことができます
この操作を実現するのが System.Drawing.Region クラスです
このクラスは、リージョン(範囲)情報を保持し
さらに、他のリージョンやパス、長方形などと論理演算して ROP を実現します
Object
MarshalByRefObject
Region
public sealed class Region : MarshalByRefObject, IDisposable
コンストラクタは、以下のものが定義されています
public Region();
public Region(GraphicsPath path);
public Region(Rectangle rect);
public Region(RectangleF rect);
public Region(RegionData rgnData);
path には、リージョンとなるパスを表す GraphicsPath オブジェクトを
rect には、長方形を示す構造体オブジェクトを指定します
rgnData は、リージョンのデータを示す RegionData オブジェクトを指定します
リージョンは、指定したパスや長方形などで初期化され、インスタンスが作られます
後は、このリージョンに対して指定した矩形と論理演算を行えます
単純に、指定された領域と現在の領域を組み合わせるには Region.Union() を
重なる部分を反転させるには Region.Xor() メソッドを使います
public void Union(GraphicsPath path);
public void Union(Rectangle rect);
public void Union(RectangleF rect);
public void Union(Region region);
public void Xor(GraphicsPath path);
public void Xor(Rectangle rect);
public void Xor(RectangleF rect);
public void Xor(Region region);
path には、現在のリージョンと比較するパスを表す GraphicsPath オブジェクトを
rect には、長方形をあらわす構造体オブジェクトを
region には、リージョンを表す Region オブジェクトを指定することができます
Region オブジェクトは Graphics.FillRegion() メソッドで描画できます
public void FillRegion(Brush brush , Region region);
brush には塗りつぶしに用いる論理ブラシを
region には描画する Region オブジェクトを指定します
using System.Windows.Forms;
using System.Drawing;
class WinMain : Form {
public static void Main(string[] args) {
Application.Run(new WinMain());
}
override protected void OnPaint(PaintEventArgs e) {
Graphics g = e.Graphics;
Region rg = new Region(new Rectangle(10 , 10 , 200 , 100));
rg.Xor(new Rectangle(100 , 50 , 200 , 100));
g.FillRegion(Brushes.Black , rg);
}
}
このプログラムは、指定した長方形で Region インスタンスを作成し
さらに、Xor() メソッドで、指定した長方形を排他的に追加しています
その結果、Region は交わった部分を除外して更新されます
この他にも、指定した領域のうち現在の領域から
交わらない部分だけで更新する Region.Complement() メソッドや
逆に、現在の領域のうち指定した領域に交わらない部分だけで更新する
Region.Exclude() メソッドなども存在します
これらのパラメータは Union() や Xor() メソッドと同じなので、説明は省略します