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 <[email protected]> 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 >> [email protected] >> https://mail.gnome.org/mailman/listinfo/gtkmm-list >> > _______________________________________________ > gtkmm-list mailing list > [email protected] > https://mail.gnome.org/mailman/listinfo/gtkmm-list _______________________________________________ gtkmm-list mailing list [email protected] https://mail.gnome.org/mailman/listinfo/gtkmm-list
