Re: Gtk::Image, Gtk::ImageSurface, Cairo::Context, Gtk::Pixbuf : how to combine?



Hi yann

Thank you for your suggestion. I have changed things so that i use the
Cairo::Context i  get from the on_draw method of a derived
DrawingArea.
Whenever the image contents change, i call invalidate_rect() to make
them visible.

Thanks!
  Jody

On Fri, Feb 8, 2013 at 4:16 PM, Yann Leydier <yann leydier info> wrote:
> Hi,
>
> as there is a version of Gdk::Pixbuf::create_from_data() that takes a
> destroyer for the data as argument, it is highly probable that you have to
> make sure that the data is not destroyed before the pixbuf. In this case,
> the data is destroyed at the end of paint_image() and not available anymore
> when the expose event is thrown.
>
> Usually, people use a DrawingArea with Cairo, not an Image. This allows to
> draw directly on the DrawingArea's Gdk::Window via Cairo.
>
> yann
>
>
> On 08/02/13 16:08, jody wrote:
>>
>> Hi
>>
>> What i want to do is to get a cairo context to draw in, and then
>> somehow get a pixbuf which i can use to fill a Gtk::Image.
>> Here's how i do it:
>> - create an ImageSurface,
>> - get its Cairo::Context,
>> - draw into the Context
>> - create a Pixbuf from th ImageSurface (which now should hold the
>> drawing made via the Context
>> - call the Gtk::Image's set-method with the PixBuf
>> But that way i get a Segmenrtation fault.
>>
>> In particular, I have an application with a Gtk::Window containing a
>> Gtk::Image (m_imgMain).
>> When a button is pressed, i call the window's method paint_image
>> (which does the steps described above):
>>
>> void XLoopWin::paint_image() {
>>      // get current size of image
>>      Gtk::Allocation allocation = m_imgMain.get_allocation();
>>      const int iW = allocation.get_width();
>>      const int iH = allocation.get_height();
>>
>>      // create  image surface
>>      Cairo::RefPtr<Cairo::ImageSurface> surface =
>>          Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, iW, iH);
>>
>>      // create a context to draw on
>>      Cairo::RefPtr<Cairo::Context> cr = Cairo::Context::create(surface);
>>
>>      // here i would draw in the cr, but have crash without drawing
>>
>>       // create a Pixbuf from the ImageSurface
>>       Glib::RefPtr<Gdk::Pixbuf> pixbuf = Gdk::Pixbuf::create_from_data(
>>           surface->get_data(), Gdk::COLORSPACE_RGB, true, 8, iW, iH,
>> surface->get_stride());
>>
>>      // set the drawing
>>      m_imgMain.set(pixbuf);
>>
>>      // make sure image is redrawn
>>      m_imgMain.queue_draw();
>> }
>>
>>
>> This method completes, but immediately afterwards i have a
>> Segmentation fault deep down
>>
>> #0  0x00007ffff5fb9227 in gdk_cairo_set_source_pixbuf ()
>>     from /usr/lib64/libgdk-3.so.0
>> #1  0x00007ffff68c51d7 in gtk_theming_engine_render_icon ()
>>     from /usr/lib64/libgtk-3.so.0
>> #2  0x00007ffff6888333 in gtk_render_icon () from /usr/lib64/libgtk-3.so.0
>> #3  0x00007ffff67e88ef in _gtk_icon_helper_draw ()
>>     from /usr/lib64/libgtk-3.so.0
>> #4  0x00007ffff67f72c9 in gtk_image_draw () from /usr/lib64/libgtk-3.so.0
>> #5  0x00007ffff7a8372c in
>> Gtk::Widget_Class::draw_callback(_GtkWidget*, _cairo*) () from
>> /usr/lib64/libgtkmm-3.0.so.1
>> ...
>> #43 0x00007ffff478c3ac in g_main_loop_run () from
>> /usr/lib64/libglib-2.0.so.0
>> #44 0x00007ffff680eda2 in gtk_main () from /usr/lib64/libgtk-3.so.0
>> #45 0x00007ffff7a2b047 in Gtk::Main::run(Gtk::Window&) ()
>>     from /usr/lib64/libgtkmm-3.0.so.1
>> #46 0x0000000000406897 in main (iArgC=1, apArgV=0x7fffffffddd8) at
>> XLoop.cpp:18
>>
>>
>> Can anybody tell me the correct way to do this?
>>
>> Thank You
>>    Jody
>> _______________________________________________
>> 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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]