Может ли Каир рисовать прямо на Gtk.Pixbuf? - PullRequest
2 голосов
/ 23 сентября 2011

У меня есть хорошая, работающая система на C #, которая рисует с помощью команд Cairo в методе рендеринга. Однако иногда я хотел бы рисовать в растровое изображение, а не динамически, когда экран должен быть обновлен. Например, в настоящее время у меня есть:

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, но рисунок Каира мог бы перейти непосредственно к pixbuf. Будем благодарны за любые подсказки!

1 Ответ

1 голос
/ 23 сентября 2011

Ответ на самом деле довольно прост: когда вы визуализируете объекты, визуализируйте их в контекст, созданный из сохраненной поверхности.Затем при рендеринге окна вставьте контекст, основанный на той же сохраненной поверхности.

Создайте поверхность:

  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

Вот и все!

...