Saturday, March 06, 2010

Setting single pixels values in a gnocl::pixBuf

Ok, its pretty clear that I'm a Penguin. I love Linux, Gnome and the principles of OpenSource. But, and its only a small, yet annoying’ but’ typical of any loving relationship, that there are little things not done that we take for granted will be done. Sounds familiar? The Gdk libraries contain some really useful tools, so why some of the simpler things are omited? For example, there is a gdk_pixBuf_fill command, for clearing the screen to a single colour by painting each pixel individually, yet there is no library command for painting a single pixel itself! Not an insurmountable problem, but a capability that one would expect to be there.
The assumption is, perhaps, that any drawing operations will be done to GdkDrawables, i.e. anything in a window rendered to the screen. GtkPixBufs are ‘off-screen’, the buffers that can be draw and worked with independently or prior to any rendering operation. My guess too is that if a programmer needs to draw to a buffer, its better done by rendering to it using Cairo.
To resolve this omission, I’ve examined the Gdk source code for something useful to hack. Of the course the right func is the above said gdk_pixbuf_fill. Now I have a usable pixel painting function that runs nicely, having put together what might be described as the missing gdk_pixbuf_set_pixel. Now the complement, a gdk_pixbuf_get_pixel function, is the thing to put together. Where’s all this leading, one might ask... to the addition of a set of pixbuf image manipulation commands! More on this later.

Here's the screenshot,











And the script that built it.

set pb1 [gnocl::pixBuf load "vyrnwy_small.png"] 
set img1 [gnocl::image -image "%?$pb1"] 

set box [gnocl::eventBox -child $img1] 

$box configure -onMotion { 
    $pb1 setPixel [list %x %y] #FF0000 
    $img1 configure -image "%?$pb1" 
    gnocl::update}

gnocl::window -child $box

No comments: