2011-09-23 10 views
1

J'ai un bon système de travail en C# qui dessine avec les commandes Cairo dans une méthode de rendu. Cependant, parfois je voudrais dessiner dans un pixmap, plutôt que dynamiquement quand l'écran doit être mis à jour. Par exemple, actuellement, j'ai:Le Caire peut-il dessiner directement sur un Gtk.Pixbuf?

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(); 
} 

Mais je voudrais, si je veux, pour rendre le Caire ordonne à un Gtk.Pixbuf. Quelque chose comme:

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

Est-ce possible? Ce serait génial si je n'avais pas à retourner le contexte dans un pixbuf, mais que le dessin du cairo irait directement au pixbuf. Tous les conseils à ce sujet seraient appréciés!

Répondre

1

La réponse est en fait assez simple: quand les objets que vous rendez, les rendre à un contexte créé à partir d'une surface enregistrée. Ensuite, lorsque vous affichez la fenêtre, insérez un contexte basé sur la même surface enregistrée.

Créer une surface:

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

Render une forme à la surface:

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

Render la fenêtre:

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

Ca y est!

Questions connexes