Le modèle de tracé Cairo
Le concept de base du tracé dans Cairo consiste à définir des chemins « invisibles », puis à les tracer ou les remplir pour les rendre visibles.
To do any drawing in gtkmm with Cairo, you must first create a Cairo::Context object. This class holds all of the graphics state parameters that describe how drawing is to be done. This includes information such as line width, color, the surface to draw to, and many other things. This allows the actual drawing functions to take fewer arguments to simplify the interface. In gtkmm, a Cairo::Context is created by calling the Gdk::Window::create_cairo_context() function. Since Cairo contexts are reference-counted objects, this function returns a Cairo::RefPtr<Cairo::Context> object.
L'exemple ci-après montre comment définir un contexte Cairo avec une couleur de premier plan rouge et une épaisseur de trait de 2. Toute fonction de tracé se servant de ce contexte utilisera ces réglages.
Gtk::DrawingArea myArea; Cairo::RefPtr<Cairo::Context> myContext = myArea.get_window()->create_cairo_context(); myContext->set_source_rgb(1.0, 0.0, 0.0); myContext->set_line_width(2.0);
Chaque Cairo::Context est associé à une fenêtre Gdk::Window donnée ; ainsi, la première ligne de l'exemple ci-dessus crée un élément graphique Gtk::DrawingArea et la deuxième ligne utilise son objet Gdk::Window associé pour créer un objet Cairo::Context. Les deux dernières lignes modifient les caractéristiques graphiques du contexte.
De nombreuses variables d'état graphique peuvent être définies pour un contexte Cairo. Les attributs les plus courants sont la couleur (avec set_source_rgb() ou set_source_rgba() pour des couleurs transparentes), l'épaisseur du trait (avec set_line_width()), le type de pointillé (avec set_dash()), les bouts de lignes (avec set_line_cap()), les jonctions de lignes (avec set_line_join()) et les styles de polices de caractères (avec set_font_size(), set_font_face() et autres). Il existe beaucoup d'autres réglages : les matrices de transformation, les règles de remplissage, les types d'anti-crénelage, etc. Pour plus d'informations, consultez la documentation de l'API cairomm.
The current state of a Cairo::Context can be saved to an internal stack of saved states and later be restored to the state it was in when you saved it. To do this, use the save() method and the restore() method. This can be useful if you need to temporarily change the line width and color (or any other graphics setting) in order to draw something and then return to the previous settings. In this situation, you could call Cairo::Context::save(), change the graphics settings, draw the lines, and then call Cairo::Context::restore() to restore the original graphics state. Multiple calls to save() and restore() can be nested; each call to restore() restores the state from the matching paired save().
It is good practice to put all modifications to the graphics state between save()/restore() function calls. For example, if you have a function that takes a Cairo::Context reference as an argument, you might implement it as follows:
void doSomething(const Cairo::RefPtr<Cairo::Context>& context, int x) { context->save(); // change graphics state // perform drawing operations context->restore(); }
The virtual on_draw() method provides a Cairo context that you shall use for drawing in the Gtk::DrawingArea widget. It is not necessary to save and restore this Cairo context in on_draw().