Gimp/tools/pdbgen
Michael Natterer 99e78c7074 General cleanup of the selection tools and their PDB wrappers:
2001-10-22  Michael Natterer  <mitch@gimp.org>

	General cleanup of the selection tools and their PDB wrappers:

	* app/core/Makefile.am
	* app/core/gimpimage-contiguous-region.[ch]
	* app/core/gimpimage-mask-select.[ch]: new files providing a clean,
	uniform API for the selection functionalities. Changed order of
	parameters to be consistent, removed code duplication.

	The region returned by the "by_color" function is not really
	contiguous but the API is so similar to "by_seed" and it's used
	in the same context so it's fair enough to put them together.

	Also, I'm not sure if the two is_pixel_sufficiently_different()
	I've optimized away were meant to do *exactly* the same. Added
	a comment there to remember the former difference.

	* app/core/gimpchannel.[ch] (gimp_channel_feather): removed the
	"output" channel parameter and made it optionally push an undo
	(like the other channel operations do).

	* app/core/gimpimage-mask.c: call gimp_channel_feather() with
	"push_undo == TRUE", removed some useless comments.

	* app/tools/gimpbycolorselecttool.[ch]
	* app/tools/gimpellipseselecttool.[ch]
	* app/tools/gimpfreeselecttool.[ch]
	* app/tools/gimpfuzzyselecttool.[ch]
	* app/tools/gimprectselecttool.[ch]: removed all the actual
	selection functionality and call the new gimp_image_mask_select_*()
	and gimp_image_contiguous_region_*() functions instead.

	* app/tools/gimpbezierselecttool.c
	* app/tools/gimpiscissorstool.c: use new function
	gimp_image_mask_select_channel() instead of doing the same manually.

	* app/tools/gimpbucketfilltool.c: find_contiguous_region() ->
	gimp_image_contiguous_region_by_seed().

	* tools/pdbgen/Makefile.am
	* tools/pdbgen/groups.pl
	* tools/pdbgen/pdb/selection_tools.pdb: added new group "Selection
	Tools" which depends only on "core/" stuff (not on "tools/" any
	more, brrrr).

	* tools/pdbgen/pdb/text_tool.pdb: don't include "appenv.h"

	* tools/pdbgen/pdb/tools.pdb: removed the selection tools.

	* app/pdb/Makefile.am
	* app/pdb/selection_tools_cmds.c: new file.

	* app/pdb/internal_procs.c
	* app/pdb/text_tool_cmds.c
	* app/pdb/tools_cmds.c: regenerated.

	* libgimp/Makefile.am
	* libgimp/gimp_pdb.h
	* libgimp/gimpselectiontools_pdb.[ch]: new files.

	* libgimp/gimptools_pdb.[ch]: regenerated

	Misc cleanups:

	* app/app_procs.c: call splash_create() with "no_splash_image"
	as parameter.

	* app/display/gimpdisplay-render.c
	* app/display/gximage.c: don't include "appenv.h".

	* app/gui/gui.c: call session_restore() only if "restore_session"
	is TRUE.

	* app/gui/session.c: don't "if(restore_session)" here and don't
	include "appenv.h"

	* app/gui/splash.[ch]: added "gboolean show_image" parameter to
	splash_create(), don't include "appenv.h"

	* app/tools/gimppainttool.[ch]: added a "GimpGradient" parameter
	to gimp_paint_tool_get_color_from_gradient().

	* app/tools/gimppaintbrushtool.c: pass the gradient.

	* app/tools/gimpselectiontool.c
	* app/tools/gimptransformtool.c
	* app/tools/tool_manager.c: s/GDisplay/GimpDisplay/.

	* app/widgets/gimpcontainergridview.[ch]: removed the "white_style"
	class variable and don't fiddle around with colors and styles...

	* themes/Default/gtkrc: ...do the same here with a simple rc style.
