Ok, changed my gmail parameters, now I'll reply all ;)
_____

Thanks for the answer. Indeed I did read these documentations (of course
not all of them, but the interesting parts I hope).

I think I found why I had very strange results.
In the documentation, the description of cr->rectangle() says that it "adds
a closed-subpath".
The "adds" words got me thinking and, correct me if I'm wrong, when you
have several different paths to draw, it's a good thing to call
cr->begin_new_path() before every new path, isn't it?

I don't think I've seen this in the tutorials.


-- 
Romain "Creak" Failliot


2013/11/23 Ian Martin <martin...@vodafone.co.nz>

>  On 24/11/13 07:50, creak ml wrote:
>
>    Hi!
>
>  I'm using a Gtk::DrawingArea to do some a special profiling drawing tool.
>  At some point, I want to draw a box, fill it with a color, stroke it in
> black and write a text on it (and not drawing out of the box). I succeeded
> in a way, but I'm not sure it's the perfect way of doing it.
>  Since the drawings in this DrawingArea will be pretty intensive, I'd like
> to have some advice from you because I'm a bit lost with what save, restore
> and *_preserve methods do...
>
>  Here the (simplified) code of the drawing:
>
>      // In the on_draw() method.
>     // cr is a Cairo::RefPtr<Cairo::Context> const&.
>     // For each box I've got to draw.
>
>     // Set the rectangle bounds.
>     cr->rectangle(rectX, rectY, rectWidth, rectHeight);
>
>     // Save it, fill, preserve and restore.
>     cr->save();
>     cr->set_source_rgb(1.0, 0.8, 0.5);
>     cr->fill_preserve();
>     cr->restore();
>
>     // Save it again, stroke, preserve and restore.
>     cr->save();
>     cr->set_source_rgb(0.0, 0.0, 0.0);
>     cr->set_line_width(1.0);
>     cr->stroke_preserve();
>     cr->restore();
>
>     // Initialize pango font.
>     Pango::FontDescription font;
>     font.set_family("DejaVu Sans");
>     font.set_size(12 * PANGO_SCALE);
>     font.set_stretch(Pango::STRETCH_CONDENSED);
>
>     // Initialize pango layout.
>     Glib::RefPtr<Pango::Layout> layout = create_pango_layout(text);
>     layout->set_font_description(font);
>
>     // Get the text dimensions.
>     int textWidth;
>     int textHeight;
>     layout->get_pixel_size(textWidth, textHeight);
>
>     // Position the text in the middle.
>     // Save, clip, set color, move to the middle, draw text, reset clip,
> restore.
>     cr->save();
>     cr->clip();
>     cr->set_source_rgb(0.0, 0.0, 0.0);
>     cr->move_to(rectX + (rectWidth - textWidth) / 2, rectY + (rectHeight -
> textHeight) / 2);
>     layout->show_in_cairo_context(cr);
>     cr->reset_clip();
>     cr->restore();
>
>  Trust me, if I remove one save/restore or one preserve, the draw is
> becoming pretty f*cked up.
>  Maybe a first thing would be to cache the font.
>  Do you have other ideas, GTKMM gurus? ;)
>
>  Cheers,
>  Creak
>
>  Hi Creak,
> I assume you found the manual-
> https://developer.gnome.org/gtkmm-tutorial/unstable/index.html and have
> read the chapter on drawing?  It should answer your questions.  The online
> (or offline, if you've got the docs ) reference 
> manualhttps://developer.gnome.org/gtkmm/unstable/
> lists all the functions including the ones you're asking about; generally
> the *mm documentation is of a high standard.  Make sure you're using
> references for the version you're using; there's been a number of changes
> between version 2 and 3 of gtkmm.
>
> tldr: a Cairo::context has a set of attributes at any point in time,
> including clip regions, colour for background and foreground, line size,
> etc.  By encasing all writes to the Context in save and restore, you
> prevent your code from modifying the base context.  With that
> understanding, you may want to encase your code slightly differently; for
> instance, saving before clipping, then saving/ restoring around each paint
> (the save / restore functions push the context onto a stack, so you can
> have effectively unlimited depth).
>
> The *_preserve functions write to the context but preserve the path they
> write on, which is lost with the other (stroke and fill) methods.  Useful
> if you want to e..g. stroke in one colour and fill in another.  Have a look
> at the examples in the manual for ideas.
>
>
> HTH,
> Ian.
>
> _______________________________________________
> gtkmm-list mailing list
> gtkmm-list@gnome.org
> https://mail.gnome.org/mailman/listinfo/gtkmm-list
>
>
_______________________________________________
gtkmm-list mailing list
gtkmm-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtkmm-list

Reply via email to