これまでのところ、Graphics32には直接パターンはサポートされていませんが、使用するパターンのようなパターンを作成する方法は数多くあります。
ここではサンプルポリゴンフィラーを使用して一つの解決策です:
まずあなたはハッチパターンのためのサンプラークラスを記述する必要があります。このようなサンプラーを構築する方法はいくつかあります。下には、非常にシンプルなものを見つけることができます。
type
THatchedPatternSampler = class(TCustomSampler)
public
function GetSampleInt(X, Y: Integer): TColor32; override;
end;
function THatchedPatternSampler.GetSampleInt(X, Y: Integer): TColor32;
begin
Result := 0;
if ((X - Y) mod 8 = 0) or ((X + Y) mod 8 = 0) then
Result := clRed32
end;
あなただけ(GetSampleInt)ここでは1つのメソッドをオーバーライドする必要があり、他のすべてのメソッドは、上位クラスから使用することができます。
これで少し畳み込まれます。サンプルを使用するためには、このようなTSamplerFillerのトップにそれを使用する必要があります。
Sampler := THatchedPatternSampler.Create;
Filler := TSamplerFiller.Create(Sampler);
あなたは、このフィラーを持ったら、あなたはPolygonFSあるいはPolylineFSでそれを使用することができます。
最後のコードは次のようになります。
var
Polygon: TArrayOfFloatPoint;
Sampler: THatchedPatternSampler;
Filler: TSamplerFiller;
begin
Polygon := Ellipse(128, 128, 120, 100);
Sampler := THatchedPatternSampler.Create;
try
Filler := TSamplerFiller.Create(Sampler);
try
PolygonFS(PaintBox32.Buffer, Polygon, Filler);
finally
Filler.Free;
end;
finally
Sampler.Free;
end;
PolylineFS(PaintBox32.Buffer, Polygon, clRed32, True, 1);
end;
これは(ここでは:TPaintBox32インスタンスのバッファ)ビットマップの中央にかなり大きな楕円を描きますし、斜線のサンプラーのコードでそれを埋めます。最後に、PolylineFS関数を使用して実線のアウトラインが描画されます。
これは、GetSampleIntがピクセルごとに呼び出されるときの最速のアプローチではありません。しかし、何が起こるのかを理解するのが一番簡単です。
もっと速い選択肢の場合は、直接フィラーを直接使用する必要があります。
function THatchedPatternFiller.GetFillLine: TFillLineEvent;
begin
Result := FillLine;
end;
しかし、FillLine方法が少し複雑このようになります:
procedure THatchedPatternFiller.FillLine(Dst: PColor32; DstX, DstY,
Length: Integer; AlphaValues: PColor32);
var
X: Integer;
begin
for X := DstX to DstX + Length do
begin
if ((X - DstY) mod 8 = 0) or ((X + DstY) mod 8 = 0) then
Dst^ :=clRed32
else
Dst^ := 0;
Inc(Dst);
end;
end;
GetFillLineは、のような単純な取得方法は
type
THatchedPatternFiller = class(TCustomPolygonFiller)
private
procedure FillLine(Dst: PColor32; DstX, DstY, Length: Integer; AlphaValues: PColor32);
protected
function GetFillLine: TFillLineEvent; override;
end;
:あなたはこのようTCustomPolygonFillerから直接導き出すことができます
DstYは一定のままなので、コードをリファクタリングしてパフォーマンスを向上させることもできます。または、アセンブラ(SSE)を使用してコードをスピードアップすることもできますが、これは単純な機能のために過度の作業になると思います。