2001-10-22 12:13:44 +00:00
..
app remove unused var 1999-06-03 00:00:48 +00:00
libgimp PDB autogen stuff. Unfinished and undocumented 1998-10-24 05:19:30 +00:00
pdb General cleanup of the selection tools and their PDB wrappers: 2001-10-22 12:13:44 +00:00
.cvsignore $srcdir != $builddir fix for GIMP_CONTRIBUTORS 2000-08-23 01:44:59 +00:00
app.pl link the app in a different order as some init functions are called from 2001-10-19 16:41:09 +00:00
enumcode-py.pl Generates gimpenums.py for pygimp 2000-08-10 20:26:36 +00:00
enumcode.pl Makefile.am configure.in added new directory libgimpbase/ 2001-05-21 13:58:46 +00:00
enumgen.pl handle subdirs 2001-01-21 23:24:26 +00:00
enums.pl renamed it to GimpDisplay and made it a GimpObject subclass. 2001-09-25 17:44:03 +00:00
groups.pl General cleanup of the selection tools and their PDB wrappers: 2001-10-22 12:13:44 +00:00
lib.pl guard inclusion of <process.h> by G_OS_WIN32 add include <string.h> if the 2001-03-18 12:51:37 +00:00
Makefile.am General cleanup of the selection tools and their PDB wrappers: 2001-10-22 12:13:44 +00:00
pdb.pl app/Makefile.am app/disp_callbacks.[ch] app/gdisplay.[ch] 2001-09-25 23:23:09 +00:00
pdbgen.pl added 2000 to the copyrights 2000-02-17 11:44:27 +00:00
README add the new args to gimp-paintbrush PDB calls. 1999-04-20 23:03:31 +00:00
stddefs.pdb added 2000 to the copyrights 2000-02-17 11:44:27 +00:00
util.pl added 2000 to the copyrights 2000-02-17 11:44:27 +00:00

Some mostly unfinished docs are here.

-Yosh

PDBGEN
------------------

What is this?
It's a tool to automate much of the drudge work of making PDB interfaces
to GIMP internals. Right now, it generates PDB description records,
argument marshallers (with sanity checking) for the app side, as well
as libgimp wrappers for C plugins. It's written so that extending it
to provide support for CORBA and other languages suited to static
autogeneration.

How to invoke pdbgen from the command line:
Change into the ./tools/pdbgen directory
  $ ./pdbgen.pl DIRNAME
where DIRNAME is either "lib" or "app", depending on which set of
files you want to generate.  The files are written to ./app or ./lib
in the ./tools/pdbgen directory.  Up to you to diff the file you
changed and when you're happy copy it into the actual ./app/ or ./lib/
directory where it gets built.

Anatomy of a PDB descriptor:
PDB descriptors are Perl code. You define a subroutine, which corresponds
to the PDB function you want to create. You then fill certain special
variables to fully describe all the information pdbgen needs to generate
code. Since it's perl, you can do practically whatever perl lets you
do to help you do this. However, at the simplest level, you don't need
to know perl at all to make PDB descriptors.

Annotated description:
For example, we will look at gimp_display_new, specified in gdisplay.pdb.

sub display_new { 

We start with the name of our PDB function (not including the "gimp_" prefix).

    $blurb = 'Create a new display for the specified image.';

This directly corresponds to the "blurb" field in the ProcRecord.

    $help = <<'HELP';
Creates a new display for the specified image. If the image already has a
display, another is added. Multiple displays are handled transparently by the
GIMP. The newly created display is returned and can be subsequently destroyed
with a call to 'gimp-display-delete'. This procedure only makes sense for use
with the GIMP UI.
HELP

This is the help field. Notice because it is a long string, we used HERE
document syntax to split it over multiple lines. Any extra whitespace
in $blurb or $help, including newlines, is automatically stripped, so you
don't have to worry about that.

    &std_pdb_misc;

This is the "author", "copyright", and "date" fields. Since S&P are quite
common, they get a special shortcut which fills these in for you. Stuff
like this is defined in stddefs.pdb.

    @inargs = ( &std_image_arg );

You specify arguments in a list. Again, your basic image is very common,
so it gets a shortcut.

    @outargs = (
        { name => 'display', type => 'display',
          desc => 'The new display', alias => 'gdisp', init => 1 }
    );

This is a real argument. It has a name, type, description at a minumum.
"alias" lets you use the alias name in your invoker code, but the real
name is still shown in the ProcRecord. This is useful not only as a
shorthand, but for grabbing variables defined somewhere else (or constants),
in conjunction with the "no_declare" flag. "init" simply says initialize
this variable to a dummy value (in this case to placate gcc warnings)

    %invoke = (
        headers => [ qw("gdisplay.h") ],

These are the headers needed for the functions you call.

        vars => [ 'guint scale = 0x101' ],

Extra variables can be put here for your invoker.

        code => <<'CODE'
{
  if (gimage->layers == NULL)
    success = FALSE;
  else
    success = ((gdisp = gdisplay_new (gimage, scale)) != NULL);
}
CODE

The actual invoker code. Since it's a multiline block, we put curly braces
in the beginning.