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 } _______________________________________________ gtk-list mailing list gtk-list@xxxxxxxxx http://mail.gnome.org/mailman/listinfo/gtk-list