gimp のプラグインの雛形

とりあえず,数値を+1するプラグインを書いてみた.つまり,script-fu で

(inc 10)

とすると,(11) を返すプラグインである.

#include <libgimp/gimp.h>

static void query (void);
static void run (const gchar      *name,
                 gint              nparams,
                 const GimpParam  *param,
                 gint             *nreturn_vals,
                 GimpParam       **return_vals);


GimpPlugInInfo PLUG_IN_INFO =
{
    NULL,  /* init_proc  */
    NULL,  /* quit_proc  */
    query, /* query_proc */
    run,   /* run_proc   */
};

MAIN ()


static void
query (void)
{
    static GimpParamDef args[] = {
        {GIMP_PDB_INT32, "integer", "input" },
    };

    static GimpParamDef results[] = {
        {GIMP_PDB_INT32,  "integer", "output"},
    };

    gimp_install_procedure (
        "inc",  /* 関数名 */
        "increment",  /* 説明文 */
        "inc", /* 追加情報 */
        "pyopyopyo",
        "Copyright (C) pyopyopyo",
        "2006",
        NULL,
        "",
        GIMP_PLUGIN,
        G_N_ELEMENTS (args), G_N_ELEMENTS (results),
        args, results);
}
static void
run (const gchar      *name,
     gint              nparams,
     const GimpParam  *param,
     gint             *nreturn_vals,
     GimpParam       **return_vals)
{
    static GimpParam  values[2];

    int  n = param[0].data.d_int32;
   
    *nreturn_vals = G_N_ELEMENTS (values);
    *return_vals  = values;

    values[0].type          = GIMP_PDB_STATUS;
    values[0].data.d_status = GIMP_PDB_SUCCESS;

    values[1].type          = GIMP_PDB_INT32;
    values[1].data.d_int32  =  n + 1;
}

プラグイン側にメモリ領域を確保して,そのアドレスをgimp本体側に返す仕様らしい.reentrantで無いところが気持悪いが,仕様だから仕方ない.