2

私は、renderメソッドでCairoコマンドを使用して描画するC#の優れた動作システムを持っています。ただし、画面を更新する必要があるときに動的にではなく、ピックスマップに描画したい場合があります。たとえば、現在私は次のことをしています。

public override void render(Cairo.Context g) {
  g.Save();
  g.Translate(x, y);
  g.Rotate(_rotation);
  g.Scale(_scaleFactor, _scaleFactor);
  g.Scale(1.0, ((double)_yRadius)/((double)_xRadius));
  g.LineWidth = border;
  g.Arc(x1, y2, _xRadius, 0.0, 2.0 * Math.PI); 
  g.ClosePath();
}

ただし、必要に応じて、CairoコマンドをGtk.Pixbufにレンダリングしたいと思います。何かのようなもの:

 g = GetContextFromPixbuf(pixbuf);
 render(g);

それは可能ですか?コンテキストをpixbufに戻す必要がなかったとしたら、それは素晴らしいことですが、cairoの描画は直接pixbufに送られます。これに関するヒントをいただければ幸いです。

4

1 に答える 1

1

答えは実に簡単です。オブジェクトをレンダリングするときは、保存されたサーフェスから作成されたコンテキストにオブジェクトをレンダリングします。次に、ウィンドウをレンダリングするときに、保存された同じサーフェスに基づいてコンテキストを挿入します。

サーフェスを作成する:

  surface = new Cairo.ImageSurface(Cairo.Format.Argb32, width, height);

表面に形状をレンダリングする:

using (Cairo.Context g = new Cairo.Context(surface)) {
  shape.render(g); // Cairo drawing commands
}

ウィンドウをレンダリングします。

  g.Save();
  g.SetSourceSurface(surface, 0, 0);
  g.Paint();
  g.Restore();
      ... // other Cairo drawing commands

それでおしまい!

于 2011-09-23T14:04:58.123 に答える