Re: GdkPixbuf questions



onsdagen den 21 mars 2007 08.50 skrev s88:
Hi,
I tried to use the put_pixel()-function but I encountered problems so I 
switched to the gdk-drawing functions instead. There is also an alternative 
to drawing areas... if you look at the bottom of the reference manual-page 
for GtkDrawingArea.

/Magnus 

> Hi all:
>        I have some questions when I using the drawable area with the
> gtk+2.0.
> First, I'm building a data analyzer under thr Linux, so there is a process
> to generate the data and  my analyzer display the data.
> My idea is to use a drawable area(I use the GtkDrawingArea) and get the pix
> buffer of it by the gdk_pixbuf_get_from_drawable(), then my background
> program can fill the pix buffer pix by pix.
>
> Question 1: anytime I fill to the pixbuf, it will rendering the drawing
> area immediately?
> Question 2: the following code segment is what I done until now...what
> should I do?
>
> Thanks.
> Dave.
>
> this function put_pixel is referenced from the GDK Reference Manual
>  34 void
>  35 put_pixel (GdkPixbuf *pixbuf, int x, int y, guchar red, guchar green,
> guchar blue, guchar alpha)
>  36 {
>  37   int width, height, rowstride, n_channels;
>  38   guchar *pixels, *p;
>  39
>  40   n_channels = gdk_pixbuf_get_n_channels (pixbuf);
>  41   g_assert (gdk_pixbuf_get_colorspace (pixbuf) == GDK_COLORSPACE_RGB);
>  42   g_assert (gdk_pixbuf_get_bits_per_sample (pixbuf) == 8);
>  43   g_assert (gdk_pixbuf_get_has_alpha (pixbuf));
>  44   g_assert (n_channels == 4);
>  45
>  46   width = gdk_pixbuf_get_width (pixbuf);
>  47   height = gdk_pixbuf_get_height (pixbuf);
>  48
>  49   g_assert (x >= 0 && x < width);
>  50   g_assert (y >= 0 && y < height);
>  51
>  52   rowstride = gdk_pixbuf_get_rowstride (pixbuf);
>  53   pixels = gdk_pixbuf_get_pixels (pixbuf);
>  54
>  55   p = pixels + y * rowstride + x * n_channels;
>  56   p[0] = red;
>  57   p[1] = green;
>  58   p[2] = blue;
>  59   p[3] = alpha;
>  60 }
>
>
> In the callbacks.c
> function on_drawingarea_virtual_LCD_configure_event() is the callback
> function of my drawing area.
>
> 151 gboolean
> 152 on_drawingarea_virtual_LCD_configure_event        (GtkWidget
> *widget,
> 153                                         GdkEventConfigure *event)
> 154 {
> 155   gint x,y;
> 156   GdkPixbuf* virtual_LCD_buf;
> 157   GdkRectangle rect;
> 158
> 159
> 160   if(virtual_LCD_pixmap)
> 161         g_object_unref(virtual_LCD_pixmap);
> 162
> 163   virtual_LCD_pixmap    = gdk_pixmap_new(widget->window,
> 164                           widget->allocation.width,
> 165                           widget->allocation.height,
> 166                           -1);
> 167
> 168   gdk_window_get_origin (widget->window, &x, &y);
> 169   rect.x = x;
> 170   rect.y = y;
> 171   gdk_drawable_get_size (GDK_DRAWABLE (widget->window), &rect.width,
> 172   &rect.height);
> 173
> 174   virtual_LCD_buf = gdk_pixbuf_get_from_drawable(NULL,
> 175                                                  virtual_LCD_pixmap,
> 176
> gdk_colormap_get_system(),
> 177                                                  rect.x-x,
> 178                                                  rect.y-y,
> 179                                                  0,
> 180                                                  0,
> 181                                                  rect.width,
> 182                                                  rect.height
> 183                                                  );
> 184 gint i=0;
> 185 // I want to test the put_pixel when the drawing are establish.
> 186 for(i=0;i<100;i++){
> 187         put_pixel (virtual_LCD_buf, i, i, 255-i,255-i,255-(2*i),0);
> 188
> 189
> 190 }



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