with-render-properties (マクロ)
インポート元: CURL.GUI.STANDARD. package 内で定義されています CURL.GRAPHICS._2D.RENDERER2D.

構文

{with-render-properties
        [property* = value*,]*
        property = value
        on renderer2d do
        body
    }

with-render-properties は一時的に 1 つ以上のレンダリング プロパティを Renderer2d に割り当てます。

説明

with-render-properties は次の操作を実行します。
  1. 指定された Renderer2d で、描画の色など一連のレンダリング プロパティを設定します。色とテクスチャのマッピングの詳細については FillPattern を参照してください。
  2. 通常 Renderer2d のメソッド呼び出しで構成されるコードの本体を実行します。
  3. レンダリング プロパティを前回の値にリセットします。


この設計により Renderer2d の状態が確保されます。たとえば、サードパーティのコードが Renderer2d にアクセスできるようにして、コードの制御が復帰する前にレンダリング プロパティに行われた変更を復元することができます。

with-render-properties 呼び出しはネストできます。この場合、いくつかのレンダリング プロパティが相対的であることに留意してください。つまり、相対的なプロパティの値を設定すると、新しい値は前の値に相対的なものとして解釈されます。たとえば、15 度の rotation が適用された後、20 度の rotation が続く場合、一番内側の with-render-properties コード ブロック内の変換の合計は 35 度の rotation になります。

代入はすべて与えられた順に行われます。そのため、たとえば変換処理を変更した後でクリッピング領域を指定した場合、有効なクリッピング領域は新しい変換処理で変換されることになります。

たとえば、次のコードは同じことになります。

{with-render-properties
    a,
    b
    on r2d do
    ...
}


{with-render-properties a on r2d do
    {with-render-properties b on r2d do
        ...
    }
}


次の表では、サポートされているレンダリング プロパティとその説明を示します。

レンダリング プロパティ説明
fill-pattern:FillPatternレンダリングに使用されるソース FillPattern
draw-operation:DrawOperationソース ピクセルおよび出力先ピクセルの赤、緑、青およびアルファ チャネルの組み合わせ方法。
stroke-thickness:Distanceレンダリングされる線の太さ。
line-style:LineStyleレンダリングされる線の様式。LineStyle を参照してください。
font:Font文字列をレンダリングするのに使用するフォント。


次のレンダリング プロパティは相対的です。

レンダリング プロパティ説明
translation:Distance2dx-y 平面内で現在の変換を平行移動します。
translation-x:Distancex 軸に沿って現在の変換を平行移動します。
translation-y:Distancey 軸に沿って現在の変換を平行移動します。
rotation:Angle
起点を中心に現在の変換を回転します。
正の値は時計回りの回転を指定します。負の値は反時計回りの回転を指定します。
uniform-scale:double現在の変換をスケールに応じて均一に変更します (x 軸と y 軸両方に沿って)。
scale:Double2d現在の変換を、scale パラメータの x フィールドを x 軸に、scale パラメータの y フィールドを y 軸に合わせて変更します。
transformation: Transformation2d
既存の変換と指定された Transformation2d を組み合わせて、新しい座標変換を作成します。新しい座標変換の計算に使用される式は次のとおりです。
{old-transformation.compose-clone new-transformation}
これは、古い変換マトリックスに新しい変換マトリックスを乗算し、その結果が新しい transformation レンダリング プロパティになります。compose-clone を含むそのメソッドの詳細については Transformation2d を参照してください。
座標変換は、レンダリング中のすべての座標を変換するのに使用されます。つまり、Transformation2d.transform-point ( Transformation2d を参照) は、レンダリングされる各頂点で呼び出されるということです。
座標変換を変更して、さまざまな効果を生み出すことができます。これには、頂点のスケール変更、平行移動、回転などが含まれます。実際、次のレンダリング プロパティは直接座標変換を変更し、Transformation2d の使用の省略形になります。
  • translation
  • translation-x
  • translation-y
  • rotation
  • uniform-scale
  • scale
