Re: calling a procedure in a plugin

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

 



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
_______________________________________________
Gimp-developer mailing list
Gimp-developer@xxxxxxxxxxxxxxxxxxxxxx
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer


[Index of Archives]     [Video For Linux]     [Photo]     [Yosemite News]     [gtk]     [GIMP for Windows]     [KDE]     [GEGL]     [Gimp's Home]     [Gimp on GUI]     [Gimp on Windows]     [Steve's Art]

  Powered by Linux