hi, i am trying to copy an off_screen image to a drawing area (code is attached below). all is fine for the first time. however after the drawing area and the off_screen image are resized the window that supposed to show the off_screen image show garbage. any help will be appreciated. thanks in advance, ofer here is the code ////////////////////////////// #include <iostream> #include <iomanip> #include <gtkmm.h> struct plot_info { Glib::RefPtr<Gdk::Pixbuf> image_ptr_; Cairo::RefPtr<Cairo:: Cairo::RefPtr<Cairo::Context> image_context_ptr_; plot_info(int w, int h) { std::cerr << __FUNCTION__ << ": w=" << w << ", h=" << h << std::endl; image_ptr_ = Gdk::Pixbuf::create(Gdk:: //image_ptr_->fill((255 << 24) | (255 << 16) | (255 << 8) | 0); image_surface_ptr_ = Cairo::ImageSurface::create( image_context_ptr_ = Cairo::Context::create(image_ Gdk::Cairo::set_source_ image_context_ptr_->paint(); } }; class plot : public Gtk::DrawingArea { private: plot_info *pi_; private: void render_image(int w, int h) { delete pi_; pi_ = new plot_info(w, h); } public: plot() : pi_(0) {} bool on_configure_event( { Glib::RefPtr<Gdk::Window> window = get_window(); if (window) { std::cerr << __FUNCTION__ << ": w=" << get_width() << ", h=" << get_height() << std::endl; if (!pi_ || pi_->image_ptr_->get_width() != get_width() || pi_->image_ptr_->get_height() != get_height()) { render_image(get_width(), get_height()); } } return true; } bool on_expose_event( { Glib::RefPtr<Gdk::Window> window = get_window(); if (window) { std::cerr << __FUNCTION__ << ": x=" << event->area.x << ", y=" << event->area.y << ", w=" << event->area.width << ", h=" << event->area.height << std::endl; // Create the context for the widget Cairo::RefPtr<Cairo::Context> context = get_window()->create_cairo_ // Select the clipping rectangle context->rectangle(event-> context->clip(); // Store context context->save(); // Draw the source image on the widget context context->set_source(pi_-> std::cerr << __FUNCTION__ << ": w=" << pi_->image_ptr_->get_width() << ", h=" << pi_->image_ptr_->get_height() << std::endl; context->rectangle(0.0, 0.0, pi_->image_ptr_->get_width(), pi_->image_ptr_->get_height()) context->clip(); context->paint(); // Restore context context->restore(); } return true; } }; int main(int argc, char **argv) { Gtk::Main kit(argc, argv); Gtk::Window window; plot p; window.set_size_request(800, 600); window.add(p); window.show_all(); Gtk::Main::run(window); return 0; } ////////////////////////////// to compile: g++ _filename_ -o _exec_name_ `pkg-config gtkmm-2.4 --cflags --libs` |