GUI Toolkit は座標変換を使用して、レンダリングに使用する座標システムがレイアウト座標システムと一致することを確認します。つまり、グラフィカル オブジェクトが Graphic.draw を呼び出した結果としてそれ自体を描画する場合、Graphic.draw に渡された Renderer2d はその座標システムを設定して、その原点はグラフィカル オブジェクトの原点と一致し、Renderer2d のクリッピング境界はグラフィカル オブジェクトのレイアウト境界に設定されます。
座標変換の初期値は恒等変換 — つまり、座標をまったく変更しない変換です。ただし、Renderer2d のインスタンスにはすでに transformation が割り当てられているものもあります。これは前述したような GUI Toolkit Renderer2d に関する場合です。
すべてのレンダリング プロパティと同様に、with-render-properties ブロックの最後で座標変換はその前の状態に復元されます。
absolute-transformation: Transformation2d
提供された Transformation2d を使って、既存の変換を交換し、新しい座標変換を形成します。 transformation との唯一の相違は、既存の変換に付加するのではなくオーバーライドすることです。
他の全てのレンダリングプロパティのプロパティと同様に、座標変換は with-render-properties ブロックの最後で以前の状態に復元されます。
texture-transformation:TextureTransformation2d
既存のテクスチャ変換と指定された TextureTransformation2d を組み合わせて、新しいテクスチャ変換を生成します。新しい変換の計算に使用される式は次のとおりです。
{old-transformation.compose-clone new-transformation}
これは、古い変換マトリックスに新しい変換マトリックスを乗算し、その結果が新しい texture-transformation レンダリング プロパティになります。 Transformation2d の API ドキュメントには、TextureTransformation2d および Transformation2d のメソッドに関する情報が含まれています。TextureTransformation2d の API ドキュメントには、さらにテクスチャ変換に関する情報がその例と共に掲載されています。
テクスチャ変換は、レンダリング中のすべてのテクスチャ座標を変換するのに使用されます。通常、これらのテクスチャ座標は直接指定したり、表示することはありません。(ただし、Renderer2d.render-rectangle だけは例外で、ここではテクスチャ座標をメソッドの引数として指定できます)。ただし、テクスチャ マッピングを行うレンダリング (つまり、均一でない FillPattern のレンダリング) は、このレンダリング プロパティの影響を受けます。
テクスチャ座標は直接テクスチャ上の点にマッピングします。(0, 0) はテクスチャの左上隅に、(0.5, 0.5) はその中心に、(1, 1) はその右下隅にマッピングします。テクスチャ変換が (2, 2) のスケールで設定され、Renderer2d.render-rectangle が既定のテクスチャ座標 (0, 0) および (1, 1) で呼び出された場合、イメージは 4 つのコピーが四角形を塗りつぶすようにマッピングされます。これは、座標 (0, 0) は変更されず、座標 (1, 1) が (2, 2) に変換されるためです。これはテクスチャ ラッピングの一例にもなります。
平行移動や回転などの他の変換は可能です。これらは TextureTransformation2d のメソッドを使用すればすべて実現できます。
初期 texture-transformation は恒等変換 — つまり、テクスチャ座標をまったく変更しない変換です。
clipping-region:Region
現在のクリッピング領域を、入力 Region と現在のクリッピング領域との交点に設定します。
with-render-properties ブロックの最後で、前のクリッピング領域が復元されます。
clipping-rectangle:(x:Distance, y:Distance, width:Distance, height:Distance)
現在のクリッピング領域を、入力の四角形と現在のクリッピング領域との交点に設定します。
with-render-properties ブロックの最後で、前のクリッピング領域が復元されます。
このプロパティを使用すると、明示的に四角形の Region を作成する必要なしにクリッピング領域を設定できます。この点を除き、clipping-region プロパティと同じになります。
このプロパティを使用した例を次に示します。
{with-render-properties
    clipping-rectangle=(x, y, width, height)
    on renderer2d do
    ...
}
antialiasing?:bool
with-render-properties スコープ内に描画された幾何学上のオブジェクトのアンチエイリアス処理をオンまたはオフにします。
Renderer2d にはアンチエイリアス処理をサポートしていないものもあります。antialiasing? プロパティは、それらの Renderer2d では無視されます。
Renderer2d がアンチエイリアス処理を実行できるかどうか判別するためには、Renderer2d.caps ゲッターを使用して取得した Renderer2dCapabilities.can-antialias? をチェックします。
antialiasing? プロパティはテキストには影響を与えません。

{with-render-properties
    fill-pattern = "blue",
    clipping-region = region
    on renderer2d do
    {renderer2d.render-line ...}
}

注意事項

with-render-properties ブロックの代入のいずれかから例外がスローされた場合、1 つまたは複数のプロパティがリセットされずRenderer2d が壊れていて、その後のレンダリング呼び出しは正しく実行されない可能性が生じます。

代入のいずれかから例外がスローされる可能性がある場合は、それを別の with-render-properties ブロックに入れるか、または独自の例外ハンドラをインストールする必要があります。

例外がブロック本体の内部からスローされた場合は、プロパティは例外が処理される前に正しくリセットされます。