Re: [gtkmm] Please help with displaying images



On Wednesday 02 July 2003 21:02, Ben Stephens wrote:
> Hi,
>
> I am having a lot of trouble trying to figure out quite how to create a
> widget for displaying an image. Basically I have got a character array,
> representing an 8 bit image and I want to draw it straight to the screen
> with minimal copying. I think I need to get a Drawable object for my
> widget, but I can't figure out how to do that, and so I get compiler
> errors. I would really appreciate it if someone could:
>
> a: Tell me how to fix my code (I hope it's fairly self-explanatory where
> the error is, right at the bottom of the source file) b: Direct me to an
> example which specifically uses the draw_gray_image or draw_indexed_image
> functions to achieve the same effect.
>
> Also, I discovered the pixmap class. Can I use that achieve the same effect
> using this class? (I want it to take the buffer as it's own, rather than
> make a copy, and I also want to draw on the image). I would still be
> curious to know how to fix the code though.
>
> Thanks for any help.
>
> Ben Stephens
>
>
> ---------------------------------------------------------------------------
>--------------------------------------
>
> Header file:
>
> class DisplayWidget : public Gtk::DrawingArea
> {
>  public:
>   SlamGUIDisplay();
>   ~SlamGUIDisplay();
>
>  protected:
>   // The redraw event
>   virtual bool on_expose_event(GdkEventExpose *event);
>
>   virtual void on_realize();
>
>   // Area to store image data
>   char m_Image[500000];
>
>   // Graphics context
>   Glib::RefPtr<Gdk::GC> gc;
> };
>
> ------------------------------------------
> Source file:
>
>
> #include "slamguidisplay.h"
>
> SlamGUIDisplay::SlamGUIDisplay()
> {
>  int n;
>
>  // Create an image (temporary code)
>  for (n = 0; n < 320 * 240; n++)
>   m_Image[n] = n % 320;
> }
>
> SlamGUIDisplay::~SlamGUIDisplay()
> {
>
> }
>
> // Called when the window is created. Only now can you get a valid GC for
> the window // This is called only once on startup
> void SlamGUIDisplay::on_realize()
> {
>  // Must call base version
>  Gtk::DrawingArea::on_realize();
>
>  // Get a GC (Graphics Context)
>  Glib::RefPtr<Gdk::Window> window = get_window();
>  gc = Gdk::GC::create(window);
> }
>
> // Expose or paint event - called if part or all of the window needs
> updating bool SlamGUIDisplay::on_expose_event(GdkEventExpose *event)
> {
>  // ** THIS WILL CAUSE AN ERROR (obviously) BECAUSE I CAN'T GET A DRAWABLE
> OBJECT ** Gdk::Drawable::draw_gray_image(gc, 0, 0, 320, 240,
> GDK_RGB_DITHER_NORMAL, (guchar*)m_Image, 320); }

What's the problem? I think You can get needed Gdk::Drawable using 
Gtk::Widget::get_:window().

updating bool SlamGUIDisplay::on_expose_event(GdkEventExpose *event)
{
   get_window()->draw_gray_image(gc, 0, 0, 320, 240,
         GDK_RGB_DITHER_NORMAL, (guchar*)m_Image, 320); 
}

For my own widgets I often use my class derived from Gtk::DrawingArea which
adds Gdk::Pixmap where I'm drawing what I need. Needed part of pixmap
is blitted to Gdk::Window from on_expose_event(). Main reason why I did
so, was that full redrawing every time would require often too much time.
pixmap is created in on_realize() function and(or) recreated later for example
if size changes or I specify that full redraw is needed.

Andris




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