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