La veritat és que no hi ha molta informació i exemples per programar plugins amb GIMP. Però el cert és que la llibreria està ben documentada i s’entén força ràpid si un està familiaritzat amb la programació d’altres APIs i els conceptes de GIMP (capes, brushes,…).
GIMP Library Reference Manual:
A mode d’exemple anem a fer allò que considerem més bàsic: pintar pixels individuals sobre la pantalla. De l’enllaç anterior fem un repàs a les diferents possibilitats que ens ofereix la llibreria i ens fixem en la següent entrada:
gimppixelfetcher — Functions for operating on pixel regions:
i aquí tenim unes poques funcions, concretament la que necessitarem per pintar pixels és
void gimp_pixel_fetcher_put_pixel (GimpPixelFetcher *pf,
gint x,
gint y,
const guchar *pixel);
el primer argument és un punter a un objecte GimpPixelFetcher que hem inicialitzat prèviament.
\tGimpPixelFetcher *pf;
\tpf = gimp_pixel_fetcher_new (drawable,FALSE);
S’inicialitza a partir del drawable, que representa la capa sobre la que volem pintar. Per tant aquest punter ens dóna un espai de memòria que podem associar a un pixel d’una capa.
Els arguments x, y són evidenment les coordenades on volem escriure el pixel.
Finalment el punter *pixel conté la informació del pixel, concretament les 3 components del color.
Seguidament mostrem la funció principal pintar_pixel() del nostre plugin, que el que fa és pintar 5 pixels per pantalla, en les posicions (20,0),…, (24,0). El codi (fitxer gimp_pixel_fetcher_put_pixel.c) el pots descarregar a la wiki, tot i que està una mica brut. El primer pixel tindrà el mateix color que el foreground que tinc seleccionat en aquell moment; per al segon pixel estableixo un color amb la funció gimp_rgb_set(); el tercer pixel serà igual que el pixel de la posició (0,0), utilitzo la funció gimp_pixel_fetcher_get_pixel(); per als quart i cinquè pixel fico directament les coordenades RGB del color.
Per compilar:
$ gimptool-2.0 –install gimp_pixel_fetcher_put_pixel.c
i el codi:
static void pintar_pixel (GimpDrawable *drawable)
{
\tGimpPixelFetcher *pf;
\tgint x1, y1;
\tguchar *px; //pixel is an array of bpp bytes.
\tGimpRGB color;\tx1=0;
\ty1=0;\tpf = gimp_pixel_fetcher_new (drawable,FALSE);
\tpx = g_new (guchar, 1);\t//1. escric un pixel amb el color del foreground
\tgimp_context_get_foreground (&color);
\t//g_message (“%d,%d,%d”,(int)(&color)->r,(int)(&color)->g,(int)(&color)->b);
\tpx[0] = 255*(&color)->r; //vermell (0-255)
\tpx[1] = 255*(&color)->g; //verd (0-255)
\tpx[2] = 255*(&color)->b; //blau (0-255)
\tgimp_pixel_fetcher_put_pixel (pf, x1+20, y1, px);\t//2. escric un pixel i dic quin color vull amb la funció gimp_rgb_set
\tgimp_rgb_set (&color, 0.0, 1.0, 1.0);
\tpx[0] = 255*(&color)->r; //vermell (0-255)
\tpx[1] = 255*(&color)->g; //verd (0-255)
\tpx[2] = 255*(&color)->b; //blau (0-255)
\tgimp_pixel_fetcher_put_pixel (pf, x1+21, y1, px);\t//3. escric un pixel igual que el de la posició (0,0)
\tgimp_pixel_fetcher_get_pixel (pf,x1, y1, px);
\t//g_message (“%d,%d,%d”,(int)px[0],(int)px[1],(int)px[2]); //puc obtenir informació del pixel (components RGB)
\tgimp_pixel_fetcher_put_pixel (pf, x1+22, y1, px);\t//4. escric un pixel i dic quin color vull
\tpx[0] = 255; //vermell (0-255)
\tpx[1] = 0; //verd (0-255)
\tpx[2] = 0; //blau (0-255)
\tgimp_pixel_fetcher_put_pixel (pf, x1+23, y1, px);
\t// o bé
\t*px=0; //vermell (0-255)
\t*(px+1)=0; //verd (0-255)
\t*(px+2)=255; //blau (0-255)
\tgimp_pixel_fetcher_put_pixel (pf, x1+24, y1, px);\tg_free (px);
\tgimp_pixel_fetcher_destroy (pf);
\tgimp_drawable_flush (drawable);
\tgimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
\tgimp_drawable_update (drawable->drawable_id,20,0,5,1);}