[Gimp-developer] calling a procedure in a plugin
Giuseppe Pasquino
giuseppepasquino at hotmail.com
Thu Oct 18 05:14:43 PDT 2007
Ok, I'll modify the plugin in this way:
static void evidenzia (GimpDrawable *drawable,
GimpPreview *preview)
{
gint width, height; //dell'immagine su cui va applicato il plugin
gint altezza, larghezza; //numero di pixel formanti la palette
gint x1, x2, y1, y2;
GimpPixelRgn rgn_in, rgn_out;
guchar pixel[4];
guchar colore[3];
gint i, channels;
gint distanza;
GimpParam *return_vals;
gint nreturn_vals;
gboolean success;
if (preview) return;
else gimp_progress_init ("Evidenzia Temperatura...");
//Recupero del drawable
gimp_drawable_mask_bounds (drawable->drawable_id,
&x1, &y1,
&x2, &y2);
width = x2 - x1;
height = y2 - y1;
/* Inizializza due PixelRgns, uno per leggere i dati originali,
* e l'altro per scrivere i dati modificati. Il secondo sarà
* poi applicato all'immaginne alla fine attraverso la chiamata
* gimp_drawable_merge_shadow() */
gimp_pixel_rgn_init (&rgn_in,
drawable,
x1, y1,
width, height,
FALSE, FALSE);
gimp_pixel_rgn_init (&rgn_out,
drawable,
x1, y1,
width, height,
preview == NULL, TRUE);
//Recupero del numero di canali
channels = gimp_drawable_bpp (drawable->drawable_id);
//Calcolo delle dimensioni della palette
altezza = termogramma.palettey2 - termogramma.palettey1;
larghezza = termogramma.palettex2 - termogramma.palettex1;
/*
* Se l'altezza è più grande della larghezza allora vuol dire che la palette è disposta in verticale.
* Se succede il contrario allora la palette è disposta in orizzontale
*/
if(altezza> larghezza) {
g_print("1\n");
//Ottengo il colore alla temperatura specificata. Lo faccio facendo una media tra tutti i colori che si trovano sulla stessa riga
distanza = (termogramma.tempselezionata - termogramma.tempmin) * altezza / (termogramma.tempmax - termogramma.tempmin);
//Ottengo il pixel corrispondente (coordinate x1 + (x2 - x1)/2, (y2 - distanza))
gimp_pixel_rgn_get_pixel(&rgn_in, pixel, termogramma.palettex1 + (termogramma.palettex2 - termogramma.palettex1)/2, termogramma.palettey2 - distanza);
g_print("%i, %i\n", termogramma.palettex1 + (termogramma.palettex2 - termogramma.palettex1)/2, termogramma.palettey2 - distanza);
}
else {//larghezza> altezza
g_print("2\n");
distanza = (termogramma.tempselezionata - termogramma.tempmin) * larghezza / (termogramma.tempmax - termogramma.tempmin);
//Ottengo il pixel corrispondete (coordinate (x1 + distanza), y1 + (y2 - y1)/2)
gimp_pixel_rgn_get_pixel(&rgn_in, pixel, termogramma.palettex1 + distanza, termogramma.palettey1 + (termogramma.palettey2 - termogramma.palettey1)/2);
g_print("%i, %i\n", termogramma.palettex1 + distanza, termogramma.palettey1 + (termogramma.palettey2 - termogramma.palettey1)/2);
}
for(i = 0; i < 3; i++) {
colore[i] = pixel[i];
g_print("%i ",colore[i]);
}
return_vals = gimp_run_procedure ("gimp-by-color-select",
&nreturn_vals,
GIMP_PDB_DRAWABLE, drawable->drawable_id,
GIMP_PDB_COLOR, pixel,
GIMP_PDB_INT32, termogramma.scarto,
GIMP_PDB_INT32, 2,
GIMP_PDB_INT32, FALSE,
GIMP_PDB_INT32, FALSE,
GIMP_PDB_FLOAT, 0.0,
GIMP_PDB_INT32, FALSE,
GIMP_PDB_END);
success = return_vals[0].data.d_status == GIMP_PDB_SUCCESS;
//si distruggono i parametri per liberare la memoria
gimp_destroy_params (return_vals, nreturn_vals);
if(success) g_print("Fatto\n");
}
the variable success is TRUE after calling the procedure but it select every black pixel instead the values contained in the "colori" vector. It' is a bug or I'm make some mistakes?
_________________________________________________________________
Crea i tuoi biglietti da visita con Windows Live Messenger!
http://www.messenger.it/biglietti_da_visita.html
More information about the Gimp-developer
mailing list