前一阵翻译gimp官网的编写插件教程,本打算继续翻译第二部分,但是感觉第一个例子还不是很懂,翻译第二部分有点理解不能,所以就读了一
下源码,记录如下
#include <libgimp/gimp.h> /* 声明query函数,它提供gimp相关信息,使其可以根据参数配置插件 */ static void query (void); /* 声明run函数,调用时会运行插件安装在程序数据库中的程序 */ static void run (const gchar *name, gint nparams, const GimpParam *param, gint *nreturn_vals, GimpParam **return_vals); // GimpPlugInInfo是一个函数结构体,调用init,quit,query,run函数 // 本例中init,quit函数不使用,所以置为NULL GimpPlugInInfo PLUG_IN_INFO = { NULL, NULL, query, run }; //宏 MAIN() /* query函数,用于提供插件信息 */ static void query (void) { //GimpParamDef结构体,保存程序的定义 //GimpParamDef的三个参数,GimpPDBArgType类型, gchar *名称, gchar *描述 static GimpParamDef args[] = { { GIMP_PDB_INT32, "run-mode", "Run mode" }, { GIMP_PDB_IMAGE, "image", "Input image" }, { GIMP_PDB_DRAWABLE, "drawable", "Input drawable" } }; /* gimp_install_procedure函数使用PDB来安装程序 */ gimp_install_procedure ( "plug-in-hello", //名称 "Hello, world!", //简介 "Displays \"Hello, world!\" in a dialog", //帮助(一般作为简介的补充) "David Neary", //作者 "Copyright David Neary",//版权 "2004", //日期 "_Hello world...", //菜单标签名称 “_”在菜单中显示为空格 "RGB*, GRAY*", //图像类型,支持RGB,RGBA, 灰度 //如果插件不需要图像,则置为空串 GIMP_PLUGIN, //程序的类型为gimp插件,或“GIMP_EXTENSION(gimp扩展)” G_N_ELEMENTS (args), //传入args数组中元素的个数 0, //返回值 args, //传入args数组 NULL //返回值 ); //插件安装在“滤镜/Misc”文件夹下,标签名称为上面定义的“Hello world...” gimp_plugin_menu_register ("plug-in-hello", "<Image>/Filters/Misc"); } /* run函数,用于实现插件功能 */ static void run (const gchar *name, gint nparams, const GimpParam *param, gint *nreturn_vals, GimpParam **return_vals) { /* 一个插件可以生成多个插件程序,所以本例题的插件程序使用values[0] */ static GimpParam values[1]; /* 定义程序数据库的状态 */ GimpPDBStatusType status = GIMP_PDB_SUCCESS; /* 定义程序的运行模式,如交互式,非交互式,最后使用值 */ GimpRunMode run_mode; /* 强制设置返回值 */ *nreturn_vals = 1; *return_vals = values; /* 设置程序的类型和状态 */ values[0].type = GIMP_PDB_STATUS; values[0].data.d_status = status; /* 获取运行模式,如果运行模式是非交互式,那么不会显示对话框 */ run_mode = param[0].data.d_int32; if (run_mode != GIMP_RUN_NONINTERACTIVE) g_message("Hello, world!\n"); }
1,最后生成的插件名称与源程序的名称相同
2,读完这个例子对插件有了一定的了解,但有些地方还很模糊,应该是正常现象
3,想深入的理解插件的实现与运行原理,那么就要多读源码
4,想读懂源码,那么就要翻看帮助文档,Devhelp是个好东西
5,通过一个hello world还不能编写插件甚至依旧看不懂别人的插件实现,欲编写实用的插件,需打好基础,循序渐进