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::ImageSurface> image_surface_ptr_;
    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::COLORSPACE_RGB, false, 8, w, h);
        //image_ptr_->fill((255 << 24) | (255 << 16) | (255 << 8) | 0);

        image_surface_ptr_ = Cairo::ImageSurface::create(Cairo::FORMAT_RGB24, 
image_ptr_->get_width(), image_ptr_->get_height());
        image_context_ptr_ = Cairo::Context::create(image_surface_ptr_);
        Gdk::Cairo::set_source_pixbuf(image_context_ptr_, image_ptr_, 0.0, 0.0);

        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(GdkEventConfigure */*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(GdkEventExpose* 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_context();
    
            // Select the clipping rectangle
            context->rectangle(event->area.x, event->area.y, event->area.width, 
event->area.height);

    
            context->clip();
    
            // Store context
            context->save();
    
            // Draw the source image on the widget context
            context->set_source(pi_->image_surface_ptr_, 0.0, 0.0);

            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`


      
_______________________________________________
gtkmm-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gtkmm-list

Reply via email to