1
1
mirror of https://gitlab.gnome.org/GNOME/gimp.git synced 2025-10-06 13:42:40 +02:00

Compare commits

...

774 Commits

Author SHA1 Message Date
Manish Singh
4791accdfa 1.2.4 stuff 2003-05-20 01:28:26 +00:00
Manish Singh
158081ca48 Fix dump_printarray (I think) 2003-05-20 00:47:42 +00:00
Manish Singh
408d1b5194 Add SIOD banner to console startup.
2003-05-19  Manish Singh  <yosh@gimp.org>

        * plug-ins/script-fu/script-fu-console.c: Add SIOD banner to console
        startup.
2003-05-19 21:13:56 +00:00
Manish Singh
563624efda remove glibconfig.h inline check, it hasn't worked for a long time.
2003-05-18  Manish Singh  <yosh@gimp.org>

        * configure.in: remove glibconfig.h inline check, it hasn't
        worked for a long time.

        * tools/authorsgen/contributors: added George J. Carrette, author of
        SIOD.

        * po-libgimp/Makefile.in.in
        * po-plug-ins/Makefile.in.in
        * po-script-fu/Makefile.in.in
        * plug-ins/perl/po/Makefile.in.in: fix $$(datadir) ytpo.
2003-05-19 02:42:19 +00:00
Dave Neary
6ae8a0834d plug-ins/script-fu/scripts/alien-glow-button.scm
2003-05-17  Dave Neary  <bolsh@gimp.org>

        * plug-ins/script-fu/scripts/alien-glow-button.scm
        * plug-ins/script-fu/scripts/beveled-button.scm
        * plug-ins/script-fu/scripts/beveled-pattern-button.scm:
        Applied patch from Tor Lilliqvist <tml@iki.fi> which
        fixes the same problem as that reported in bug #77572.
2003-05-17 09:01:37 +00:00
Dave Neary
d3c98c1ade Applied patch from Tor Lilliqvist <tml@iki.fi> to fix bug #77572.
2003-05-16  Dave Neary  <bolsh@gimp.org>

        * plug-ins/script-fu/scripts/pupi-button.scm: Applied
        patch from Tor Lilliqvist <tml@iki.fi> to fix bug #77572.
2003-05-16 21:06:25 +00:00
Dave Neary
e23f18e9db plug-ins/common/edge.c plug-ins/common/tiff.c plug-ins/common/mail.c
2003-05-16  Dave Neary  <bolsh@gimp.org>

        * plug-ins/common/edge.c
        * plug-ins/common/tiff.c
        * plug-ins/common/mail.c
        * plug-ins/webbrowser/webbrowser.c: Removed GPL
        conflicting parts of permission notices on these files,
        in line with what has been said in bug #83362.
2003-05-16 20:46:34 +00:00
Dave Neary
25600b50ca Changed licence for Graeme Gill's code in this filter. Fixes part of bug
2003-05-16  Dave Neary  <bolsh@gimp.org>

        * plug-ins/common/nlfilt.c: Changed licence for Graeme
        Gill's code in this filter. Fixes part of bug #83362.
2003-05-16 20:25:15 +00:00
Pedro Gimeno
b480c62493 Use integer instead of FP to check for last iteration, possibly fixing bug
2003-05-14  Pedro Gimeno  <pggimeno@wanadoo.es>

	* plug-ins/common/blur.c (blur): Use integer instead of FP to
	check for last iteration, possibly fixing bug #84731.
2003-05-14 21:47:42 +00:00
Dave Neary
85a4677dec Attach default comment to image made by screenshot. Fixes bug #51164
2003-05-14  Dave Neary  <bolsh@gimp.org>

        * plug-ins/common/screenshot.c: Attach default comment to
        image made by screenshot. Fixes bug #51164
2003-05-14 18:58:20 +00:00
Pedro Gimeno
6e226f306c Merged a partial fix for bug #86586 (memory leaks in script-fu) from HEAD.
2003-05-13  Pedro Gimeno  <pggimeno@wanadoo.es>

	* plug-ins/script-fu/script-fu.c: Merged a partial fix for
	bug #86586 (memory leaks in script-fu) from HEAD.

	* tools/pdbgen/pdb/color.pdb (histogram): Call gimp_histogram_free
	when no longer needed.

	* app/color_cmds.c: Regenerated.
2003-05-13 14:45:46 +00:00
Adam D. Moss
453f8aee8d plug-ins/common/gif.c bolsh got permission from David Koblas to relicense
* plug-ins/common/gif.c
	* plug-ins/common/gifload.c: bolsh got permission from David Koblas
        to relicense the prehistoric code that begat the original GIMP GIF
	plugin, so Koblas' mildly-GPL-unfriendly license boilerplate can
	finally rest in peace.
2003-05-13 14:32:16 +00:00
Sven Neumann
f89351f1f3 merged fix for wrong timeout from HEAD branch.
2003-05-13  Sven Neumann  <sven@gimp.org>

	* app/plug_in.c (plug_in_close): merged fix for wrong timeout from
	HEAD branch.
2003-05-13 11:47:26 +00:00
Dave Neary
55fd927b3c plug-ins/common/csource.c plug-ins/common/jpeg.c If no comment is set on a
2003-05-12  Dave Neary  <bolsh@gimp.org>

        * plug-ins/common/csource.c
        * plug-ins/common/jpeg.c
        * plug-ins/common/tiff.c: If no comment is set on a
        GimpImage when it arrives to be saved, don't attach one.
        Fixes bug #98490 and bug #98485

        * plug-ins/common/tiff.c: Alert user to loss of precision
        when opening a 16 bit tiff. Backport of Maurits Rijk's
        fix for bug #95737
2003-05-13 07:09:08 +00:00
Sven Neumann
a61206bc0a special case floating selections being dragged to the New button. Handle
2003-05-12  Sven Neumann  <sven@gimp.org>

	* app/layers_dialog.c (layers_dialog_drag_new_layer_callback):
	special case floating selections being dragged to the New
	button. Handle them as if the user had clicked the New button.
	Fixes bug #112832.
2003-05-12 13:35:29 +00:00
Manish Singh
715c7c71d4 reset conn_id to 0 in levels_free, possibly fixes #108004.
2003-05-11  Manish Singh  <yosh@gimp.org>

        * app/levels.c: reset conn_id to 0 in levels_free, possibly fixes
        #108004.

        * app/hue_saturation.c: similar fix here.
2003-05-12 03:53:02 +00:00
Pedro Gimeno
b13e54de1b Merged fix for bug #100122 from HEAD branch.
2003-05-09  Pedro Gimeno  <pggimeno@wanadoo.es>

	* plug-ins/common/jigsaw.c: Merged fix for bug #100122 from HEAD
	branch.
2003-05-09 19:32:41 +00:00
Pedro Gimeno
db3d62cbe1 merged Michael Natterer's fix for bug #26072 from HEAD branch.
2003-05-07  Pedro Gimeno  <pggimeno@wanadoo.es>

	* app/paint_funcs.c (initial_sub_region, combine_sub_region):
	merged Michael Natterer's fix for bug #26072 from HEAD branch.
2003-05-07 15:59:05 +00:00
Sven Neumann
2008ac8df1 fixed the documentation of the "interpolation-type" gimprc entry (bug
2003-05-07  Sven Neumann  <sven@gimp.org>

	* gimprc-1.2.5.in: fixed the documentation of the
	"interpolation-type" gimprc entry (bug #112426).
2003-05-07 15:46:16 +00:00
Pedro Gimeno
c57254a096 Use floor instead of rounding. Callers changed to remove rounding, as it
2003-05-05  Pedro Gimeno  <pggimeno@wanadoo.es>

	* app/edit_selection.c (edit_selection_snap): Use floor instead
	of rounding. Callers changed to remove rounding, as it deals with
	gdoubles directly. Thanks to Mitch for the help refining this
	one. Fixes bug #17906.
	(edit_selection_button_release): Ported back fix for bug #110173
	from HEAD branch (don't anchor layer when moving the floating
	selection to the same place).

	* app/edit_selection.c (edit_selection_draw)
	* app/ellipse_select.c (ellipse_select_draw)
	* app/rect_select.c (rect_select_draw): Applied a (modified) patch
	by Sven Neumann that fixes bug #17904.

	* app/transform_core.c (transform_core_do): Deal with the pixel
	centers properly. Fixes bug #10466 for even-sized images.
2003-05-05 17:58:34 +00:00
Michael Natterer
6964d4270a applied a (modified) patch from Raphael Quinet which updates the splash
2003-05-03  Michael Natterer  <mitch@gimp.org>

	* app/plug_in.c (plug_in_init): applied a (modified) patch
	from Raphael Quinet which updates the splash before querying
	the plug-in. Fixes bug #112156.
2003-05-03 20:10:12 +00:00
Pedro Gimeno
f169c2a729 Don't try to compress the left and right ends. Fixes bug #89274.
2003-04-30  Pedro Gimeno  <pggimeno@wanadoo.es>

	* app/gradient.c (control_compress_range): Don't try to compress
	the left and right ends. Fixes bug #89274.
2003-04-30 14:51:15 +00:00
Michael Natterer
d3216d88eb ported back some code from HEAD that fixes the handling of the rotation
2003-04-29  Michael Natterer  <mitch@gimp.org>

	* app/rotate_tool.c (rotate_tool_motion,recalc): ported back some
	code from HEAD that fixes the handling of the rotation center
	across tool pause/resume. Fixes bug #109943.
2003-04-29 20:04:01 +00:00
Pedro Gimeno
fde95ce2b6 merged fix for bug #109933 from HEAD branch.
2003-04-29  Pedro Gimeno  <pggimeno@wanadoo.es>

	* app/image_render.c: merged fix for bug #109933 from HEAD branch.
2003-04-28 23:47:38 +00:00
Sven Neumann
24a5be4e27 applied a patch from Pedro Gimeno that fixes bug #108958.
2003-04-17  Sven Neumann  <sven@gimp.org>

	* app/gimpimage.c (gimp_image_remove_layer_mask): applied a patch
	from Pedro Gimeno that fixes bug #108958.
2003-04-17 12:40:39 +00:00
Sven Neumann
01b606cbaa merged fix for bug #52543 from HEAD branch.
2003-04-17  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/bumpmap.c (bumpmap): merged fix for bug #52543
	from HEAD branch.
2003-04-17 12:16:53 +00:00
Sven Neumann
0d5503b03b merged fix for bug #51883 from HEAD branch.
2003-04-17  Sven Neumann  <sven@gimp.org>

	* app/fuzzy_select.c (find_contiguous_region_helper): merged fix
	for bug #51883 from HEAD branch.
2003-04-17 12:11:06 +00:00
Stanislav Visnovsky
72fd3c97e5 Updated Slovak translation by Zdenko Podobny <zdpo@mailbox.sk>.
2003-04-15  Stanislav Visnovsky  <visnovsky@nenya.ms.mff.cuni.cz>

        * sk.po: Updated Slovak translation by Zdenko Podobny <zdpo@mailbox.sk>.
2003-04-15 17:04:04 +00:00
Sven Neumann
7c0e2b49c8 merged fix for bug #110446 from HEAD branch.
2003-04-13  Sven Neumann  <sven@gimp.org>

	* plug-ins/gfig/gfig.c (gfig_paint_callback): merged fix for bug
	#110446 from HEAD branch.
2003-04-13 14:02:58 +00:00
Michael Natterer
a6c63af82e partly merged fix for bug #22375 from HEAD (Just pause the selection,
2003-04-13  Michael Natterer  <mitch@gimp.org>

	* app/move.c (move_tool_button_press): partly merged fix for
	bug #22375 from HEAD (Just pause the selection, don't g_memdup()
	the boundary segs in edit_selection.c, since the latter is just
	paranoia).
2003-04-13 13:11:17 +00:00
Dave Neary
2d2630da9a Merged fix for bug #109043 from HEAD - indexed pngs should save
2003-04-12  Dave Neary  <bolsh@gimp.org>

        * plug-ins/common/png.c (save_image,
        find_unused_ia_colour): Merged fix for bug #109043 from
        HEAD - indexed pngs should save transparency reasonably
        now.
2003-04-12 15:19:06 +00:00
Raphael Quinet
9eb195ea3e merged fix for bug #110443 from HEAD branch.
2003-04-11  Raphael Quinet  <quinet@gamers.org>

	* plug-ins/flame/flame.c (dialog): merged fix for bug #110443
	from HEAD branch.
2003-04-11 16:27:11 +00:00
Sven Neumann
58038d987e merged fix for bug #110115 from HEAD branch.
2003-04-09  Sven Neumann  <sven@gimp.org>

	* app/edit_selection.c (edit_selection_motion): merged fix for
	bug #110115 from HEAD branch.
2003-04-09 11:02:20 +00:00
Sven Neumann
bbaf211ebf respect $(DESTDIR) in install target.
2003-04-09  Sven Neumann  <sven@gimp.org>

	* Makefile.in.in: respect $(DESTDIR) in install target.
2003-04-09 10:47:01 +00:00
Michael Natterer
abe9ec7fc7 merged fix for bug #103470 from HEAD.
2003-04-06  Michael Natterer  <mitch@gimp.org>

	* plug-ins/FractalExplorer/Dialogs.c (make_color_map): merged
	fix for bug #103470 from HEAD.
2003-04-06 16:05:47 +00:00
Sven Neumann
6454782965 don't use MAXPATHLEN, spotted by Robert Millan <zeratul2@wanadoo.es>.
2003-04-03  Sven Neumann  <sven@gimp.org>

	* app/app_procs.c: don't use MAXPATHLEN, spotted by Robert Millan
	<zeratul2@wanadoo.es>.
2003-04-03 12:09:35 +00:00
Manish Singh
89378edc2e actually honor the max_p parameter in non-interactive mode.
2003-03-26  Manish Singh  <yosh@gimp.org>

        * plug-ins/common/max_rgb.c: actually honor the max_p parameter in
        non-interactive mode.
2003-03-26 17:42:29 +00:00
Sven Neumann
3c4dea9a38 removed junk added by gettextize 2003-03-24 19:20:48 +00:00
Michael Natterer
7e27cd72b0 changed if(fail) (which is always TRUE) to if(*fail) (fixes bug #108962).
2003-03-24  Michael Natterer  <mitch@gimp.org>

	* app/xcf.c (xcf_save_layer): changed if(fail) (which is
	always TRUE) to if(*fail) (fixes bug #108962).
2003-03-24 18:59:52 +00:00
Manish Singh
e41fcd1ea1 always quote the filename, since system/popen uses the shell (dropped in
2003-03-21  Manish Singh  <yosh@gimp.org>

        * plug-ins/common/ps.c: always quote the filename, since system/popen
        uses the shell (dropped in g_shell_quote from glib2). Also, never
        quote the filename if we are reading from a parameter file (only
        in the win32 case). Fixes #108648.

        * tools/pdbgen/lib.pl: fix minor buglet that earlier perls silently
        ate (fix from HEAD)
2003-03-22 01:07:10 +00:00
Sven Neumann
b5882129d8 applied a patch from Maurits Rijk that fixes bug #71478.
2003-03-15  Sven Neumann  <sven@gimp.org>

	* plug-ins/imagemap/imap_rectangle.c: applied a patch from
	Maurits Rijk that fixes bug #71478.
2003-03-15 13:05:03 +00:00
Sven Neumann
43e109d3b5 shut up CVS 2003-03-14 16:43:20 +00:00
Sven Neumann
548d784647 added a call to libtoolize to make it work with newer versions of
2003-03-14  Sven Neumann  <sven@gimp.org>

	* autogen.sh: added a call to libtoolize to make it work with
	newer versions of automake.
2003-03-14 15:26:24 +00:00
Chyla Zbigniew
ba4373027e Updated Polish translation by GNOME PL Team <translators@gnome.pl> 2003-03-14 03:03:39 +00:00
Sven Neumann
d4c1f62aec removed a leftover warning in otherwise sane code (fixes bug #97214).
2003-03-11  Sven Neumann  <sven@gimp.org>

	* app/airbrush.c (airbrush_paint_func): removed a leftover warning
	in otherwise sane code (fixes bug #97214).
2003-03-11 20:01:27 +00:00
Sven Neumann
ea0f7c52ce tools/pdbgen/pdb/guides.pdb merged fix for bug #90629 from HEAD branch.
2003-03-07  Sven Neumann  <sven@gimp.org>

	* tools/pdbgen/pdb/guides.pdb
	* app/guides_cmds.c: merged fix for bug #90629 from HEAD branch.
2003-03-07 17:14:07 +00:00
Tor Lillqvist
a76e555ef2 Yet one more UTF-8 hack for Windows.
2003-03-06  Tor Lillqvist  <tml@iki.fi>

	* app/fileops.c (file_save_as_callback): Yet one more UTF-8 hack
	for Windows.
2003-03-06 01:19:57 +00:00
Sven Neumann
23524fcec7 refuse to install procedures that attempt to register a menu path that
2003-03-04  Sven Neumann  <sven@gimp.org>

	* app/plug_in.c (plug_in_handle_proc_install): refuse to install
	procedures that attempt to register a menu path that contain an
	underscore (bug #107556).
2003-03-04 16:18:54 +00:00
Raphael Quinet
978d1f67f7 fixed a typo in the kernel for sobel vertical edge detection spotted by
2003-03-03  Raphael Quinet  <quinet@gamers.org>

	* plug-ins/common/edge.c (edge): fixed a typo in the kernel for
	sobel vertical edge detection spotted by Sunil Mohan Adapa (bug
	#107441).
2003-03-03 14:00:40 +00:00
Sven Neumann
d8536f0bf9 don't try to get the offsets from a NULL drawable. Fixes bug #107438.
2003-03-03  Sven Neumann  <sven@gimp.org>

	* app/clone.c (clone_paint_func): don't try to get the offsets
	from a NULL drawable. Fixes bug #107438.
2003-03-03 13:12:50 +00:00
Tomas Ogren
ce3215237c Wrongly translated menu
2003-03-03  Tomas Ogren <stric@ing.umu.se>

* sv.po: Wrongly translated menu
2003-03-03 02:50:21 +00:00
Marc Lehmann
facdecf595 *** empty log message *** 2003-02-28 20:03:21 +00:00
Raphaël Quinet
a044685519 Oops! I mentioned Makefile.am in my last ChangeLog entry, but I
forgot to commit the file together with the other ones.
2003-02-28 12:58:59 +00:00
Raphael Quinet
56f59a9c1c plug-ins/script-fu/scripts/Makefile.am
2003-02-27  Raphael Quinet  <quinet@gamers.org>

	* plug-ins/script-fu/scripts/Makefile.am
	* plug-ins/script-fu/scripts/3d-outline.scm
	* plug-ins/script-fu/scripts/alien-glow-logo.scm
	* plug-ins/script-fu/scripts/alien-neon-logo.scm
	* plug-ins/script-fu/scripts/basic1-logo.scm
	* plug-ins/script-fu/scripts/basic2-logo.scm
	* plug-ins/script-fu/scripts/blended-logo.scm
	* plug-ins/script-fu/scripts/bovinated-logo.scm
	* plug-ins/script-fu/scripts/chalk.scm
	* plug-ins/script-fu/scripts/chip-away.scm
	* plug-ins/script-fu/scripts/chrome-logo.scm
	* plug-ins/script-fu/scripts/comic-logo.scm
	* plug-ins/script-fu/scripts/coolmetal-logo.scm
	* plug-ins/script-fu/scripts/frosty-logo.scm
	* plug-ins/script-fu/scripts/glossy.scm
	* plug-ins/script-fu/scripts/glowing-logo.scm
	* plug-ins/script-fu/scripts/gradient-bevel-logo.scm
	* plug-ins/script-fu/scripts/neon-logo.scm
	* plug-ins/script-fu/scripts/script-fu-util.scm
	* plug-ins/script-fu/scripts/starburst-logo.scm
	* plug-ins/script-fu/scripts/starscape-logo.scm
	* plug-ins/script-fu/scripts/t-o-p-logo.scm
	* plug-ins/script-fu/scripts/textured-logo.scm: applied a slightly
	modified version of the patch provided by Chauk-Mean PROUM to fix
	the behavior of some alpha-to-logo scripts when the layer has a
	non-zero offset or if a selection exists.  Fixes bug #73891.
2003-02-27 17:06:24 +00:00
Valek Frob
d6ee1997c2 Updated russian translation. 2003-02-22 16:22:34 +00:00
Dave Neary
1d4a9aa780 Merged fix for bug #105360 from HEAD.
2003-02-22  Dave Neary  <bolsh@gimp.org>

        * plug-ins/common/png.c: Merged fix for bug #105360 from
        HEAD.
2003-02-22 14:26:04 +00:00
Valek Frob
345d5f083d Updated russian translation. 2003-02-22 09:25:11 +00:00
Tor Lillqvist
ca4a9c0329 Don't dist gimptool-win32.c, only gimptool-win32.c.in. Don't dist
2003-02-18  Tor Lillqvist  <tml@iki.fi>

	* Makefile.am (EXTRA_DIST): Don't dist gimptool-win32.c, only
	gimptool-win32.c.in. Don't dist gimp-zip, but gimp-zip.in.
2003-02-18 20:29:59 +00:00
jaycox
ca32a2ceb4 app/paint_funcs.c: Fixed an initialization error in fatten_region and
app/paint_funcs.c:  Fixed an initialization error
        in fatten_region and thin_region discovered by hans_meine@gmx.net
2003-02-18 06:57:25 +00:00
Tor Lillqvist
6c41135776 Some Win32 UTF-8 hacks needed here, too.
2003-02-18  Tor Lillqvist  <tml@iki.fi>

	* app/menus.c (menus_last_opened_cmd_callback,
	menus_last_opened_update_labels): Some Win32 UTF-8 hacks needed
	here, too.
2003-02-18 00:34:00 +00:00
Tor Lillqvist
614b09dc46 Undef DATADIR here, too.
2003-02-17  Tor Lillqvist  <tml@iki.fi>

	* libgimp/gimp.c: Undef DATADIR here, too.

	* libgimp/gimpwire.c (wire_write_double): Use the format %0.15e
	instead of %0.50e on Windows, where g_snprintf() in GLib 2.2.x
	uses Trio, which is rather buggy when outputting floating point
	in superfluous precision.

(The following part of the ChangeLog had got lost in my previous commit.)

2003-02-11  Tor Lillqvist  <tml@iki.fi>

	* configure.in
	* app/gimprc.c
	* app/plug_in.c
	* app/plug_in.h
	* libgimp/gimp.c
	* libgimp/gimpprotocol.h: Hackish fix for bug #66859. Worth it in
	this branch only on Win32, where the Photoshop plug-in interface
	plug-in needs the init_proc functionality. Code ifdeffed with
	HACK_FOR_BUG_66859, which configure.in defines on Win32.

	* libgimp/gimpenv.c: Undef DATADIR on Win32. It clashes with a
	typedef in objidl.h, and isn't used as configure-time hardcoded
	from the Makefile on Win32 anyway.

	* plug-ins/script-fu/script-fu-intl.h: On Win32, call
	bind_textdomain_codeset() to get messages from gettext in UTF-8,
	which is what the GTK+ 1.3.0 used on Win32 wants.

	* plug-ins/twain/tw_func.c
	* plug-ins/twain/twain.c: Fix two TWAIN issues, from Hermann Josef
	Hill: Handle cancelling the scan, and get image resolution from
	TWAIN.

	* plug-ins/webbrowser/webbrowser.c (start_browser): Return a
	correct value on Win32.
2003-02-17 23:03:25 +00:00
Sven Neumann
adae63df5f removed files that were moved on the HEAD branch 2003-02-14 12:42:06 +00:00
Manish Singh
b9385e9ca1 make it build again (oops from previous commit)
2003-02-13  Manish Singh  <yosh@gimp.org>

        * plug-ins/gflare/gflare.c: make it build again (oops from previous
        commit)
2003-02-14 01:43:50 +00:00
Tor Lillqvist
de55e8e3a3 Add ta.
2002-05-27  Tor Lillqvist  <tml@iki.fi>

	* makefile.mingw: Add ta.
2003-02-11 22:14:43 +00:00
Tor Lillqvist
b914202a93 On Win32, call bind_textdomain_codeset() to get messages from gettext in
2003-02-11  Tor Lillqvist  <tml@iki.fi>

	* plug-ins/script-fu/script-fu-intl.h: On Win32, call
	bind_textdomain_codeset() to get messages from gettext in UTF-8,
	which is what the GTK+ 1.3.0 used on Win32 wants.

	* plug-ins/twain/tw_func.c
	* plug-ins/twain/twain.c: Fix two TWAIN issues, from Hermann Josef
	Hill: Handle cancelling the scan, and get image resolution from
	TWAIN.

	* plug-ins/webbrowser/webbrowser.c (start_browser): Return a
	correct value on Win32.
2003-02-11 22:12:59 +00:00
Tor Lillqvist
1c45c98ded configure.in app/gimprc.c app/plug_in.c app/plug_in.h libgimp/gimp.c
2003-02-11  Tor Lillqvist  <tml@iki.fi>

	* configure.in
	* app/gimprc.c
	* app/plug_in.c
	* app/plug_in.h
	* libgimp/gimp.c
	* libgimp/gimpprotocol.h: Hackish fix for bug #66859. Worth it in
	this branch only on Win32, where the Photoshop plug-in interface
	plug-in needs the init_proc functionality. Code ifdeffed with
	HACK_FOR_BUG_66859, which configure.in defines on Win32.

	* libgimp/gimpenv.c: Undef DATADIR on Win32. It clashes with a
	typedef in objidl.h, and isn't used as configure-time hardcoded
	from the Makefile on Win32 anyway.
2003-02-11 21:59:59 +00:00
Sven Neumann
c5e1e3e3c5 removed files moved in HEAD branch 2003-02-10 17:19:22 +00:00
Tor Lillqvist
54a806e3dc Typo. 2003-02-10 01:25:24 +00:00
Tor Lillqvist
80ffa0a102 Fix a bug in the UTF-8-on-Win32 code related to reverting an image.
2003-02-10  Tor Lillqvist  <tml@iki.fi>

	* app/fileops.c: Fix a bug in the UTF-8-on-Win32 code related
	to reverting an image.

	* app/gimpdnd.c (gimp_dnd_file_open_files): Use
	g_filename_from_uri() on Win32.
2003-02-10 01:12:04 +00:00
Tor Lillqvist
de7ca23496 app/docindex.c app/fileops.c Ugly Win32-only hacks for UTF-8 which is used
2003-02-10  Tor Lillqvist  <tml@iki.fi>

	* app/docindex.c
	* app/fileops.c
	* app/gimpimage.c: Ugly Win32-only hacks for UTF-8 which is used
	by the GTK+ 1.3.0 branch that GIMP uses on Win32. Mostly stopgap
	measurements to get past most of the hiccups that non-ASCII file
	names cause. Committed to avoid having uncommitted source changes
	in the Win32 build.
2003-02-10 00:44:16 +00:00
Tor Lillqvist
9a8825d8ba plug-ins/gflare/gflare.c Apply old fix for #67386 on Win32, to avoid
2003-02-10  Tor Lillqvist  <tml@iki.fi>

	* plug-ins/gflare/gflare.c
	* plug-ins/ifscompose/ifscompose_utils.c: Apply old fix for #67386
	on Win32, to avoid having uncommitted source changes in the Win32
	build. Keep old code as such on Unix (even if presumably wrong on
	many Unix variants).

	* plug-ins/flame/cmap.c
	* plug-ins/gimpressionist/plasma.c: Include gimpmath.h for random
	number funcs on Win32.
2003-02-10 00:23:45 +00:00
Tor Lillqvist
1d874f4ec1 plug-ins/common/CML_explorer.c plug-ins/common/cubism.c
2003-02-10  Tor Lillqvist  <tml@iki.fi>

	* plug-ins/common/CML_explorer.c
	* plug-ins/common/cubism.c
	* plug-ins/common/noisify.c
	* plug-ins/common/nova.c
	* plug-ins/common/papertile.c
	* plug-ins/common/scatter_hsv.c
	* plug-ins/common/sinus.c
	* plug-ins/common/snoise.c
	* plug-ins/common/sparkle.c
	* plug-ins/common/warp.c
	* plug-ins/common/wind.c: Apply old fix for #67386 on Win32, to
	avoid having uncommitted source changes in the Win32 build. Keep
	old code as such on Unix (even if presumably wrong on many Unix
	variants).
2003-02-10 00:15:44 +00:00
Tor Lillqvist
6af7e19a5d Build winclipboard and winprint only on Win32. Don't build bz2, mail,
2003-02-09  Tor Lillqvist  <tml@iki.fi>

	* plug-ins/common/Makefile.am: Build winclipboard and winprint
	only on Win32. Don't build bz2, mail, screenshot or url on Win32.
2003-02-09 23:54:00 +00:00
Tor Lillqvist
9340a7f795 Don't try to build xjt plug-in on Win32, no tar or bzip2 anyway,
2003-02-09  Tor Lillqvist  <tml@iki.fi>

	* configure.in: Don't try to build xjt plug-in on Win32, no
	tar or bzip2 anyway, typically.

	* plug-ins/Makefile.am: Remove already commented out obsolete
	makefile.mingw cruft.
2003-02-09 23:50:33 +00:00
Tor Lillqvist
12c2cec6b2 On Win32, define G_MAXRAND as G_MAXINT. (GIMP_WIN32_RAND_FUNC,
2003-02-09  Tor Lillqvist  <tml@iki.fi>

	* libgimp/gimpmath.h: On Win32, define G_MAXRAND as G_MAXINT.
	(GIMP_WIN32_RAND_FUNC, GIMP_WIN32_SRAND_FUNC): Define on Win32 as
	calls to g_random_int_range() and g_random_set_seed().
2003-02-09 23:41:25 +00:00
Tor Lillqvist
58df7bfbe2 Install also the .def files, so that people with other compilers can build
2003-02-09  Tor Lillqvist  <tml@iki.fi>

	* libgimp/Makefile.am (install-libtool-import-lib): Install also
	the .def files, so that people with other compilers can build
	import libraries if needed.
2003-02-09 23:37:57 +00:00
Tor Lillqvist
c708a21fd5 Fix rules for making the import library libgimpapp for importing from the
2003-02-09  Tor Lillqvist  <tml@iki.fi>

	* app/Makefile.am: Fix rules for making the import library
	libgimpapp for importing from the GIMP executable (needed by the
	modules). Copy gimp-1.2 to gimp.exe on Win32. Don't distribute
	libgimpapp.la.

	* app/libgimpapp.la: Remove, unneeded.
2003-02-09 23:35:33 +00:00
Tor Lillqvist
09d4191ade Slight updates. Remove section about libintl, no need to mention that
2003-02-09  Tor Lillqvist  <tml@iki.fi>

	* README.win32: Slight updates. Remove section about libintl, no
	need to mention that separately here, if somebody has glib, they
	already have had to download libintl anyway.

	* gimp-zip.in: Also distribute .def files.
2003-02-09 23:19:02 +00:00
Tor Lillqvist
1593b44309 Update check for gcc option to use for MSVC-compatible struct packing: In
2003-02-09  Tor Lillqvist  <tml@iki.fi>

	* configure.in: Update check for gcc option to use for
	MSVC-compatible struct packing: In gcc 3, it's -mms-bitfields.

	Set RAND_FUNC and SRAND_FUNC differently on Win32.

	Check for bind_textdomain_codeset on Win32.

	* acconfig.h: Add HAVE_BIND_TEXTDOMAIN_CODESET.
2003-02-09 23:15:32 +00:00
Manish Singh
5f4517ed60 64-bit cleaniless cleanups.
2002-02-08  Manish Singh  <yosh@gimp.org>

        * app/paint-funcs/paint-funcs.c: 64-bit cleaniless cleanups.
2003-02-08 00:38:16 +00:00
Manish Singh
2c3083609c if the quality level is close to zero in non-interactive mode, use default
2003-02-05  Manish Singh  <yosh@gimp.org>

        * plug-ins/common/jpeg.c (run): if the quality level is close to zero
        in non-interactive mode, use default settings. This is hack until
        the PDB gets default arguments, so gimp-file-save works sanely with
        jpeg.
2003-02-05 19:53:55 +00:00
Manish Singh
bbb9202edd don't divide by zero if we get all zero resolution info when we load the
2003-01-29  Manish Singh  <yosh@gimp.org>

        * plug-ins/common/jpeg.c (load_image): don't divide by zero if
        we get all zero resolution info when we load the jpeg.
2003-01-30 01:13:26 +00:00
Manish Singh
d39783ac7c added GINT_TO_POINTER and friends, fixed format strings, for 64-bitness.
2003-01-14  Manish Singh  <yosh@gimp.org>

        * many files in app, libgimp, and plug-ins: added GINT_TO_POINTER and
        friends, fixed format strings, for 64-bitness.

        * many Makefile.am's in plug-ins: use LDFLAGS = @LDFLAGS@ $(mwindows)
        so any user set flags get passed on

        * app/plug_in.h: removed unused structure members housed in #ifdef
        G_OS_WIN32.
2003-01-15 03:17:07 +00:00
Manish Singh
df2e5ee2d0 Oops, the configure.in change below didn't actually work. Refactored so it
2003-01-14  Manish Singh  <yosh@gimp.org>

        * configure.in: Oops, the configure.in change below didn't actually
        work. Refactored so it does.
2003-01-15 02:58:04 +00:00
Sven Neumann
285668bca0 removed two lines which have become obsolete after my latest change.
2003-01-14  Sven Neumann  <sven@gimp.org>

	* app/scale.c: removed two lines which have become obsolete after
	my latest change.

	* plug-ins/perl/examples/tex-to-float (tex_string_to_pgm): applied
	a patch from Yeti <yeti@physics.muni.cz> that makes the plug-in
	handle the output of newer versions of dvips (fixes #102435).
2003-01-14 14:23:41 +00:00
Sven Neumann
db8d2b2e87 fixed bug #83458.
2003-01-14  Sven Neumann  <sven@gimp.org>

	* it.po: fixed bug #83458.
2003-01-14 11:19:28 +00:00
Manish Singh
8e6b49ac6e Partially address #102058 with a --with-shm configure option. Defaults to
2003-01-13  Manish Singh  <yosh@gimp.org>

        * configure.in: Partially address #102058 with a --with-shm configure
        option. Defaults to sysv except on OS X, where it is none.
2003-01-14 04:24:21 +00:00
Sven Neumann
8e07b641a2 break out of the loop that calculates the initial zoom ratio in case we
2003-01-10  Sven Neumann  <sven@gimp.org>

	* app/interface.c (create_display_shell): break out of the loop
	that calculates the initial zoom ratio in case we hit our limits.
	Seems to fix bug #103030.

	* app/scale.c (change_scale): removed a check that dates back to
	the times when we used Motif for our user interface and scrollbars
	used short values. Fixes bug #94979.
2003-01-10 15:01:19 +00:00
Sven Neumann
d518e1e5e6 always set the number of returned values, even in case of an error (fix
2003-01-09  Sven Neumann  <sven@gimp.org>

	* app/procedural_db.c (procedural_db_run_proc): always set the
	number of returned values, even in case of an error (fix merged
	from HEAD branch).
2003-01-09 12:56:36 +00:00
Sven Neumann
0bdb51e276 oops, call gimp-1.2, not gimp-1.2 2003-01-06 15:06:54 +00:00
Sven Neumann
9d86b24a98 backported the rewritten gimp-remote from the HEAD branch.
2003-01-06  Sven Neumann  <sven@gimp.org>

	* tools/gimp-remote.c: backported the rewritten gimp-remote from
	the HEAD branch.
2003-01-06 14:57:45 +00:00
Sven Neumann
2a4ccbd8f0 gimp-1.2.1.in removed incorrect copyright clauses and updated information
2003-01-06  Sven Neumann  <sven@gimp.org>

	* gimp-1.2.1.in
	* gimptool-1.2.1.in: removed incorrect copyright clauses and
	updated information about bug reporting.
2003-01-06 12:20:52 +00:00
Sven Neumann
da2aba0785 merged fix for bug #73894 from HEAD branch.
2003-01-05  Sven Neumann  <sven@gimp.org>

	* plug-ins/script-fu/scripts/starscape-logo.scm: merged fix for
	bug #73894 from HEAD branch.
2003-01-05 22:10:36 +00:00
Sven Neumann
633876b74a redid the fix for bug #101036 since Garry's fix introduced a crash if the
2003-01-05  Sven Neumann  <sven@gimp.org>

	* app/gimpimage.c (gimp_image_merge_layers): redid the fix for bug
	#101036 since Garry's fix introduced a crash if the flattened
	image has undo disabled. Instead of temporarily changing the layer
	mode, just use a different mode for combine_regions().
2003-01-05 03:29:30 +00:00
Sven Neumann
a1000ee67c updated german translation 2003-01-02 16:22:08 +00:00
Sven Neumann
85052facf6 pass offsets to channel_combine_mask() to fix bug #101731 [Fuzzy Selection
2003-01-02  Sven Neumann  <sven@gimp.org>

	    * app/channel.c (channel_feather): pass	offsets to
	    channel_combine_mask() to fix bug #101731 [Fuzzy Selection with
	    feather is wrong].
2003-01-02 14:09:47 +00:00
Garry R. Osgood
8f181cace9 Unless DISSOLVE_MODE, temporarily set bottom mode
of composite to "Normal" in all merge types; including
image flatten. Closes bug #101036 on gimp-1-2 branch only.
2002-12-31 02:48:30 +00:00
Sven Neumann
3562f9d78e plug-ins/imagemap/imap_csim.l plug-ins/imagemap/imap_csim.y merged fix for
2002-12-30  Sven Neumann  <sven@gimp.org>

	* plug-ins/imagemap/imap_csim.l
	* plug-ins/imagemap/imap_csim.y
	* plug-ins/imagemap/imap_csim_parse.[ch]: merged fix for bug #97776
	from HEAD branch.
2002-12-30 22:58:26 +00:00
Garry R. Osgood
db90733a03 app/brightness_contrast.c app/color_balance.c app/curves.c
2002-12-28  Garry R. Osgood <grosgood@rcn.com>
* app/brightness_contrast.c
* app/color_balance.c
* app/curves.c
* app/hue_saturation.c
* app/levels.c
* app/posterize.c
* app/threshold.c: altered all *_initialize ()
to first query whether or not the image contains
drawables. Closes bug #86494 for gimp-1-2.
2002-12-28 10:53:55 +00:00
Garry R. Osgood
e97e8d5013 fixed buglet introduced in 2002-12-19 check-in affecting scripts that
2002-12-21  Garry R. Osgood <grosgood@rcn.com>
* app/gimpimage.c: fixed buglet introduced in 2002-12-19
check-in affecting scripts that merge layers with disabled undo.
2002-12-21 22:41:36 +00:00
Garry R. Osgood
fdadb77cc2 app/brightness_contrast.c app/color_balance.c app/color_balance.h
2002-12-20  Garry R. Osgood <grosgood@rcn.com>
* app/brightness_contrast.c
* app/color_balance.c
* app/color_balance.h
* app/curves.c
* app/curves.h
* app/hue_saturation.c
* app/hue_saturation.h
* app/levels.c
* app/posterize.c
* app/threshold.c
* app/threshold.h : fixed connect/disconnect asymmetry
bug introduced in my 2002-12-2002 check-in. See
report for bug #82671 at bugzilla.gnome.org for
details.
2002-12-21 01:33:16 +00:00
Nate Summers
55444fc547 fclose fix 2002-12-19 18:51:48 +00:00
Sven Neumann
d00ffebb63 unmarked most of the strings that Nathan marked for translation. The
2002-12-19  Sven Neumann  <sven@gimp.org>

	* app/xcf.c: unmarked most of the strings that Nathan marked for
	translation. The messages should only be triggered under very rare
	circumstances and the strings would need to be reviewed before
	marking them as translatable. We are too close to a release for
	major string changes.
2002-12-19 11:02:43 +00:00
Nathan Summers
7a77ef0ecc actually check to make sure writes are successful, instead of
2003-12-19  Nathan Summers  <rock@gimp.org>

        * app/xcf.c: actually check to make sure writes are successful, instead
        of unconditionally assuming that they are.  Fixes bug #101340.
2002-12-19 07:27:15 +00:00
Garry R. Osgood
ff7750cf0c Updated my CV New GimpImage signal: LAYER_MERGE app/brightness_contrast.c
2002-12-19  Garry R. Osgood <grosgood@rcn.com>
* MAINTAINERS: Updated my CV
* app/gimpimage.c: New GimpImage signal: LAYER_MERGE
* app/brightness_contrast.c
* app/color_balance.c
* app/curves.c
* app/hue_saturation.c
* app/levels.c
* app/posterize.c
* app/threshold.c: cancel callbacks connect to GimpImage LAYER_MERGE signals.
Closes Bug #82671; gimp crash with (1) active image map tools while
(2) user performs a merge operation.
2002-12-19 02:22:56 +00:00
Sven Neumann
d6b312b083 rewrote my ChangeLog entry so it makes more sense 2002-12-17 18:08:46 +00:00
Sven Neumann
f6a331d7b3 changed the documentation as suggested in bug #84884.
2002-12-17  Sven Neumann  <sven@gimp.org>

	* plug-ins/perl/Gimp.pm: changed the documentation as suggested in
	bug #84884.
2002-12-17 16:54:14 +00:00
Sven Neumann
533871c8b9 don't install signal handlers for fatal signals if stack_trace_mode is
2002-12-17  Sven Neumann  <sven@gimp.org>

	* app/main.c: don't install signal handlers for fatal signals if
	stack_trace_mode is STACK_TRACE_NEVER (fixes bug #71409).

	* plug-ins/common/jpeg.c: applied a patch from Raphael Quinet that
	suppressed saving of default settings when a JPEG image is loaded
	(fixes bug #75398).
2002-12-17 16:25:47 +00:00
Sven Neumann
307879b977 applied a patch from Raphael Quinet that removes outdated links and adds
2002-12-17  Sven Neumann  <sven@gimp.org>

	* plug-ins/webbrowser/web-browser.scm: applied a patch from Raphael
	Quinet that removes outdated links and adds one for the GUG
	(bug #101435).
2002-12-17 12:33:31 +00:00
Sven Neumann
1b2afd36f9 tools/pdbgen/pdb/drawable.pdb document how to interpret the numbers
2002-12-13  Sven Neumann  <sven@gimp.org>

	* tools/pdbgen/pdb/drawable.pdb
	* tools/pdbgen/pdb/selection.pdb: document how to interpret the
	numbers returned for the selection bounding box. Fixes bug #96284.

	* app/drawable_cmds.c
	* app/selection_cmds.c
	* libgimp/gimpdrawable_pdb.c
	* libgimp/gimpselection_pdb.c: regenerated.
2002-12-13 19:14:59 +00:00
Sven Neumann
d8b0072088 hide the file selection dialogs on "delete_event". Fixes bug #92750.
2002-12-13  Sven Neumann  <sven@gimp.org>

	* plug-ins/imagemap/imap_file.c: hide the file selection dialogs
	on "delete_event". Fixes bug #92750.
2002-12-13 18:25:37 +00:00
Sven Neumann
81611f3058 merged fix for bug #83971 from HEAD branch.
2002-12-13  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/papertile.c: merged fix for bug #83971 from HEAD
	branch.
2002-12-13 15:22:27 +00:00
Sven Neumann
52e582f49d applied a patch from Peter Kirchgessner that suppresses the progress bar
2002-12-13  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/tiff.c: applied a patch from Peter Kirchgessner
	that suppresses the progress bar in non-interactive mode (#97352).
2002-12-13 14:57:46 +00:00
Sven Neumann
a7f47ee0b2 avoid to move the image window offscreen (#79486).
2002-12-13  Sven Neumann  <sven@gimp.org>

	* app/gdisplay_ops.c (gdisplay_shrink_wrap): avoid to move the
	image window offscreen (#79486).
2002-12-13 14:33:20 +00:00
Hans Breuer
838cf918d3 need to adjust the data pointer for BI_BITFIELDS bitmaps, fixes #99246
2002-12-06  Hans Breuer  <hans@breuer.org>

	* plug-ins/common/winclipboard.c : need to adjust the data
	pointer for BI_BITFIELDS bitmaps, fixes #99246
2002-12-06 19:41:19 +00:00
Sven Neumann
810272bd27 merged fix for #91067 from HEAD branch.
2002-11-12  Sven Neumann  <sven@gimp.org>

	* app/paint_core.c: merged fix for #91067 from HEAD branch.
2002-11-12 16:35:47 +00:00
Sven Neumann
4192405754 I don't think Mitch wanted to commit this. 2002-11-11 18:52:28 +00:00
Michael Natterer
e692510701 don't simply crash when called with a NULL context but use the deafult
2002-11-11  Michael Natterer  <mitch@gimp.org>

	* app/gimpcontext.c (gimp_context_set_default_colors,
	gimp_context_swap_colors): don't simply crash when called with a
	NULL context but use the deafult context. Fixes this functions
	when called from the PDB. Spotted by Michael Bushey
	<gimp@michael.mailshell.com>.
2002-11-11 15:53:50 +00:00
Manish Singh
ce298dac50 allow setting compression level 0 from the UI.
2002-11-09  Manish Singh  <yosh@gimp.org>

        * plug-ins/common/png.c: allow setting compression level 0 from
        the UI.
2002-11-10 00:25:00 +00:00
Dave Neary
d985506223 Applied patch from Raphael Quinet to suppress printing of comments in XBM
2002-11-07  Dave Neary  <bolsh@gimp.org>
        * plug-ins/common/xbm.c: Applied patch from Raphael
        Quinet to suppress printing of comments in XBM files.
        Closes bug #82763.
2002-11-07 18:51:23 +00:00
Dave Neary
b297be899e help/C/images/brush_dialog.png Applied patch from Cameron Gregory
2002-11-07  Dave Neary  <bolsh@gimp.org>
        * help/C/images/brush_dialog.png
        * help/C/dialogs/brush_selection.html: Applied patch from
        Cameron Gregory <cameron@bloke.com> to add missing help
        file. Closes bug #92377.
2002-11-07 17:43:27 +00:00
Sven Neumann
b952882a07 applied patch from Raphael Quinet that untoggles the "Save background
2002-11-06  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/png.c: applied patch from Raphael Quinet that
	untoggles the "Save background color" option for images w/o an
	alpha channel (#92395).
2002-11-06 20:22:42 +00:00
Dave Neary
4654d4e387 Back-ported patch from HEAD to close bug #55700.
2002-10-29  Dave Neary  <bolsh@gimp.org>

        * plug-ins/common/png.c: Back-ported patch from HEAD to
        close bug #55700.
2002-10-29 19:23:33 +00:00
Manish Singh
bcc42b6cb1 strip paths from the plug-in filename for installation (fixes #97111).
2002-10-29  Manish Singh  <yosh@gimp.org>

        * gimptool-1.2.in: strip paths from the plug-in filename for
        installation (fixes #97111).
2002-10-29 11:29:28 +00:00
Tor Lillqvist
94815c8ddd If on Win32, call bind_textdomain_codeset() to get messages from gettext
2002-10-22  Tor Lillqvist  <tml@iki.fi>

	* libgimp/stdplugins-intl.h: If on Win32, call
	bind_textdomain_codeset() to get messages from gettext in UTF-8,
	which is what the GTK+ 1.3.0 used on Win32 wants.
2002-10-22 20:43:56 +00:00
Tor Lillqvist
4b28d2a3d9 app/main.c (main) If on Win32, call bind_textdomain_codeset() to get
2002-10-22  Tor Lillqvist  <tml@iki.fi>

	* app/main.c (main)
	* app/plug_in.c (plug_in_make_menu): If on Win32, call
	bind_textdomain_codeset() to get messages from gettext in UTF-8,
	which is what the GTK+ 1.3.0 used on Win32 wants.

	* app/plug_in.c (plug_in_close): Move a variable inside #ifndef
	G_OS_WIN32.
	(xspawnv): Remove a couple of leftover unused variables.
2002-10-22 20:39:16 +00:00
Tor Lillqvist
ac2bca6788 Add rule to produce gimp.def from gimp.sym. Had been left out by mistake.
2002-10-22  Tor Lillqvist  <tml@iki.fi>

	* app/Makefile.am: Add rule to produce gimp.def from gimp.sym. Had
	been left out by mistake. Add rule to mv gimp-1.2.exe gimp.exe.

	* config.h.win32: Define HAVE_BIND_TEXTDOMAIN_CODESET (which is
	essential on Win32 builds to get working i18n with a libintl that
	otherwise converts to some codepage. Also define HAVE_GETTEXT even
	if that isn't checked in any file. Define HAVE_WINSOCK_H. Add some
	#undefs from a current configure-generated config.h for
	completeness' sake.
2002-10-22 20:27:02 +00:00
Tor Lillqvist
fd2ee9d0d9 Fixes for --msvc-syntax handling. Don't try to use configure-time CFLAGS
2002-10-16  Tor Lillqvist  <tml@iki.fi>

	* gimptool-win32.c.in (find_out_env_flags): Fixes for
	--msvc-syntax handling. Don't try to use configure-time CFLAGS and
	LDFLAGS intended for gcc if we are asked to do --msvc-syntax.

	* Makefile.am (EXTRA_DIST): Add gimptool-win32.c and .in. No rules
	to build gimptool-win32.exe on Windows, would require some
	automake acrobatics that I am too tired to attempt now.
2002-10-16 20:07:10 +00:00
Manish Singh
b4c30b3053 Updated Lithuanian translation from Mantas Kriauciunas
2002-10-09  Manish Singh  <yosh@gimp.org>

        * lt.po: Updated Lithuanian translation from Mantas Kriauciunas
2002-10-09 18:39:36 +00:00
Sven Neumann
5bfdddc949 applied a patch from Peter Kirchgessner that fixes bug #78310 (wrong
2002-10-08  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/ps.c: applied a patch from Peter Kirchgessner
	that fixes bug #78310 (wrong bounding box when exporting to EPS).
2002-10-08 10:51:23 +00:00
Jacob Berkman
4c2d5e7ad8 rename to AM_CPPFLAGS
2002-09-26  Jacob Berkman  <jacob@ximian.com>

	* modules/Makefile.am (CPPFLAGS): rename to AM_CPPFLAGS
2002-09-27 02:10:08 +00:00
Michael Natterer
b5fbc55b67 ported fix for #93853 from HEAD.
2002-09-24  Michael Natterer  <mitch@gimp.org>

	* app/channel.c (channel_sharpen): ported fix for #93853 from HEAD.
2002-09-24 16:55:44 +00:00
Vincent van Adrighem
89d8a203e1 Dutch translation updated by Branko Collin
2002-09-22 Vincent van Adrighem <V.vanAdrighem@dirck.mine.nu>
	* nl.po: Dutch translation updated by Branko Collin
2002-09-22 18:55:15 +00:00
Manish Singh
2b6f9d7f74 Allow activation of the search from the entry field.
2002-09-18  Manish Singh  <yosh@gimp.org>

        * plug-ins/dbbrowser/dbbrowser_utils.c: Allow activation of the
        search from the entry field.
2002-09-19 01:25:30 +00:00
Sven Neumann
eef97ae60a fixed german translation (bug #93543).
2002-09-18  Sven Neumann  <sven@gimp.org>

	* de.po: fixed german translation (bug #93543).
2002-09-18 05:38:52 +00:00
Hans Breuer
8299a77051 Updated to allow building Gimp 1.2.x with msvc using the same libraries as
2002-09-16  Hans Breuer  <hans@breuer.org>

	* app/makefile.msc libgimp/makefile.msc
	  plug-ins/makefile.msc modules/makefile.msc :
	Updated to allow building Gimp 1.2.x with msvc using
	the same libraries as the mingw build does.

	* app/user_install.c : #ifdef G_OS_WIN32 get the
	definitions of S_ISDIR and S_ISREG

	* libgimp/gimp.def libgimp/gimpui.def : exported more
	non underscored functions (shoud be almost complete now)

	* plug-ins/gflare/gflare.c : include <gtk/gtk.h> before
	relying on G_OS_* being defined

	* plug-ins/twain/twain.c : implement main() to allow to
	build as console app as well.
2002-09-16 21:38:33 +00:00
Sven Neumann
f845575585 don't call gimp_temp_name() with (NULL + 1) if find_extension() failed.
2002-09-10  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/gz.c (load_image): don't call gimp_temp_name()
	with (NULL + 1) if find_extension() failed.
2002-09-10 14:19:52 +00:00
Manish Singh
f93cca77d2 only do the below for image clone, pattern clones don't have source
2002-09-03  Manish Singh  <yosh@gimp.org>

        * app/clone.c: only do the below for image clone, pattern clones
        don't have source drawables
2002-09-05 07:17:07 +00:00
Michael Natterer
2deb5f255b draw the source crosshair with the src_drawable's offset, not the offset
2002-09-03  Michael Natterer  <mitch@gimp.org>

	* app/clone.c: draw the source crosshair with the src_drawable's
	offset, not the offset of the active_drawable (fixes #92311).
2002-09-03 14:01:38 +00:00
Sven Neumann
5e3a8626e0 applied patch from Raphael Quinet that fixes bug #92394.
2002-09-03  Sven Neumann  <sven@gimp.org>

	* plug-ins/gimpressionist/ppmtool.c (saveppm): applied patch from
	Raphael Quinet that fixes bug #92394.
2002-09-03 13:05:19 +00:00
Sven Neumann
0fe707b21f moved ChangeLog entries around 2002-09-03 08:46:07 +00:00
Manish Singh
e6545bd28e update location of automake 2002-08-30 22:30:09 +00:00
Manish Singh
5078e89f5a should not be in cvs 2002-08-30 19:36:47 +00:00
Sven Neumann
40ab46487f ca.po en_GB.po fi.po ga.po gl.po ko.po nl.po nn.po fixed fatal errors.
2002-08-28  Sven Neumann  <sven@gimp.org>

        * ca.po
        * en_GB.po
        * fi.po
        * ga.po
        * gl.po
        * ko.po
        * nl.po
        * nn.po
        * ro.po: fixed fatal errors.
2002-08-28 13:35:54 +00:00
Mel Boyce
7e35b53da5 Repaired help as per bug-report #75360. 2002-08-28 13:31:43 +00:00
Sven Neumann
46b7214cd4 gl.po fixed fatal errors.
2002-08-28  Sven Neumann  <sven@gimp.org>

        * gl.po
        * ro.po: fixed fatal errors.
2002-08-28 13:27:04 +00:00
Sven Neumann
53d1c58c42 fixed my fix 2002-08-28 13:23:36 +00:00
Sven Neumann
897b7bd443 fixed fatal error.
2002-08-28  Sven Neumann  <sven@gimp.org>

	* ga.po: fixed fatal error.
2002-08-28 13:21:44 +00:00
Sven Neumann
5465968401 ca.po de.po updated with the correct gimp-script-fu.pot. intltool-update
2002-08-28  Sven Neumann  <sven@gimp.org>

	* ca.po
	* de.po
	* fr.po: updated with the correct gimp-script-fu.pot.
	intltool-update doesn't work here, please use update.sh.

	* ga.po
	* ko.po
	* ro.po
	* sl.po: fixed fatal errors.
2002-08-28 13:18:25 +00:00
Sven Neumann
70efd76d06 applied fix for bug #84726.
2002-08-28  Sven Neumann  <sven@gimp.org>

	* plug-ins/imagemap/imap_cmd_move_sash.c (move_sash_command_new):
	applied fix for bug #84726.
2002-08-28 12:55:07 +00:00
Sven Neumann
642fd19990 check if the active drawable is a layer before using gimp_layer functions
2002-08-28  Sven Neumann  <sven@gimp.org>

        * plug-ins/common/rotate.c (rotate): check if the active drawable
        is a layer before using gimp_layer functions on it.
2002-08-28 12:50:06 +00:00
Christophe Merlet
f2c87f00ac Updated French translation. 2002-08-28 12:26:50 +00:00
Manish Singh
6481933d49 plug-ins/perl/Gimp/Lib.xs remove the #undef croak business, it breaks
2002-08-27  Manish Singh  <yosh@gimp.org>

        * plug-ins/perl/Gimp/Lib.xs
        * plug-ins/perl/Net/Net.xs: remove the #undef croak business, it
        breaks things

        * plug-ins/perl/Makefile.PL: require PDL 2.2.1 or higher, just to
        make sure croak is ok
2002-08-27 23:18:24 +00:00
Sven Neumann
2f167d0d6f changed dialog name as suggested in bug-report #88905 and did some code
2002-08-26  Sven Neumann  <sven@gimp.org>

        * plug-ins/sel2path/sel2path.c: changed dialog name as suggested
        in bug-report #88905 and did some code cleanup while I was at it.
2002-08-26 20:07:22 +00:00
Manish Singh
e3e3637af9 should not be in this branch 2002-08-26 08:38:47 +00:00
Sven Neumann
bc4bf3dc92 Updated german translations. 2002-08-24 13:26:56 +00:00
Duarte Loreto
5dc4c6f08b Updated Portuguese translation.
2002-08-24  Duarte Loreto <happyguy-pt@hotmail.com>

        * pt.po: Updated Portuguese translation.
2002-08-24 12:37:14 +00:00
Tor Lillqvist
0c0281b562 Don't export private functions. (Except _gimp_layer_copy which is used by
2002-08-21  Tor Lillqvist  <tml@iki.fi>

	* libgimp/gimp.def: Don't export private functions. (Except
	_gimp_layer_copy which is used by iwarp.) Add
	gimp_selection_invert.
2002-08-20 22:15:23 +00:00
Michael Natterer
f607ad2e86 always chain up so the widget gets realized correctly if check_valid is
2002-08-20  Michael Natterer  <mitch@gimp.org>

	* libgimp/gimpfileselection.c (gimp_file_selection_realize):
	always chain up so the widget gets realized correctly if
	check_valid is FALSE (fixes #90692).
2002-08-20 09:45:59 +00:00
Manish Singh
52a44998cc forgot to commit my changelog entry 2002-08-12 21:03:11 +00:00
Sven Neumann
9c09a0b864 plug-ins/common/gauss_iir.c avoid integer overflow in progress bar
2002-08-04  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/gauss_iir.c
	* plug-ins/common/gauss_rle.c: avoid integer overflow in progress
	bar calculation (bug #89825).
2002-08-04 14:17:57 +00:00
Manish Singh
6157af3acf make sure -lm is in $LIBS for the finite/isfinite test, fixes issues on
2002-08-03  Manish Singh  <yosh@gimp.org>

        * configure.in: make sure -lm is in $LIBS for the finite/isfinite
        test, fixes issues on newer FreeBSD
2002-08-04 03:41:45 +00:00
Sven Neumann
20540c0e83 use _(), not N_() so that the dialog title gets translated (bug #89093).
2002-07-26  Sven Neumann  <sven@gimp.org>

	* app/commands.c (select_shrink_cmd_callback): use _(), not N_() so
	that the dialog title gets translated (bug #89093).
2002-07-26 10:12:55 +00:00
Sven Neumann
74257e942e plug-ins/imagemap/imap_about.c plug-ins/imagemap/imap_circle.c
2002-07-09  Sven Neumann  <sven@gimp.org>

	* plug-ins/imagemap/imap_about.c
	* plug-ins/imagemap/imap_circle.c
	* plug-ins/imagemap/imap_main.c
	* plug-ins/imagemap/imap_object.c
	* plug-ins/imagemap/imap_polygon.c
	* plug-ins/imagemap/imap_rectangle.c: applied patches from Raphael
	Quinet that make the ImageMap plug-in produce output that is
	compatible with HTML up to 4.01 and XHTML 1.0 basically by using
	lowercase tags (bug #87687).
2002-07-09 21:15:20 +00:00
Sven Neumann
a15c0a087b really commit the change this time 2002-07-09 16:48:00 +00:00
Sven Neumann
7b1f4aba60 configure.in merged changes from HEAD branch (bug #83208).
2002-07-09  Sven Neumann  <sven@gimp.org>

	* configure.in
	* plug-ins/common/mail.c: merged changes from HEAD branch (bug #83208).
2002-07-09 16:35:07 +00:00
Sven Neumann
4d55e71ff9 fixed behaviour when run with GIMP_RUN_WITH_LAST_VALS. Based on a patch
2002-07-09  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/papertile.c: fixed behaviour when run with
	GIMP_RUN_WITH_LAST_VALS. Based on a patch from
	<thlsmith@iprimus.com.au> (bug #86868).

	* plug-ins/common/tileit.c: always initialize global variables,
	not only when being run interactively. Based on a patch from
	<thlsmith@iprimus.com.au> (bug #86637).

	* plug-ins/common/xpm.c: check the return value of
	XpmWriteFileFromXpmImage(). Patch from Raphael Quinet (bug #87588).

	* plug-ins/print/print.c: use g_strdup_printf() instead of asprintf().
	Patch from Raphael Quinet <quinet@gamers.org> (bug #87428).
2002-07-09 15:59:38 +00:00
Simon Budig
ee7355e12e Fixed the SVG so that the Adobe Plugin displays it correctly (the "fill"
2002-06-25  Simon Budig  <simon@gimp.org>

	* docs/Wilber.svg: Fixed the SVG so that the Adobe Plugin
	displays it correctly (the "fill" property defaults to black)
2002-06-26 13:15:20 +00:00
Sven Neumann
72dd47c15e merged fix from HEAD branch: use g_free() to release memory that has been
2002-06-25  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/pix.c: merged fix from HEAD branch: use g_free()
	to release memory that has been allocated using g_malloc().
2002-06-25 08:40:32 +00:00
Marco Wessel
c6038e8790 Fix reverse horizontal and vertical blurring, as in HEAD.
2002-06-24  Marco Wessel  <marco@phoenix.uzaynet.nl>

        * plug-ins/script-fu/scripts/tileblur.scm: Fix reverse horizontal
	and vertical blurring, as in HEAD.
2002-06-24 09:41:54 +00:00
Pablo Saratxaga
4a067b8b03 updated Catalan files 2002-06-18 11:53:13 +00:00
Sven Neumann
8da6df1a0d added helpbrowser to the DISTMAKE hack.
2002-06-17  Sven Neumann  <sven@gimp.org>

	* configure.in: added helpbrowser to the DISTMAKE hack.

	* plug-ins/script-fu/script-fu-server.c (read_from_client): retry
	if read() was interrupted and free the allocated memory if read()
	fails. Fixes bug #85573 (tiny leak in script-fu-server).
2002-06-17 12:31:04 +00:00
Sven Neumann
5cb614528e applied patch from <ccmich@cigital.com> that fixes internal handling of
2002-06-13  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/unsharp.c: applied patch from <ccmich@cigital.com>
	that fixes internal handling of the blur radius and allows it to be
	smaller than 1.0 (bug #83420).
2002-06-13 12:36:23 +00:00
Sven Neumann
58c90a3acb allocate shared memory segments with permissions 0600 instead of making
2002-06-13  Sven Neumann  <sven@gimp.org>

	* app/plug_in.c (plug_in_init_shm): allocate shared memory
	segments with permissions 0600 instead of making them accessible
	by everyone.

	* configure.in: GIMP-1.2.4, interface age, binary age 4.
	Changed the permissions in the check for shared memory as well.
2002-06-13 11:58:53 +00:00
Sven Neumann
899bd955d5 use variable $(XJT) for xjt so that we don't attempt to build it if
2002-06-07  Sven Neumann  <sven@gimp.org>

	* plug-ins/Makefile.am (SUBDIRS): use variable $(XJT) for xjt so that
	we don't attempt to build it if libjpeg isn't available.
2002-06-07 12:13:49 +00:00
Sven Neumann
6ecf07ed11 fixed typo (bug #82499).
2002-05-27  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/checkerboard.c: fixed typo (bug #82499).
2002-05-27 09:57:32 +00:00
Kwok-Koon Cheung
28d5de44e2 trivial addition 2002-05-26 21:33:57 +00:00
Stanislav Visnovsky
4e48128fb1 Updated Slovak translation from Zdenko Podobny <zdpo@mailbox.sk>.
2002-05-23  Stanislav Visnovsky  <visnovsky@nenya.ms.mff.cuni.cz>

        * sk.po: Updated Slovak translation from Zdenko Podobny <zdpo@mailbox.sk>.
2002-05-23 13:30:11 +00:00
Sven Neumann
bc5dda2e18 don't allow the splash screen to be closed. Fixes bug #81962.
2002-05-16  Sven Neumann  <sven@gimp.org>

	* app/app_procs.c: don't allow the splash screen to be closed.
	Fixes bug #81962.
2002-05-16 13:39:33 +00:00
Simon Budig
34df25bc00 Backported from HEAD: Made the pagecurl plugin automatically add an alpha
2002-05-16  Simon Budig  <simon@gimp.org>

        * plug-ins/pagecurl/pagecurl.c: Backported from HEAD:
        Made the pagecurl plugin automatically add an alpha
        channel. Fixes #81611.
2002-05-16 12:05:12 +00:00
Sven Neumann
d87da56df5 reverted the last change and applied a patch from Peter Kirchgessner
2002-05-14  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/ps.c: reverted the last change and applied a patch
	from Peter Kirchgessner instead (closes reopened bug #81606).
2002-05-14 20:06:11 +00:00
Sven Neumann
3a6c79c778 added the bug number to the ChangeLog entry 2002-05-14 17:57:13 +00:00
Dave Neary
8de537d053 Fix to have the preview and actual render seed values match. "Run with
2002-05-14  Dave Neary  <bolsh@gimp.org>

        * plug-ins/common/plasma.c: Fix to have the preview and
        actual render seed values match. "Run with last values"
        still generates a new image, if "Use time as seed" is
        set, though.
2002-05-14 17:14:14 +00:00
Dave Neary
efa2081a71 Fix to get greyscale previews for greyscale images. Closes bug #81730.
2002-05-14  Dave Neary  <bolsh@gimp.org>

        * plug-ins/common/plasma.c: Fix to get greyscale previews
        for greyscale images. Closes bug #81730.
2002-05-14 13:58:03 +00:00
Sven Neumann
d6ad19ac97 applied a patch from Raphael Quinet that fixes bug #81606 (special-case
2002-05-14  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/ps.c: applied a patch from Raphael Quinet that
        fixes bug #81606 (special-case recent Illustrator EPS brain damage).
2002-05-14 12:35:46 +00:00
Sven Neumann
8a24fdd6d1 don't try to access out of bounds pixel data. Fixes bug #81345.
2002-05-11  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/convmatrix.c: don't try to access out of bounds
	pixel data. Fixes bug #81345.
2002-05-11 10:20:45 +00:00
Sven Neumann
389e02deae updated german translation.
2002-05-11  Sven Neumann  <sven@gimp.org>

	* de.po: updated german translation.
2002-05-11 10:00:06 +00:00
Duarte Loreto
7599928db0 Updated Portuguese translation.
2002-05-10  Duarte Loreto <happyguy_pt@hotmail.com>

        * pt.po: Updated Portuguese translation.
2002-05-10 02:21:10 +00:00
Christian Rose
3a69673271 Updated Swedish translation.
2002-05-09  Christian Rose  <menthos@menthos.com>

	* sv.po: Updated Swedish translation.
2002-05-08 23:01:41 +00:00
Manish Singh
07e192e52d the correct switch is --disable-print, not --without-gimpprint. Fix not
2002-05-08  Manish Singh  <yosh@gimp.org>

        * configure.in: the correct switch is --disable-print, not
        --without-gimpprint. Fix not found error message, and add a pointer
        to the gimp-print homepage.
2002-05-08 21:26:16 +00:00
Sven Neumann
52fed3ef97 updated german translation (jeeez, those gimp-print people are crazy!!) 2002-05-08 13:53:47 +00:00
Sven Neumann
8089447e32 plug-ins/print/gimp_main_window.c use g_malloc instead of malloc.
2002-05-08  Sven Neumann  <sven@gimp.org>

	* plug-ins/print/gimp_main_window.c
	* plug-ins/print/gimp_color_window.c: use g_malloc instead of malloc.
2002-05-08 11:33:11 +00:00
Andraz Tori
67c089cef1 changed translation for the name of the tips file 2002-05-08 10:33:25 +00:00
Sven Neumann
34174541bf INSTALL depend on libgimpprint >= 4.2.0 for the print plug-in. You need to
2002-05-08  Sven Neumann  <sven@gimp.org>

        * INSTALL
        * configure.in: depend on libgimpprint >= 4.2.0 for the print plug-in.
        You need to --disable-print to build w/o print support (bug #80941).

        * plug-ins/Makefile.am: build print plug-in conditionally.

        * plug-ins/print/Makefile.am
        * plug-ins/print/gimp_color_window.c
        * plug-ins/print/gimp_main_window.c
        * plug-ins/print/print-image-gimp.c
        * plug-ins/print/print.c
        * plug-ins/print/print_gimp.h: the print plug-in from the
        gimpprint 4.2.1 release with some small changes to build inside the
        gimp tree.

        * plug-ins/print/README
        * plug-ins/print/RELNOTES
        * plug-ins/print/escputil-1.2.1.in
        * plug-ins/print/escputil.c
        * plug-ins/print/print-canon.c
        * plug-ins/print/print-dither.c
        * plug-ins/print/print-escp2.c
        * plug-ins/print/print-intl.h
        * plug-ins/print/print-pcl.c
        * plug-ins/print/print-printers.c
        * plug-ins/print/print-ps.c
        * plug-ins/print/print-util.c
        * plug-ins/print/print-weave.c
        * plug-ins/print/print.h
        * plug-ins/print/quickmatrix257.h
        * plug-ins/print/ran.367.179.h: removed.

        * gimp.spec.in: updated.
2002-05-08 09:26:26 +00:00
Sven Neumann
a297ab1019 reformat the comment for translators in such a way that the stupid gettext
2002-05-07  Sven Neumann  <sven@gimp.org>

	* app/tips_dialog.c: reformat the comment for translators in such
	a way that the stupid gettext tools make it end up in the po files.
2002-05-07 15:30:13 +00:00
Sven Neumann
9dd2de01ba Added Slovenian translation from miha.tomsic@guest.arnes.si. 2002-05-07 14:44:22 +00:00
Sven Neumann
7ab7d68c00 removed moved file from stable branch 2002-05-07 11:55:51 +00:00
Sven Neumann
334c5b5cf7 enabled some code that was supposed to tell the user to turn of
2002-05-06  Sven Neumann  <sven@gimp.org>

	* app/text_tool.c (text_render): enabled some code that was supposed
	to tell the user to turn of antialiasing if font loading failed. This
	message has been around for a while but wasn't used in the right place.
2002-05-06 10:01:40 +00:00
Sven Neumann
2ca1b3376f removing moved files from the stable branch 2002-05-06 09:44:10 +00:00
SHIRASAKI Yasuhiro
11afe6bf39 updated on checkerboard plugin related message.
suggested by gotou you.

-- yasuhiro
2002-05-05 08:46:23 +00:00
SHIRASAKI Yasuhiro
23ae5299a6 updated japanese translation.
-- yasuhiro
2002-05-05 08:25:39 +00:00
Sven Neumann
014d1f06bb added an arrow_keys_func to allow to move the selection mask or a floating
2002-05-03  Sven Neumann  <sven@gimp.org>

	* app/rect_select.[ch]: added an arrow_keys_func to allow to move
	the selection mask or a floating selection using the arrow keys in
	order to be more consistent with the Move tool (bug #78731).

	* app/ellipse_select.c
	* app/free_select.c
	* app/fuzzy_select.c: use the same new arrow_keys_func.
2002-05-03 17:14:11 +00:00
Sven Neumann
538e60904d plug-ins/common/borderaverage.c plug-ins/common/convmatrix.c
2002-05-03  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/borderaverage.c
	* plug-ins/common/convmatrix.c
	* plug-ins/common/nlfilt.c
	* plug-ins/common/papertile.c
	* plug-ins/common/vpropagate.c: applied a patch from iccii@hotmail.com
	that adds missing calls to gimp_tile_cache_ntiles() to speed up the
	plug-ins considerably (bug #78358).
2002-05-03 16:05:11 +00:00
Sven Neumann
8f4324040f clamp the area displayed in the preview to the image dimensions. Fixes bug
2002-05-02  Sven Neumann  <sven@gimp.org>

	* plug-ins/rcm/rcm_misc.c (rcm_reduce_image): clamp the area displayed
	in the preview to the image dimensions. Fixes bug #80561.
2002-05-02 17:14:04 +00:00
Sven Neumann
f4d75f216b fixed an incomplete translation spotted by Karl Eichwalder.
2002-04-28  Sven Neumann  <sven@gimp.org>

	* de.po: fixed an incomplete translation spotted by Karl Eichwalder.
2002-04-27 23:45:29 +00:00
Nick Lamb /GIMP
515759315c clip TIFF sample values rather than wrapping for pre-multiplied
alpha transparency.
2002-04-21 02:24:20 +00:00
Sven Neumann
54279ba84d tools/pdbgen/pdb/color.pdb fixed wrong range check for number of points.
2002-04-16  Sven Neumann  <sven@gimp.org>

	* tools/pdbgen/pdb/color.pdb
	* app/color_cmds.c (curves_spline_invoker): fixed wrong range check
	for number of points. Bug #78877 spotted by regisr@regix.com.
2002-04-16 20:19:22 +00:00
Ole Laursen
f30f0db023 Fixed a couple of bugs in Danish translation.
2002-04-14  Ole Laursen  <olau@hardworking.dk>

	* da.po: Fixed a couple of bugs in Danish translation.
2002-04-14 17:42:58 +00:00
Ole Laursen
8c4afcaff0 Updated Danish translation.
2002-04-14  Ole Laursen  <olau@hardworking.dk>

	* da.po: Updated Danish translation.
2002-04-14 17:41:09 +00:00
Sven Neumann
731053faa4 don't set gtk_quit_add_destroy() on fileload and filesave widgets so they
2002-04-12  Sven Neumann  <sven@gimp.org>

	* app/fileops.c: don't set gtk_quit_add_destroy() on fileload and
	filesave widgets so they don't get destroyed early if the first main
	loop started is a temporary one created for loading images passed on
	the command line. Fixes bug #51781.

	* app/gimpcontext.c (gimp_context_get_standard): same here.
2002-04-12 17:45:13 +00:00
Manish Singh
7a110192b1 eat the "Resolving foo" line so it works with newer wgets.
2002-04-10  Manish Singh  <yosh@gimp.org>

        * plug-ins/common/url.c: eat the "Resolving foo" line so it works with
        newer wgets.
2002-04-10 23:00:45 +00:00
Stanislav Brabec
538cb33961 czech translation update 2002-04-10 17:40:12 +00:00
Sven Neumann
f1cd988bca applied a patch from Peter Kirchgessner to recognize DOS EPS binary files
2002-04-09  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/eps.c: applied a patch from Peter Kirchgessner to
	recognize DOS EPS binary files (bug #75667).
2002-04-09 10:47:01 +00:00
Sven Neumann
2aeebc1473 updated german translation 2002-04-06 14:00:26 +00:00
Sven Neumann
1461ac0096 silently return if there's no active drawable. silently return if
2002-04-06  Sven Neumann  <sven@gimp.org>

	* app/bezier_select.c (bezier_stroke): silently return if there's no
	active drawable.
	* app/paths_dialog.c
	(paths_dialog_path_to_sel_callback, paths_dialog_sel_to_path_callback):
	silently return if !paths_dialog->gimage.
	(paths_dialog_set_menu_sensitivity): set buttons insensitive if no
	image is present. Fixes segfault reported by Massimiliano Benini.

	* app/crop.c: always update the info dialog when recalculating the
	crop area.

	* app/fileops.c (file_open_with_proc): don't try to add a menu entry
	if gimp was started with --no-interface.

	* plug-ins/rcm/rcm_dialog.c:
	* plug-ins/rcm/rcm_misc.c (rcm_reduce_image): take the drawable offsets
	into account when calculating the preview. Fixes bug #67018.
2002-04-06 13:59:17 +00:00
Chyla Zbigniew
65cdfec385 Updated Polish translation by GNOME PL Team <translators@gnome.pl> 2002-03-29 12:14:10 +00:00
Rodrigo Sancho Senosiain
faeb705ec1 Updated spanish translation 2002-03-27 21:02:47 +00:00
Sven Neumann
b69d5f0f14 removed a call to g_slist_next() which shouldn't have been there. Thanks
2002-03-25  Sven Neumann  <sven@gimp.org>

	* app/fileops.c (file_open_genbutton_callback): removed a call to
	g_slist_next() which shouldn't have been there. Thanks to Oliver Rapp
	and Nem W Schlecht for spotting this problem.
2002-03-25 11:35:49 +00:00
Tor Lillqvist
c9d7ea7e9d Remove unnecessary empty assignment to INTLLIBS from inside "if OS_WIN32".
2002-03-21  Tor Lillqvist  <tml@iki.fi>

	* app/Makefile.am: Remove unnecessary empty assignment to INTLLIBS
	from inside "if OS_WIN32". Don't do the symlinking of gimp-1.2
	to gimp on Win32, and not the corresponding rm on uninstall
	either. Remove completely the already-commented-out makefile.mingw
	lines.
2002-03-21 20:49:06 +00:00
Sven Neumann
698a79fe8a applied a patch from Wolfgang Hofer <hof@gimp.org> that fixes a problem
2002-03-20  Sven Neumann  <sven@gimp.org>

	* plug-ins/gap/gap_decode_xanim.c: applied a patch from Wolfgang Hofer
	<hof@gimp.org> that fixes a problem when calling xanim.
2002-03-20 09:29:45 +00:00
Christophe Merlet
c82511b816 Updated some french translator's email. 2002-03-15 08:21:18 +00:00
Manish Singh
792dd1d78d add missing support for anchoring a selection
2002-03-14  Manish Singh  <yosh@gimp.org>

        * app/fuzzy_select.c: add missing support for anchoring a selection
2002-03-15 07:58:26 +00:00
Manish Singh
65c7a1336e shut up cvs 2002-03-15 01:51:12 +00:00
Stanislav Visnovsky
8f967dccf8 Fixed reference to gimp_tips.sk.txt.
2002-03-13  Stanislav Visnovsky  <visnovsky@nenya.ms.mff.cuni.cz>

        * sk.po: Fixed reference to gimp_tips.sk.txt.
2002-03-13 13:50:06 +00:00
Stanislav Visnovsky
e19a012a69 Added Slovak translation by Zdenko Podobny <zdpo@mailbox.sk>. added
2002-03-13  Stanislav Visnovsky  <visnovsky@nenya.ms.mff.cuni.cz>

        * gimp_tips.sk.txt: Added Slovak translation by Zdenko Podobny <zdpo@mailbox.sk>.
	* Makefile.am: added gimp_tips.sk.txt to tipsdata_DATA
	* Makefile.mingw: added rule for .sk.txt
2002-03-13 12:38:11 +00:00
Duarte Loreto
a83e062051 Fixed reference to gimp_tips.pt.txt
2002-03-09  Duarte Loreto <happyguy_pt@hotmail.com>

        * pt.po: Fixed reference to gimp_tips.pt.txt
2002-03-09 22:19:19 +00:00
Manish Singh
189afec0f5 modify the below to match the behavior of 1.3
2002-03-09  Manish Singh  <yosh@gimp.org>

        * configure.in: modify the below to match the behavior of 1.3
2002-03-09 20:05:48 +00:00
Manish Singh
a16167b24a make JPEG and PNG support required, unless the user explicitly disables
2002-03-09  Manish Singh  <yosh@gimp.org>

        * configure.in: make JPEG and PNG support required, unless the user
        explicitly disables them.
2002-03-09 19:42:30 +00:00
Sven Neumann
3ac1680eb8 added a comment for translators to explain how to deal with
2002-03-08  Sven Neumann  <sven@gimp.org>

	* app/tips_dialog.c (tips_dialog_create): added a comment for
	translators to explain how to deal with "gimp_tips.txt".
2002-03-08 08:31:58 +00:00
Duarte Loreto
7dd738e16f Added Portuguese locale (pt) to ALL_LINGUAS.
2002-03-07  Duarte Loreto <happyguy_pt@hotmail.com>

        * configure.in: Added Portuguese locale (pt) to ALL_LINGUAS.
2002-03-07 01:13:09 +00:00
Duarte Loreto
811afe7973 Added Portuguese translation by filipe Maia <fmaia@gmx.net>
2002-03-07  Duarte Loreto <happyguy_pt@hotmail.com>

        * pt.po: Added Portuguese translation by filipe Maia <fmaia@gmx.net>
2002-03-07 01:08:21 +00:00
Duarte Loreto
e45a7235ed Finnished Portuguese translation.
2002-03-06  Duarte Loreto <happyguy_pt@hotmail.com>

        * tips/gimp_tips.pt.txt: Finnished Portuguese translation.
2002-03-06 01:01:10 +00:00
Duarte Loreto
1b10b37b33 Updated Portuguese translation.
2002-03-05  Duarte Loreto <happyguy_pt@hotmail.com>

        * tips/gimp_tips.pt.txt: Updated Portuguese translation.
2002-03-05 01:29:43 +00:00
Vincent van Adrighem
55268021e7 nl.po Dutch translations updated by Branko Collin.
2002-03-04 Vincent van Adrighem <V.vanAdrighem@dirck.mine.nu>
* nl.po Dutch translations updated by Branko Collin.
2002-03-04 13:09:01 +00:00
Duarte Loreto
ff3bef210f Added Portuguese translation.
2002-03-02  Duarte Loreto <happyguy_pt@hotmail.com>

        * tips/gimp_tips.pt.txt: Added Portuguese translation.
2002-03-02 01:48:32 +00:00
Kwok-Koon Cheung
7cda290955 Updated traditional Chinese translation. 2002-03-01 09:37:00 +00:00
Duarte Loreto
638c88b725 Re-added misteriously vanished Portuguese translation.
2002-03-01  Duarte Loreto <happyguy_pt@hotmail.com>

        * pt.po: Re-added misteriously vanished Portuguese translation.
2002-03-01 02:40:20 +00:00
Duarte Loreto
b468678305 Updated Portuguese translation.
2002-03-01  Duarte Loreto <happyguy_pt@hotmail.com>

        * pt.po: Updated Portuguese translation.
2002-03-01 02:22:37 +00:00
Stanislav Visnovsky
dd0c44d0f3 Updated Slovak translation from Zdenko Podobny <zdpo@mailbox.sk>.
2002-02-28  Stanislav Visnovsky  <visnovsky@nenya.ms.mff.cuni.cz>

        * sk.po: Updated Slovak translation from Zdenko Podobny <zdpo@mailbox.sk>.
2002-02-28 10:07:28 +00:00
Duarte Loreto
a1c5f15f39 Updated Portuguese translation
2002-02-28  Duarte Loreto <happyguy_pt@hotmail.com>

        * pt.po: Updated Portuguese translation
2002-02-28 01:33:42 +00:00
Christophe Merlet
05eb7425e0 Updated gimp-perl french translation. 2002-02-27 08:44:52 +00:00
Sven Neumann
19a59e14e3 fixed typo (bug #72673).
2002-02-26  Sven Neumann  <sven@gimp.org>

	* plug-ins/script-fu/interp_slib.c: fixed typo (bug #72673).
2002-02-26 14:25:00 +00:00
Manish Singh
37ad4dfbb0 remove from stable branch 2002-02-22 19:05:29 +00:00
Christophe Merlet
f99ea9fd9c Updated French translation. 2002-02-18 19:25:16 +00:00
Duarte Loreto
a1337a01ac Added Portuguese translation by Filipe Maia <fmaia@gmx.net>
2002-02-17  Duarte Loreto <happyguy_pt@hotmail.com>

        * pt.po: Added Portuguese translation by Filipe Maia <fmaia@gmx.net>
2002-02-17 23:15:33 +00:00
Sven Neumann
5f0e364eed use g_message() (bug #71795).
2002-02-17  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/zealouscrop.c: use g_message() (bug #71795).
2002-02-17 21:37:02 +00:00
Stanislav Brabec
0d2243de7d czech translation update 2002-02-15 23:22:48 +00:00
Tor Lillqvist
07b6a67e31 Remove gimprc.win32 from here, too.
2002-02-15  Tor Lillqvist  <tml@iki.fi>

	* Makefile.am: Remove gimprc.win32 from here, too.
2002-02-15 10:07:02 +00:00
Tor Lillqvist
18ef835483 Remove (again!). The same gimprc as on Unix is used.
2002-02-15  Tor Lillqvist  <tml@iki.fi>

	* gimprc.win32: Remove (again!). The same gimprc as on Unix is used.
2002-02-15 10:02:09 +00:00
Sven Neumann
055fafb325 Fixed broken translation. 2002-02-14 14:50:14 +00:00
Stanislav Visnovsky
2d2d741557 Updated Slovak translation from Zdenko Podobny <zdpo@mailbox.sk>.
2002-02-14  Stanislav Visnovsky  <visnovsky@nenya.ms.mff.cuni.cz>

        * sk.po: Updated Slovak translation from Zdenko Podobny <zdpo@mailbox.sk>.
2002-02-14 11:42:39 +00:00
Sven Neumann
f88b9bfbc8 updated german translation 2002-02-13 15:21:56 +00:00
Tor Lillqvist
81c1b7cc7d Add a couple of missing entry points.
2002-02-13  Tor Lillqvist  <tml@iki.fi>

	* libgimp/gimp.def: Add a couple of missing entry points.
2002-02-13 07:10:16 +00:00
Tor Lillqvist
0255fbe9e9 Don't need any -lm on Win32. Remove the already commented-out
2002-02-13  Tor Lillqvist  <tml@iki.fi>

	* libgimp/Makefile.am: Don't need any -lm on Win32. Remove the
	already commented-out makefile.mingw rule.
2002-02-13 07:08:37 +00:00
Tor Lillqvist
4e5dd020c7 Set message_handler to MESSAGE_BOX earlier on Win32 (where GIMP's stderr
2002-02-13  Tor Lillqvist  <tml@iki.fi>

	* app/app_procs.c (app_init): Set message_handler to MESSAGE_BOX
	earlier on Win32 (where GIMP's stderr usually isn't visible).
	(toast_old_temp_files): Put also the pid variable that is unused
	on Win32 inside the #ifndef.
2002-02-13 07:05:14 +00:00
Michael Natterer
b33943773b default to "(Unnamed Buffer)" instead of inserting buffers with no name at
2002-02-12  Michael Natterer  <mitch@gimp.org>

	* app/global_edit.c: default to "(Unnamed Buffer)" instead of
	inserting buffers with no name at all into the named_buffers
	list (partly fixes #62592). The unique name stuff is something
	for 1.3 however...
2002-02-12 17:02:08 +00:00
Michael Natterer
99c8e67f65 fixed insane ratio spinbutton acceleration (#63741) by setting the
2002-02-12  Michael Natterer  <mitch@gimp.org>

	* app/resize.c: fixed insane ratio spinbutton acceleration
	(#63741) by setting the spinbutton's climb_rate to a small value
	(not by changing the adjustment's page_size as suggested).
2002-02-12 16:17:44 +00:00
Michael Natterer
b726d7bbc7 Removed cruft left over from RCS file copying. 2002-02-12 14:59:14 +00:00
Manish Singh
1ee136bd1d 1.2.3 stuff (after broken pipe) 2002-02-12 00:19:20 +00:00
Manish Singh
8c039fcdbd 1.2.3 stuff 2002-02-11 23:59:50 +00:00
Stanislav Brabec
8f07bf7316 Install again xjt plugin, at least if not OS_WIN32.
2002-02-11  Stanislav Brabec  <utx@penguin.cz>

    * plug-ins/Makefile.am: Install again xjt plugin, at least if not
    OS_WIN32.
2002-02-11 20:58:35 +00:00
Sven Neumann
020ad23ef1 applied a patch from Raphael Quinet <quinet@gamers.org> that allows to
2002-02-11  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/jpeg.c: applied a patch from Raphael Quinet
	<quinet@gamers.org> that allows to open JPEG images with CMYK
	colors (bug #69127) doing the conversion in libjepg.
2002-02-11 17:27:25 +00:00
Duarte Loreto
0c89fcc279 Revision over Portuguese translation.
2002-02-10  Duarte Loreto <happyguy_pt@hotmail.com>

        * pt.po: Revision over Portuguese translation.
2002-02-10 01:50:40 +00:00
Sven Neumann
2d91f67781 applied a patch from Raphael Quinet <quinet@gamers.org> that makes the
2002-02-09  Sven Neumann  <sven@gimp.org>

        * plug-ins/common/gradmap.c: applied a patch from Raphael Quinet
        <quinet@gamers.org> that makes the Gradient Map plug-in preserve
        the source alpha channel instead of resetting it (bug #70964).
2002-02-09 15:09:56 +00:00
Stanislav Visnovsky
f97c12dd95 Updated Slovak translation from Zdenko Podobny <zdpo@mailbox.sk>.
2002-02-07  Stanislav Visnovsky  <visnovsky@nenya.ms.mff.cuni.cz>

        * sk.po: Updated Slovak translation from Zdenko Podobny <zdpo@mailbox.sk>.
2002-02-07 09:47:03 +00:00
Sven Neumann
b01290d52c removed compiler warning.
2002-02-06  Sven Neumann  <sven@gimp.org>

	* libgimp/gimpenv.c (gimp_directory): removed compiler warning.
2002-02-06 15:57:46 +00:00
Duarte Loreto
1f39bbcead Added Portuguese translation
2002-02-04  Duarte Loreto <happyguy_pt@hotmail.com>

        * pt.po: Added Portuguese translation
2002-02-05 00:22:11 +00:00
Manish Singh
e2f5dbd2d3 readd on this branch 2002-02-04 03:22:27 +00:00
Sven Neumann
76fa2dfacf only use the first 256 colors from the palette to prevent us from crashing
2002-02-03  Sven Neumann  <sven@gimp.org>

	* app/convert.c (custompal_pass1): only use the first 256 colors
	from the palette to prevent us from crashing if convert_indexed()
	is called with a custom palette that has more than 256 entries
	(bug #70344).  The real fix would be to allow to dither to more
	than 256 colors but that's left for 1.3.
2002-02-03 18:56:40 +00:00
Sven Neumann
af981ae9e3 applied a patch from iccii@hotmail.com that corrects PDB registration of
2002-02-03  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/smooth_palette.c: applied a patch from
	iccii@hotmail.com that corrects PDB registration of return values.
2002-02-03 17:34:59 +00:00
Sven Neumann
b14a447852 don't redefine min. Thanks to Jeff Trefftzs <trefftzs@tcsn.net> for
2002-02-03  Sven Neumann  <sven@gimp.org>

	* plug-ins/script-fu/scripts/frosty-logo.scm: don't redefine min.
	Thanks to Jeff Trefftzs <trefftzs@tcsn.net> for spotting this.
2002-02-03 14:43:27 +00:00
PST 2002 Manish Singh
3a172e621e Makefile.am app/Makefile.am plug-ins/print/Makefile.am automake quirk. the
Sat Feb  2 23:55:50 PST 2002 Manish Singh <yosh@gimp.org>

        * Makefile.am
        * app/Makefile.am
        * plug-ins/print/Makefile.am
        * tools/Makefile.am: automake quirk. the -hook and -local targets
        always need to exist, and must not be in the conditional.
2002-02-03 07:58:06 +00:00
PST 2002 Manish Singh
b2992b2cc1 oops, guard the manpage stuff in DEFAULT_BINARY too
Sat Feb  2 22:50:00 PST 2002 Manish Singh <yosh@gimp.org>

        * Makefile.am: oops, guard the manpage stuff in DEFAULT_BINARY too
2002-02-03 06:51:13 +00:00
PST 2002 Manish Singh
1f3558e6d7 gimp-remote is optional, so make the link only conditionally.
Sat Feb  2 22:07:27 PST 2002 Manish Singh <yosh@gimp.org>

        * tools/Makefile.am: gimp-remote is optional, so make the link only
        conditionally.
2002-02-03 06:08:20 +00:00
PST 2002 Manish Singh
9c7fc6cdc3 sync with glib CVS (gar)
Sat Feb  2 19:23:14 PST 2002 Manish Singh <yosh@gimp.org>

        * acinclude.m4: sync with glib CVS (gar)

        * configure.in
        * Makefile.am
        * app/Makefile.am
        * plug-ins/print/Makefile.am
        * tools/Makefile.am
        * (the various manpages): versioned the binaries and manpages.
        Added an --enable-default-binary switch to configure to make
        symlinks for unversioned things (defaults to yes for 1.2)
2002-02-03 04:23:41 +00:00
Kjartan Maraas
7146efc0e7 Updated Norwegian (bokml) translation.
2002-01-31  Kjartan Maraas  <kmaraas@gnome.org>

	* no.po: Updated Norwegian (bokml) translation.
2002-01-31 23:10:49 +00:00
Simon Budig
65bf3bd825 register as "plug_in_rotate_colormap" instead of
2002-01-31  Simon Budig  <simon@gimp.org>

        * plug-ins/rcm/rcm.c: register as "plug_in_rotate_colormap"
        instead of "plug-in-rotate-colormap". This fixes the usage
        in gimp-python (despite the fact that there is no PDB
        interface).
2002-01-31 19:15:29 +00:00
Christophe Merlet
6b2419fb9a Updated French translation. 2002-01-31 13:06:30 +00:00
Stanislav Visnovsky
93f3eb5320 Updated Slovak translations from Zdenko Podobny <zdpo@mailbox.sk>.
2002-01-31  Stanislav Visnovsky  <visnovsky@nenya.ms.mff.cuni.cz>

        * po/sk.po:
        * po-libgimp/sk.po:
        * plugins/perl/po/sk.po:
           Updated Slovak translations from Zdenko Podobny <zdpo@mailbox.sk>.
2002-01-31 11:33:00 +00:00
Nick Lamb /GIMP
5088ff3766 Fix flipped images for the RGBA fallback case in TIFF (bug #69129). 2002-01-24 12:10:11 +00:00
Nick Lamb /GIMP
53281c9c8c Applied variant of Russell Valentine's patch for bug #53278 to TGA save code 2002-01-24 07:42:10 +00:00
Stanislav Brabec
77453a5a98 czech translation update 2002-01-20 22:45:25 +00:00
Sven Neumann
86f44c364c added macros defined in pkg.m4 and glib-gettext.m4 so people don't need to
2002-01-20  Sven Neumann  <sven@gimp.org>

	* acinclude.m4: added macros defined in pkg.m4 and glib-gettext.m4
	so people don't need to have glib-2.0 and pkg-config installed in
	order to run aclocal and autoconf.

	* configure.in: moved AC_PROG_CC before AM_PROG_LIBTOOL to avoid a
	warning.
2002-01-20 15:09:19 +00:00
Manish Singh
db10a4289a remove note about CVS, there really isn't any reason to track CVS gtk+ 1.2
* HACKING: remove note about CVS, there really isn't any reason to track CVS
gtk+ 1.2 anymore
2002-01-14 19:01:11 +00:00
Sven Neumann
90e0989985 corrected logic for saving images without an additional mask file. The
2002-01-07  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/xbm.c: corrected logic for saving images without an
	additional mask file. The plug-in used to return an execution error
	even though it saved the xbm successfully.
2002-01-07 18:42:08 +00:00
Tor Lillqvist
a12383c42a Pass also a flag to build a windowing application (not a console one).
2002-01-01  Tor Lillqvist  <tml@iki.fi>

	* gimptool-win32.c.in (do_build_2): Pass also a flag to build
	a windowing application (not a console one).
2002-01-01 14:49:56 +00:00
Tor Lillqvist
8880d626c8 Improve error handling in case minigzip.exe is not installed (bug# 67135).
2001-12-31  Tor Lillqvist  <tml@iki.fi>

	* plug-ins/common/gz.c (save_image, load_image): (Win32) Improve
	error handling in case minigzip.exe is not installed (bug# 67135).

	* gimp-zip.in: Include minizip.exe (for the gz plug-in) (bug# 67135).
	Put gif plug-in in a separate zipfile.
2001-12-31 15:43:29 +00:00
Tor Lillqvist
19d7f282c1 When no home directory has been found, and we use a user-specific
2001-12-31  Tor Lillqvist  <tml@iki.fi>

	* libgimp/gimpenv.c (gimp_directory): (Win32) When no home
	directory has been found, and we use a user-specific directory in
	the GIMP installation directory: If the user name contains
	characters that are illegal in file (or folder) names, replace
	those characters with underscores (bug# 64491).

	Actually also some legal, but odd, characters get replaced.
	Hmm. There are problems here related to i18n. In multi-byte
	locales g_get_user_name() presumably, at least currently, returns
	a multi-byte string encoded in some Windows multi-byte code page,
	and the code here will think that some or most characters in it
	are "odd", and replace them with underscores. This will cause
	different user names in Japanese, for instance, that happen to
	have the same length, to be convered to the same string of
	underscores.)
2001-12-31 10:15:16 +00:00
Chyla Zbigniew
fc4582b301 Updated Polish translation by GNOME PL Team <translators@gnome.pl> 2001-12-30 20:11:41 +00:00
Simos Xenitellis
872a6b52f1 Update of Greek translation 2001-12-30 14:37:56 +00:00
Tor Lillqvist
c8999cbb35 Check help_data being-non-NULL before dereferencing it. (Bug# 65789)
2001-12-30  Tor Lillqvist  <tml@iki.fi>

	* app/gimphelp.c (gimp_help_netscape): Check help_data
	being-non-NULL before dereferencing it. (Bug# 65789)
	(gimp_idle_help): If the internal browser wasn't found, check if
	idle_help->help_data is NULL, and in that case put
	"introduction.html" there, before calling gimp_help_netscape.
2001-12-30 10:03:01 +00:00
Sven Neumann
9a005e9c46 fixed rank and increased spacing.
2001-12-29  Sven Neumann  <sven@gimp.org>

	* data/brushes/vine.gih: fixed rank and increased spacing.
2001-12-29 18:56:09 +00:00
Sven Neumann
8c2b6d3e9b fixed a stupid bug I've introduced when fixing #66003.
2001-12-28  Sven Neumann  <sven@gimp.org>

	* app/scan_convert.c (scan_converter_to_channel): fixed a stupid bug
	I've introduced when fixing #66003.
2001-12-28 18:27:09 +00:00
Simos Xenitellis
a3f951ef24 Added Green support and initial translations 2001-12-27 17:33:00 +00:00
Ole Laursen
eccb637fce Unfuzzyfied a string in Danish translation.
2001-12-27  Ole Laursen  <olau@hardworking.dk>

	* da.po: Unfuzzyfied a string in Danish translation.
2001-12-27 15:47:49 +00:00
Sven Neumann
3f31716cf2 removed portuguese (pt) again until all po files are added.
2001-12-21  Sven Neumann  <sven@gimp.org>

	* configure.in (ALL_LINGUAS): removed portuguese (pt) again until
	all po files are added.
2001-12-21 08:12:20 +00:00
Duarte Loreto
9d6b6eec7a Added portuguese (pt) to ALL_LINGUAS
2001-12-20  Duarte Loreto <happyguy_pt@hotmail.com>

        * configure.in: Added portuguese (pt) to ALL_LINGUAS
2001-12-21 00:50:15 +00:00
Marius Andreiana
b9f0853a48 Added ro (Romanian) to ALL_LINGUAS added
2001-12-20  Marius Andreiana  <mandreiana@yahoo.com>

	* configure.in: Added ro (Romanian) to ALL_LINGUAS
	* plug-ins/perl/po/ro.po, po/ro.po, po-libgimp/ro.po,
		po-plug-ins/ro.po, po-script-fu/ro.po, tips/gimp_tips.ro.txt:
		added
2001-12-20 12:27:06 +00:00
Sven Neumann
3f366c6a99 gimptool.1.in applied patch from Roger Leigh <rl117@york.ac.uk> that makes
2001-12-18  Sven Neumann  <sven@gimp.org>

	* gimptool.1.in
	* gimptool.in: applied patch from Roger Leigh <rl117@york.ac.uk>
	that makes gimptool respect the DESTDIR environment variable.
2001-12-18 20:28:22 +00:00
Tor Lillqvist
fbdf28b02c Accept empty CFLAGS and LDFLAGS env vars.
2001-12-18  Tor Lillqvist  <tml@iki.fi>

	* gimptool-win32.c.in (find_out_env_flags): Accept empty CFLAGS
	and LDFLAGS env vars.
2001-12-17 22:08:14 +00:00
Sven Neumann
15476633d5 fixed the last typo fix.
2001-12-16  Sven Neumann  <sven@gimp.org>

	* plug-ins/gap/gap_decode_xanim.c (p_xanim_dialog): fixed the last
	typo fix.
2001-12-16 12:57:09 +00:00
Kjartan Maraas
8ebad9e813 Updated Norwegian (bokml) translation.
2001-12-13  Kjartan Maraas  <kmaraas@gnome.org>

	* no.po: Updated Norwegian (bokml) translation.
2001-12-13 21:58:22 +00:00
Sven Neumann
601b24eb7f removed moved files from stable branch 2001-12-13 18:24:49 +00:00
Roy-Magne Mo
f07e9afdb5 Updated Norwegian nynorsk translation 2001-12-12 04:34:28 +00:00
Tor Lillqvist
36e435d510 Also look at the CC env var, and the @CC@ configuration variable.
2001-12-11  Tor Lillqvist  <tml@iki.fi>

	* gimptool-win32.c.in: Also look at the CC env var, and the @CC@
	configuration variable.

	Set the msvc_syntax flag if the compiler appears to be MSVC
	(cl). Also accept the command line flag --msvc-syntax. If
	msvc_syntax, pass --msvc-syntax to pkg-config, and change
	generated command line appropriately (turn -o, -L and -l flags
	into their MSVC equivalents).

	Accept also C++ source files.

	Insert a space in the generated COPY command.

	Parse command line in two passes: first scan for flags that affect
	behaviour of others, like --msvc-syntax or --prefix=, then to
	actually do stuff. Thus the order of flags doesn't matter.
2001-12-10 23:37:38 +00:00
Kwok-Koon Cheung
5ac3ca2efc Usual update 2001-12-09 01:22:27 +00:00
Tor Lillqvist
535b4c806c Can't use g_snprintf here, we don't know the size of the user-supplied
2001-12-07  Tor Lillqvist  <tml@iki.fi>

	* app/general.c (iso_8601_date_format): Can't use g_snprintf here,
	we don't know the size of the user-supplied buffer. The
	sizeof (buf) was bogus, buf is a char pointer.
2001-12-07 01:19:20 +00:00
Sven Neumann
2750726754 removed moved files from stable branch 2001-12-06 09:36:07 +00:00
Sven Neumann
7ad9485aba corrected wrong clipping code and plugged a memleak. A more verbose
2001-12-05  Sven Neumann  <sven@gimp.org>

	* app/scan_convert.c (convert_segment): corrected wrong clipping code
	and plugged a memleak. A more verbose description of the problems and
	the fix can be found with bug report #66003.
2001-12-05 19:59:09 +00:00
Ole Laursen
67e3b31a9c Updated Danish translation.
2001-12-04  Ole Laursen  <olau@hardworking.dk>

	* da.po: Updated Danish translation.
2001-12-04 21:11:02 +00:00
Sven Neumann
737b985425 removed moved files from stable branch 2001-12-03 15:21:56 +00:00
Vincent van Adrighem
7a5e7731de Translation update for nl.po for: Branko Collin <collin@xs4all.nl>
2001-12-03 Vincent van Adrighem <V.vanAdrighem@dirck.mine.nu>
Translation update for nl.po for:
Branko Collin <collin@xs4all.nl>
2001-12-03 02:17:44 +00:00
Kwok-Koon Cheung
8e787c9871 Converted simplified Chinese tips file to native encoding 2001-12-01 17:14:22 +00:00
Kwok-Koon Cheung
0d06f0f483 Add zh_CN as target into makefiles in tips directory 2001-12-01 13:17:48 +00:00
Kwok-Koon Cheung
9e3071d93c Take simplified Chinese translations and tips file from HEAD branch.
Updated traditional Chinese translation.
2001-12-01 13:06:45 +00:00
Marc Lehmann
69c6d6d40c *** empty log message *** 2001-11-30 23:36:19 +00:00
Marc Lehmann
d9544a1067 *** empty log message *** 2001-11-30 23:03:00 +00:00
PST 2001 Manish Singh
bb982a6ef1 remove libtool and python stuff, stick contents of accompat.m4 here
Thu Nov 29 14:25:50 PST 2001 Manish Singh <yosh@gimp.org>

        * acinclude.m4: remove libtool and python stuff, stick contents
        of accompat.m4 here

        * accompat.m4: remove, doesn't seem to work with autoconf 2.13
        and automake 1.4

        * configure.in: remove reference to accompat.m4

        * app/Makefile.am
        * libgimp/Makefile.am
        * plug-ins/Makefile.am: comment out makefile.mingw references

        * app/errors.c: default to never prompt for stack trace
2001-11-29 22:31:49 +00:00
Kwok-Koon Cheung
b6d0d30282 Fix another typo 2001-11-29 22:08:40 +00:00
Manish Singh
ffc024b475 no reason to provide these anymore 2001-11-29 20:50:04 +00:00
Sven Neumann
667a844eeb use G_DIR_SEPARATOR instead of hardcoded UNIX-style slash.
2001-11-29  Sven Neumann  <sven@gimp.org>

	* plug-ins/imagemap/imap_preferences.c: use G_DIR_SEPARATOR instead
	of hardcoded UNIX-style slash.
2001-11-29 15:45:47 +00:00
Kwok-Koon Cheung
28bf2baf9f Fix typo in gap xanim decoding dialog tooltip 2001-11-29 05:35:16 +00:00
Kwok-Koon Cheung
47b77f1bdc usual update 2001-11-29 01:45:27 +00:00
Chyla Zbigniew
1505f043bf Updated Polish translation by GNOME PL Team <translators@gnome.pl> 2001-11-27 18:22:05 +00:00
Michael Natterer
2b0b16ef3e gimp_image_construct_layers/channels(): actually free the reverse_list
2001-11-26  Michael Natterer  <mitch@gimp.org>

	* app/gimpimage.c: gimp_image_construct_layers/channels():
	actually free the reverse_list after projecting the drawables.
	(Spotted by Kelly Martin).
2001-11-26 14:54:41 +00:00
Simon Budig
36ff5785e4 reverted one message.
2001-11-25  Simon Budig  <simon@gimp.org>

        * de.po: reverted one message.
2001-11-25 16:27:04 +00:00
Kwok-Koon Cheung
60a1a0c1b7 Usual update 2001-11-25 16:14:50 +00:00
Sven Neumann
779a54cf75 oops 2001-11-24 21:41:33 +00:00
Sven Neumann
083c8cc95b tools/pdbgen/pdb/color.pdb fixed typos.
2001-11-24  Sven Neumann  <sven@gimp.org>

	* tools/pdbgen/pdb/color.pdb
	* tools/pdbgen/pdb/image.pdb: fixed typos.

	* app/color_cmds.c
	* app/image_cmds.c
	* libgimp/gimpcolor_pdb.c
	* libgimp/gimpimage_pdb.c: regenerated
2001-11-24 21:40:40 +00:00
Andras Timar
fbd819d6f9 Slightly updated and fixed a typo.
2001-11-23  Andras Timar  <timar@gnome.hu>

        * hu.po: Slightly updated and fixed a typo.
2001-11-23 20:49:16 +00:00
Sven Neumann
32e6f4db17 sink the GtkPreview created for the logo.
2001-11-23  Sven Neumann  <sven@gimp.org>

	* app/about_dialog.c: sink the GtkPreview created for the logo.
2001-11-23 12:54:42 +00:00
Tor Lillqvist
3f0d24d4a6 New file. Should solve the AM_GLIB_GNU_GETTEXT and PKG_CHECK_MODULES
2001-11-22  Tor Lillqvist  <tml@iki.fi>

	* accompat.m4: New file. Should solve the AM_GLIB_GNU_GETTEXT and
	PKG_CHECK_MODULES problem when building for Unix on a system
	without glib-2.0.m4 or pkg.m4. Idea taken from GLib.

	* configure.in: Include accompat.m4.
2001-11-22 21:53:51 +00:00
Christian Rose
cab63b3494 Updated Swedish translation.
2001-11-22  Christian Rose  <menthos@menthos.com>

	* sv.po: Updated Swedish translation.
2001-11-22 12:38:48 +00:00
Simon Budig
2d7949acd0 Argh, wrong date...
2001-11-22  Simon Budig  <simon@gimp.org>

        * Changelog: Argh, wrong date...
2001-11-22 00:22:35 +00:00
Simon Budig
8c3b5f88e7 updated german translation. (Diese Bemerkung ber Spoiler und Zierleisten
2001-11-20  Simon Budig  <simon@gimp.org>

        * de.po: updated german translation.
	  (Diese Bemerkung ber Spoiler und Zierleisten musste weg!)
2001-11-22 00:08:49 +00:00
Tor Lillqvist
965a798d97 gtk_window_position() -> gtk_window_set_position().
2001-11-22  Tor Lillqvist  <tml@iki.fi>

	* plug-ins/winsnap/winsnap.c (snap_dialog): gtk_window_position()
	-> gtk_window_set_position().

	* plug-ins/winsnap/Makefile.am: Compile and link resource file.
2001-11-21 23:50:34 +00:00
Sven Neumann
aeca881b6b sink the GtkPreview created for the splash.
2001-11-21  Sven Neumann  <sven@gimp.org>

	* app/app_procs.c (splash_logo_load): sink the GtkPreview created for
	the splash.
2001-11-21 19:49:05 +00:00
Sven Neumann
130b13f2a4 app/app_procs.c applied a patch from Raphael Quinet that makes us check on
2001-11-20  Sven Neumann  <sven@gimp.org>

	* app/app_procs.c
	* app/tile_swap.[ch]: applied a patch from Raphael Quinet that makes
	us check on startup if a swapfile can be created and to give a better
	error message if we run out of memory and are unable to create a swap
	file (bug #64835).

	* app/user_install.c (user_install_run): fixed i18n of error messages.
2001-11-20 21:23:42 +00:00
Tor Lillqvist
3814422357 Don't use if !OS_WIN32.
2001-11-20  Tor Lillqvist  <tml@iki.fi>

	* plug-ins/gap/Makefile.am: Don't use if !OS_WIN32.
2001-11-19 22:29:38 +00:00
Tor Lillqvist
c703ff171e .cvsignore Update.
2001-11-20  Tor Lillqvist  <tml@iki.fi>

	* .cvsignore
	* app/.cvsignore: Update.
2001-11-19 22:17:20 +00:00
Sven Neumann
1a14274cd3 applied a patch from Daniel Egger <degger@fhm.edu> that reduces our memory
2001-11-19  Sven Neumann  <sven@gimp.org>

	* app/paint_funcs.c (paint_funcs_setup): applied a patch from Daniel
	Egger <degger@fhm.edu> that reduces our memory footprint by about
	1/4 MB.
2001-11-19 21:10:52 +00:00
Sven Neumann
884af55fdc removed files moved in HEAD 2001-11-19 20:44:26 +00:00
Stanislav Brabec
1e8ebfd990 Czech tips update. 2001-11-19 20:09:58 +00:00
Sven Neumann
2f34e24875 updated german translation 2001-11-19 13:02:58 +00:00
Stanislav Brabec
22e249571c czech translation update 2001-11-18 22:54:00 +00:00
Tor Lillqvist
408d2d5d63 Don't use if !OS_WIN32, automake 1.4 doesn't like that.
2001-11-19  Tor Lillqvist  <tml@iki.fi>

	* plug-ins/common/Makefile.am: Don't use if !OS_WIN32, automake
	1.4 doesn't like that.

	* plug-ins/common/xpm.c: On Win32, use the Xpm-noX library, and
	don't call any X functions to be able to parse colors, but use
	gdk_color_parse().

	* plug-ins/script-fu/script-fu-scripts.c (script_fu_find_scripts):
	Remove a couple of leftover debugging g_print().
2001-11-18 22:35:49 +00:00
Valek Frob
22cfabcc18 Updated russian translation. 2001-11-18 19:05:07 +00:00
Kwok-Koon Cheung
0f4170f9a9 Usual update 2001-11-18 09:26:02 +00:00
Kwok-Koon Cheung
25ebb89d16 Usual update. 2001-11-18 09:20:02 +00:00
Kwok-Koon Cheung
3c4b1fe8c7 Re-uploaded correct file. 2001-11-18 09:16:56 +00:00
Kwok-Koon Cheung
3eb4a8e81b Usual update 2001-11-18 09:13:27 +00:00
Tor Lillqvist
8007335b37 Added some missing entry points.
2001-11-18  Tor Lillqvist  <tml@iki.fi>

	* libgimp/gimp.def: Added some missing entry points.

	* libgimp/Makefile.am (libgimp_la_DEPENDENCIES,
	libgimpui_la_DEPENDENCIES): Depend on corresponding .def file (on
	Win32).
2001-11-17 22:44:08 +00:00
Fatih Demir
5eeeb1e2e6 Added ta.po 2001-11-17 21:38:53 +00:00
Ole Laursen
0569b8af60 Updated Danish translation.
2001-11-17  Ole Laursen  <olau@hardworking.dk>

	* da.po: Updated Danish translation.
2001-11-17 17:06:29 +00:00
Ole Laursen
450bc3d463 Fixed a few strings in the Danish translation and updated it.
2001-11-17  Ole Laursen  <olau@hardworking.dk>

	* da.po: Fixed a few strings in the Danish translation and updated it.
2001-11-17 16:09:58 +00:00
Christophe Merlet
a2e1e7816e Updated French translation. 2001-11-17 14:13:43 +00:00
Tor Lillqvist
a2b197a2fb Don't output a space after -L.
2001-11-16  Tor Lillqvist  <tml@iki.fi>

	* gimptool-win32.c.in: Don't output a space after -L.
2001-11-16 00:09:27 +00:00
Tor Lillqvist
372aa13afe Handle exec_prefix.
2001-11-16  Tor Lillqvist  <tml@iki.fi>

	* gimptool-win32.c.in: Handle exec_prefix.
2001-11-15 23:46:21 +00:00
Tor Lillqvist
86f39b8b0e Implement the --prefix and --*dir options.
2001-11-16  Tor Lillqvist  <tml@iki.fi>

	* gimptool-win32.c.in: Implement the --prefix and --*dir options.
2001-11-15 23:36:11 +00:00
Kwok-Koon Cheung
bed0b2913a Fixed a string in gimpressionist 2001-11-15 15:44:17 +00:00
Tor Lillqvist
c06fe299da Remove, as we use the same gimprc as on Unix now.
2001-11-15  Tor Lillqvist  <tml@iki.fi>

	* gimprc.win32: Remove, as we use the same gimprc as on Unix now.
2001-11-15 01:02:16 +00:00
Tor Lillqvist
65a2b878fe Do build the webbrowser plug-in on Windows. Output gimptool-win32.c
2001-11-15  Tor Lillqvist  <tml@iki.fi>

	* configure.in: Do build the webbrowser plug-in on Windows. Output
	gimptool-win32.c

	* Makefile.am: gimptool changes: On Windows, don't install the
	script, but instead build gimptool-win32.exe, and install that as
	gimptool.exe.

	* gimptool.1.in: Mention that gimptool is a bit different on
	Windows.

	* gimp-zip.in: Add gimptool.exe and manual pages.

	* libgimp/gimpenv.h
	* libgimp/gimpenv.c (gimp_path_runtime_fix): New function, code
	spliced out of gimp_path_parse().

	* libgimp/gimppatheditor.c (gimp_path_editor_new): Call it here,
	too.

	* plug-ins/script-fu/script-fu-scripts.c (script_fu_find_scripts):
	Use gimp_path_parse() instead of scanning the script-fu-path.

	* plug-ins/webbrowser/Makefile.am: Use -mwindows.

2001-11-14  Tor Lillqvist  <tml@iki.fi>

	* gimptool-win32.c.in: New file. gimptool in C, for Win32, at
	least here in gimp-1-2.
2001-11-15 00:58:12 +00:00
Christian Rose
f9b044be79 Updated Swedish translation.
2001-11-15  Christian Rose  <menthos@menthos.com>

	* sv.po: Updated Swedish translation.
2001-11-15 00:23:57 +00:00
Manish Singh
9e9a92c707 removing from gimp-1-2 branch 2001-11-14 19:28:35 +00:00
Kwok-Koon Cheung
92604b33db another bunch of update 2001-11-13 07:11:48 +00:00
Kwok-Koon Cheung
26e19fa77c Usual update 2001-11-13 07:06:37 +00:00
Chyla Zbigniew
c98a6a5bd4 Updated Polish translation by GNOME PL Team <translators@gnome.pl> 2001-11-12 10:32:54 +00:00
Sven Neumann
78034cc965 remove moved files from stable branch 2001-11-11 22:16:59 +00:00
Tor Lillqvist
e60c970799 Be afraid of Unisys, don't distribute gif.exe. Add etc/gimp/1.2.
2001-11-11  Tor Lillqvist  <tml@iki.fi>

	* gimp-zip.in: Be afraid of Unisys, don't distribute gif.exe.  Add
	etc/gimp/1.2.
2001-11-10 23:21:38 +00:00
Tor Lillqvist
caf037ee6d I finally had enough of the ugliness and problems related to running the
2001-11-11  Tor Lillqvist  <tml@iki.fi>

	* app/user_install.c: I finally had enough of the ugliness and
	problems related to running the user_install.bat script, and
	rewrote user_install_run() to setup the user .gimp-1.2 directory
	by itself. GIMP already knows what needs to be done, the
	information is in the tree_items array. Only a few new bits of
	info per tree item were needed. As of now, this is used only on
	Win32, but the same code should work on Unix, too (hint).
	(copy_file, copy_directory): New auxiliary functions.
	(quote_spaces): Now unused, remove.

	* user_install.bat: Remove.

	* Makefile.am: Remove here, too.

	* gimp-zip.in: Be afraid of Unisys, don't distribute gif.exe.  Add
	etc/gimp/1.2.
2001-11-10 23:21:05 +00:00
Ole Laursen
69a88e451d Updated Danish translation.
2001-11-10  Ole Laursen  <olau@hardworking.dk>

	* da.po: Updated Danish translation.
2001-11-10 13:28:53 +00:00
Christophe Merlet
5ddb42177c Updated French translation. 2001-11-10 11:57:17 +00:00
Tor Lillqvist
3423ba9acd Retract change from yesterday. Don't use popen on Windows, it really
2001-11-10  Tor Lillqvist  <tml@iki.fi>

	* app/user_install.c (user_install_run): Retract change from
	yesterday. Don't use popen on Windows, it really doesn't work.

	* plug-ins/makefile.mingw.in: More fixes.
2001-11-09 23:44:05 +00:00
Tor Lillqvist
4a7a8bcc26 Make it work again.
2001-11-09  Tor Lillqvist  <tml@iki.fi>

	* plug-ins/makefile.mingw.in: Make it work again.
2001-11-09 21:46:20 +00:00
Tor Lillqvist
19ec04c687 Expand app/gimp.rc.
2001-11-09  Tor Lillqvist  <tml@iki.fi>

	* configure.in: Expand app/gimp.rc.

	* README.win32: Correct note about makefile.msc files, I don't
	think they are up-to-date. Hans has been looking after the
	makefile.msc files in HEAD.
2001-11-09 21:30:17 +00:00
Tor Lillqvist
84464f1377 app/gimp.rc Replace gimp.rc with gimp.rc.in, containing also version
2001-11-09  Tor Lillqvist  <tml@iki.fi>

	* app/gimp.rc
	* app/gimp.rc.in: Replace gimp.rc with gimp.rc.in, containing also
	version information.

	* app/Makefile.am: Link with compiled resource file on Windows.
2001-11-09 21:26:18 +00:00
Chyla Zbigniew
3f11b7d797 Updated Polish translation by GNOME PL Team <translators@gnome.pl> 2001-11-09 17:25:37 +00:00
Sven Neumann
028ed22f50 updated german translation 2001-11-09 12:50:24 +00:00
Tor Lillqvist
9b941d34b1 Use -no-undefined on Windows. Use the ../app/libgimpapp export library.
2001-11-09  Tor Lillqvist  <tml@iki.fi>

	* modules/Makefile.am: Use -no-undefined on Windows. Use the
	../app/libgimpapp export library.

	* tips/makefile.mingw (DEST): Use Unixish subdirectory.

po:

2001-11-09  Tor Lillqvist  <tml@iki.fi>

	* makefile.mingw: Use Unixish locale directory.
2001-11-09 00:45:25 +00:00
Tor Lillqvist
0394c28804 plug-ins/Makefile.am Use -mwindows on Windows. Don't build nonportable
2001-11-09  Tor Lillqvist  <tml@iki.fi>

	* plug-ins/Makefile.am
	* plug-ins/*/Makefile.am: Use -mwindows on Windows. Don't build
	nonportable plug-ins on Windows. Don't build Windows-only plug-ins
	on Unix.

	* plug-ins/common/plugindetails.c: No gtk_paned_set_gutter_size in
	GTK+ 1.3.

	* plug-ins/script-fu/script-fu-server.c: Bypass on Win32.
2001-11-09 00:39:05 +00:00
Tor Lillqvist
ba19e38efb More changes for autoconfiscated build on Win32, and to use same directory
2001-11-09  Tor Lillqvist  <tml@iki.fi>

	More changes for autoconfiscated build on Win32, and to use same
	directory structure in the installation directory as on Unix.

	* configure.in: Calculate and substitute LT_CURRENT_MINUS_AGE like
	in GLib. Set PATHSEP as ':' or ';'. On Win32, use
	AM_GLIB_GNU_GETTEXT. Some awful hacks so AC_OUTPUT doesn't
	complain about files we don't have when we don't use "normal"
	gettextize. Add EXEEXT to TIFF, JPEG, PNG, MPEG and XPM. Check for
	winsock.h.

	* acconfig.h: Add HAVE_WINSOCK_H.

	* README.win32: Updates.

	* Makefile.am: Install either user_install.bat or user_install.
	(EXTRA_DIST): Distribute gimp-zip.

	* gimprc.in: Use @PATHSEP@ to separate search path entries.

	* gimprc_user.in: Add comment about the compile-time prefix being
	replaced at run-time.

	* user_install.bat: Use DOS line terminators, mark as binary.

	* gimp-zip.in: New file, used to build distribution packages on
	Win32.

	* app/Makefile.am: On Win32, generate an .exp file with exported
	symbols, and link with it. Copy the libtool-generated import
	library libgimp.a to libgimpapp.a to avoid clashes with the
	../libgimp/libgimp library.

	* app/libgimpapp.la: New file. Hand-written libtool wrapper for
	the gimp.exe import library.

	* app/user_install.c (user_install_run): Use popen on Win32,
	too. Experimental.

	* libgimp/Makefile.am: Use -no-undefined and -export-symbols on
	Windows. Install import libraries. Generate also MS import
	libraries if MS_LIB_AVAILABLE.

	* libgimp/gimp.c: Define LIBGIMP_COMPILATION here.

	* libgimp/gimp.def: Update.

	* libgimp/gimpenv.h
	* libgimp/gimpenv.c: (gimp_toplevel_directory): New Win32-only
	function.
	(gimp_data_directory, gimp_sysconf_directory): Use it.
	(gimp_path_parse): On Win32, if the path element starts with the
	compile-time prefix, replace that with the run-time one.

	* libgimp/gimpintl.h: On Win32, use gimp_toplevel_directory to
	form LOCALEDIR.

	* libgimp/gimpsignal.c: Bypass on Win32.
2001-11-09 00:32:52 +00:00
Sven Neumann
e4d39a0aad forgot to mention fix for bug #64075 2001-11-08 21:39:21 +00:00
Sven Neumann
d679d1cc1a app/general.c app/levels.c snprintf() is not portable, use g_snprintf()
2001-11-08  Sven Neumann  <sven@gimp.org>

	* app/general.c
	* app/levels.c
	* app/xcf.c: snprintf() is not portable, use g_snprintf() instead.

	* tools/pdbgen/pdb/text_tool.pdb: do the changes here since
	app/text_tool_cmds.c is generated.

	* app/text_tool_cmds.c: regenerated.
2001-11-08 21:35:24 +00:00
Christophe Merlet
9bb0b19a93 Updated French translation. 2001-11-08 09:12:21 +00:00
Kwok-Koon Cheung
0182112e47 Usual update. 2001-11-08 04:59:06 +00:00
Daniel Egger
b125519e42 app/general.c app/levels.c app/text_tool_cmds.c Use snprintf instead of
2001-11-07  Daniel Egger  <degger@fhm.edu>

	* app/general.c
	* app/levels.c
	* app/text_tool_cmds.c
	* app/xcf.c: Use snprintf instead of sprintf to protect the
	GIMP from buffer overflow problems.
2001-11-07 20:24:43 +00:00
Daniel Egger
0e607f2434 it.po ko.po Fixed incorrectly translated c-format messages which might
2001-11-07  Daniel Egger  <degger@fhm.edu>

	* it.po
	* ko.po
	* nn.po: Fixed incorrectly translated c-format messages which
	might have caused bug #62993.
	Translators: Watch the c-format messages as they trigger nasty
	problems when being translated incorrectly, rather don't touch
	them at all or ask for help!
2001-11-07 20:14:05 +00:00
Kwok-Koon Cheung
d27e58c955 New traditional Chinese tips file 2001-11-06 21:20:13 +00:00
Kwok-Koon Cheung
173b88581d Usual update. 2001-11-06 21:13:36 +00:00
Sven Neumann
3fc97b665b ooops, should prolly close that little memleak I introduced 2001-11-06 18:51:42 +00:00
Chyla Zbigniew
1119e81a09 Updated Polish translation by GNOME PL Team <translators@gnome.pl> 2001-11-06 18:12:24 +00:00
Sven Neumann
483b42d6ee use g_dirname() instead of setting the file selectors filename to "" to
2001-11-06  Sven Neumann  <sven@gimp.org>

	* app/fileops.c: use g_dirname() instead of setting the file selectors
	filename to "" to get the current directory name. Now we don't have to
	set the filename back later since we didn't touch it, thus we can't
	get it wrong. Fixes bug #63880.
2001-11-06 17:55:55 +00:00
Daniel Egger
b546249d31 Unconditionally premultiply alpha into source and seperate it from the
2001-11-06  Daniel Egger  <degger@fhm.edu>

	* plug-ins/common/gauss_rle.c: Unconditionally premultiply
	alpha into source and seperate it from the dest. Similar to
	the previous fix.
2001-11-06 12:08:47 +00:00
Kwok-Koon Cheung
74edcf5123 Fix a few entries 2001-11-06 07:43:48 +00:00
Daniel Egger
69dddfcb51 Unconditionally premultiply alpha into source and seperate it from the
2001-11-05  Daniel Egger  <degger@fhm.edu>

	* plug-ins/common/gauss_iir.c: Unconditionally premultiply
	alpha into source and seperate it from the dest. Fixes
	bug #57853.
2001-11-05 22:32:07 +00:00
Daniel Egger
bc84572d52 app/gimpimage.c app/gimpimage.h app/paint_funcs.c Constified a few
2001-11-05  Daniel Egger  <degger@fhm.edu>

	* app/gimpimage.c
	* app/gimpimage.h
	* app/paint_funcs.c
	* app/paint_funcs.h: Constified a few parameter arguments to
	shut up gcc warnings.

	* libgimp/gimpintl.h
	* libgimp/libgimp-intl.h
	* plug-ins/perl/perl-intl.h: When compililing without NLS
	cast "return" of gettextish calls to char * to avoid
	warnings.

	* plug-ins/common/url.c: Check for EOF by using feof instead
	of comparing against EOF to avoid warning.

	* plug-ins/imagemap/imap_cern.l
	* plug-ins/imagemap/imap_cern.y
	* plug-ins/imagemap/imap_cern_lex.c
	* plug-ins/imagemap/imap_csim.l
	* plug-ins/imagemap/imap_csim_lex.c
	* plug-ins/imagemap/imap_ncsa.l
	* plug-ins/imagemap/imap_ncsa_lex.c: Include string.h for
	prototype of strcpy.

	* plug-ins/rcm/rcm_callback.c: Change string from (???) to
	??? to avoid compiler confusion with possible trigraph.

	* plug-ins/script-fu/interp_sliba.c: Change template parameters
	of sprintf from long to int to avoid warnings.

	* plug-ins/gap/gap_filter_iterators.c: Remove unused functions
	to... you get the idea. :)
2001-11-05 18:47:43 +00:00
Kwok-Koon Cheung
6062e90b14 Updated traditional Chinese translation, which is merged from independent
translations from:
LΧ <object@mis.mgt.ncu.edu.tw>, T <cjj@u.washington.edu>
2001-11-05 05:19:02 +00:00
Sven Neumann
6fe63424d4 marked strings for translation, include config.h and corrected include
2001-11-05  Sven Neumann  <sven@gimp.org>

	* plug-ins/imagemap/*.c: marked strings for translation, include
	config.h and corrected include order. Added a check for NULL pointers
	that might fix bug #33802 (I can't reproduce the problem, so I can't
	check).
2001-11-05 02:37:01 +00:00
Sven Neumann
756de17a3b include config.h from all generated files. This is generally a good idea
2001-11-04  Sven Neumann  <sven@gimp.org>

	* tools/pdbgen/app.pl: include config.h from all generated files.
	This is generally a good idea and fixes bug #58842.

	* tools/pdbgen/pdb/fileops.pdb
	* tools/pdbgen/pdb/image.pdb
	* tools/pdbgen/pdb/procedural_db.pdb: don't explicitely include
	config.h.

	* app/*_cmds.c: regenerated.
2001-11-04 20:00:58 +00:00
Kwok-Koon Cheung
9c709002fb Usual update, merged translation from object@mis.mgt.ncu.edu.tw 2001-11-04 14:30:05 +00:00
Kwok-Koon Cheung
cb723720c2 Usual update 2001-11-04 14:14:13 +00:00
Sven Neumann
21cc4910e6 removed files moved in the HEAD branch from stable branch 2001-11-04 00:11:02 +00:00
Tor Lillqvist
06c605af7e Do generate Makefiles in the build direcory. 2001-11-01 23:47:56 +00:00
Tor Lillqvist
3933538b5e Distribute script-fu.ico and script-fu.rc.
2001-11-02  Tor Lillqvist  <tml@iki.fi>

	* plug-ins/script-fu/Makefile.am (EXTRA_DIST): Distribute
	* script-fu.ico and script-fu.rc.
2001-11-01 23:43:44 +00:00
Tor Lillqvist
eec636d9e6 Update.
2001-11-02  Tor Lillqvist  <tml@iki.fi>

	* README.win32: Update.

	* configure.in: First preparations for autoconfiscated build on
	Win32 (with gcc): Call AC_LIBTOOL_WIN32_DLL. Check for Windows
	platform, and pure Windows. Set Automake macros PLATFORM_WIN32 and
	OS_WIN32 correspondingly. Check for availability of lib.exe.

	On Win32, don't check for GTK+ 1.2.8, but for
	gtk+-1.3-win32-production using the PKG_CHECK_MODULES macro. This
	macro is called only on Win32, so I hope it doesn't matter if
	autoconf is run on a Unix system without pkg-config?

	Assure -fnative-struct is used. Enclose nested AC_CHECK_HEADER
	calls in brackets, otherwise Autoconf 2.52 will generate bad shell
	code.

	* Makefile.am (EXTRA_DIST): Distribute po*/makefile.mingw here.

	* config.h.win32: Define HAVE_DIRENT_H. Mingw has it, and for MSVC
	it is also available in build/win32/dirent.

	* libgimp/makefile.mingw.in
	* modules/makefile.mingw.in: Use new build-dll invokation syntax.

	* app/fileops.c (file_ops_post_init): Use G_DIR_SEPARATOR_S.

	* plug-ins/makefile.mingw.in: Don't build separate tiff_nolzw
	plug-in. Build just one tiff.exe, but distribute alternative
	libtiff DLLs (with identical entry points). Remove more
	unnecessarily copied Makefiles when installing gflare,
	gimpressionist or fractalexplorer stuff.

	* plug-ins/common/animationplay.c: Don't include gdkwin32.h, as
	the gtk+-1.3.0-win32-production dist doesn't include a good
	one. Instead copy the two lines necessary.

	* plug-ins/common/png.c (load_image): libpng 1.2.0 doesn't have
	png_read_destroy() or png_write_destroy() as public functions.

	* plug-ins/script-fu/script-fu.ico
	* plug-ins/script-fu/script-fu.rc: Were missing from CVS.
2001-11-01 23:39:54 +00:00
Gediminas Paulauskas
d76f2b335f convert to UNIX newline format.
2001-10-31  Gediminas Paulauskas <menesis@delfi.lt>

	* tips/gimp_tips.lt.txt: convert to UNIX newline format.
2001-10-31 08:13:37 +00:00
Christian Rose
a3a5e9e9ad Updated the Swedish translation some.
2001-10-31  Christian Rose  <menthos@menthos.com>

	* sv.po: Updated the Swedish translation some.
2001-10-31 02:06:35 +00:00
Christian Rose
dd53d0e41f Updated Swedish translation.
2001-10-30  Christian Rose  <menthos@menthos.com>

	* sv.po: Updated Swedish translation.
2001-10-30 16:56:52 +00:00
Sven Neumann
dbd3020bf7 Use the same fix for the missing <string.h> includes as used in the HEAD
branch instead of the slightly more ugly one I introduced lately.
2001-10-29 08:37:17 +00:00
Sven Neumann
d0228c02da updated some links 2001-10-28 21:25:22 +00:00
Sven Neumann
74eeb34e46 added new files
2001-10-28  Sven Neumann  <sven@gimp.org>

	* C/dialogs/Makefile.am: added new files

	* C/dialogs/confirm_save.html: corrected help text.
2001-10-28 20:29:28 +00:00
Andras Timar
ad638913b7 Updated Hungarian translation.
2001-10-28  Andras Timar  <timar@gnome.hu>

        * hu.po: Updated Hungarian translation.
2001-10-28 19:32:20 +00:00
Pablo Saratxaga
44e9f58763 updated Catalan files 2001-10-28 17:35:58 +00:00
Tomas gren
ee3642125b s/satndard/standard/
2001-10-27  Tomas gren  <stric@ing.umu.se>

        * sv.po: s/satndard/standard/
2001-10-27 03:17:17 +00:00
Mel Boyce
ccbb17f83c New help content. 2001-10-26 12:38:51 +00:00
Sven Neumann
29ee1ded82 another file that needs more includes for gcc-3.0 2001-10-26 12:00:24 +00:00
Mel Boyce
e6869ac761 Added missing file from last commit. 2001-10-26 11:53:11 +00:00
Kwok-Koon Cheung
7e9188d9a4 Updated traditional Chinese translation, merged from different translations of LΧ and Chun-Chung Chen 2001-10-26 11:48:41 +00:00
Sven Neumann
587e8fa7de rewrote so gcc-3.0 doesn't complain.
2001-10-26  Sven Neumann  <sven@gimp.org>

	* app/temp_buf.c (temp_buf_to_gray): rewrote so gcc-3.0 doesn't
	complain.

	* tools/pdbgen/lib.pl: add #include <string.h> if the generated code
	uses memcpy().

	* libgimp/gimpbrushes_pdb.c
	* libgimp/gimpdrawable_pdb.c
	* libgimp/gimpgradients_pdb.c
	* libgimp/gimpgradientselect_pdb.c
	* libgimp/gimpimage_pdb.c
	* libgimp/gimppaths_pdb.c
	* libgimp/gimppatterns_pdb.c
	* libgimp/gimpproceduraldb_pdb.c: regenerated.

	* libgimp/gimpmatrix.c
	* libgimp/gimpproceduraldb.c
	* libgimp/gimpwidgets.c
	* plug-ins/flame/libifs.c
	* plug-ins/gap/gap_dbbrowser_utils.c
	* plug-ins/gap/gap_filter_foreach.c:
	* plug-ins/ifscompose/ifscompose_storage.c
	* plug-ins/imagemap/imap_circle.c
	* plug-ins/imagemap/imap_grid.c
	* plug-ins/imagemap/imap_rectangle.c
	* plug-ins/common/mpeg.c
	* plug-ins/common/plasma.c
	* tools/gimp-remote.c: added missing includes wanted by gcc-3.0.
2001-10-26 11:48:13 +00:00
Ole Laursen
85a5e00704 Updated Danish translation.
2001-10-26  Ole Laursen  <olau@hardworking.dk>

	* da.po: Updated Danish translation.
2001-10-26 11:03:21 +00:00
Mel Boyce
1c068d24a5 Added new help file for Export File dialog. 2001-10-26 11:02:50 +00:00
Christophe Merlet
de5f0b0751 Updated French translation. 2001-10-25 21:02:52 +00:00
Chyla Zbigniew
1c2db33cc3 Updated Polish translation by GNOME PL Team <translators@gnome.pl> 2001-10-25 19:34:04 +00:00
Nick Lamb /GIMP
3548372126 Include standard C headers to reduce warnings. 2001-10-25 19:15:26 +00:00
Kwok-Koon Cheung
67ffe884e4 Usual update. 2001-10-25 13:15:28 +00:00
Chyla Zbigniew
91e269c361 Updated Polish translation by GNOME PL Team <translators@gnome.pl> 2001-10-25 00:30:56 +00:00
Chyla Zbigniew
57fc2d3d3f Updated Polish translation by GNOME PL Team <translators@gnome.pl> 2001-10-25 00:12:44 +00:00
Christian Rose
aa6b4f9041 Updated Swedish translation.
2001-10-24  Christian Rose  <menthos@menthos.com>

	* sv.po: Updated Swedish translation.
2001-10-24 21:21:15 +00:00
Sven Neumann
5fea698048 applied a patch from Raphael Quinet that fixes bug #56598 (Highlight Edges
2001-10-24  Sven Neumann  <sven@gimp.org>

	* plug-ins/perl/examples/glowing_steel: applied a patch from Raphael
	Quinet that fixes bug #56598 (Highlight Edges crashes if used on a
	non-visible layer).
2001-10-24 19:56:51 +00:00
Sven Neumann
1739d1c381 made the preview work for indexed images.
2001-10-24  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/grid.c: made the preview work for indexed images.
2001-10-24 17:26:45 +00:00
Sven Neumann
3da763f1fb applied a patch from Raphael Quinet <quinet@gamers.org> that fixes bug
2001-10-24  Sven Neumann  <sven@gimp.org>

	* libgimp/gimpexport.c:
	applied a patch from Raphael Quinet <quinet@gamers.org> that fixes
	bug #51114 and a whole bunch of related or duplicated bug reports.
2001-10-24 11:08:39 +00:00
Mel Boyce
8dbe453032 Loads of small updates to the help system. Many additions to the glossary. 2001-10-24 09:51:57 +00:00
Christophe Merlet
db2dcb941f Updated French translations. 2001-10-24 08:47:26 +00:00
Kwok-Koon Cheung
31a73cb6a0 Usual update 2001-10-23 19:08:18 +00:00
Sven Neumann
f1f39593bb app/tools_cmds.c forgot to check for layer masks in gimp_perspective() PDB
2001-10-23  Sven Neumann  <sven@gimp.org>

	* app/tools_cmds.c
	* tools/pdbgen/pdb/tools.pdb: forgot to check for layer masks in
	gimp_perspective() PDB calls.
2001-10-23 10:05:28 +00:00
Sven Neumann
cbee7cc6e1 tools/pdbgen/tools.pdb don't allow to apply transformations to layers that
2001-10-22  Sven Neumann  <sven@gimp.org>

	* tools/pdbgen/tools.pdb
	* app/tools_cmds.c: don't allow to apply transformations to layers
	that have a layer mask attached. We do not support this, but didn't
	check the PDB calls to the transform tool.

	This fixes bug #62764 (rotate a gdyntext with layer mask applied
	freezes gimp), but GDynText should probably reflect the fact that
	the text can not be rotated if it has a layer mask by graying out
	the rotation UI elements.

	* app/tips_dialog.c: make Next and Previous buttons insensitive if
	no tips could be loaded (as suggested by Branko Collin).

	* plug-ins/common/mblur.c (mblur_linear): avoid endless looping when
	length == 1 in linear mode (fixes bug #62640).

	* plug-ins/gap/gap_lib.c: applied patch from Wolfgang Hofer that fixes
	bug #61677 (error in duplicate frames GUI).
2001-10-23 09:40:33 +00:00
Kjartan Maraas
73837c3944 Updated Norwegian (bokml) translation.
2001-10-20  Kjartan Maraas  <kmaraas@gnome.org>

	* no.po: Updated Norwegian (bokml) translation.
2001-10-20 14:32:49 +00:00
Pablo Saratxaga
98cd8cac22 updated Catalan file 2001-10-20 07:58:28 +00:00
Sven Neumann
4b1ecf6cbb Combine type0 and type1 into one PDB parameter since they are exclusive. 2001-10-19 10:40:17 +00:00
Sven Neumann
2004cbdc75 plug-ins/FractalExplorer/FractalExplorer.c added missing PDB parameters.
2001-10-19  Sven Neumann  <sven@gimp.org>

	* plug-ins/FractalExplorer/FractalExplorer.c
	* plug-ins/common/illusion.c: added missing PDB parameters. Thanks
	to iccii@hotmail.com for spotting these.
2001-10-18 23:04:17 +00:00
Ole Laursen
53fab8b539 Fixed a few things in Danish translation.
2001-10-17  Ole Laursen  <olau@hardworking.dk>

	* da.po: Fixed a few things in Danish translation.
2001-10-17 18:17:46 +00:00
Ole Laursen
f93f7fb85a Updated Danish translation.
2001-10-17  Ole Laursen  <olau@hardworking.dk>

	* da.po: Updated Danish translation.
2001-10-17 18:14:09 +00:00
Sven Neumann
39f9094abe plug-ins/common/colortoalpha.c fixed wrong checks for number of parameters
2001-10-16  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/colortoalpha.c
	* plug-ins/common/sel_gauss.c: fixed wrong checks for number of
	parameters when called non-interactively (bug #62433). Thanks to
	iccii@hotmail.com for spotting this and providing a patch.
2001-10-16 14:51:01 +00:00
PDT 2001 Manish Singh
93391353a7 bumped version to 1.2.3, correct library ages (back to 1.2.1
Mon Oct 15 10:52:22 PDT 2001 Manish Singh <yosh@gimp.org>

        * configure.in: bumped version to 1.2.3, correct library ages (back
        to 1.2.1 compatibility), added comment regarding these
2001-10-15 17:53:19 +00:00
Sven Neumann
17fd5eaf06 applied a patch from Raphael Quinet <quinet@gamers.org> that makes the
2001-10-15  Sven Neumann  <sven@gimp.org>

	* app/fileops.c:
	applied a patch from Raphael Quinet <quinet@gamers.org> that makes
	the "File exists!" dialog box transient for the save dialog. Addresses
	bug #61092.
2001-10-15 17:31:13 +00:00
Chyla Zbigniew
23dcdf49db Updated Polish translation.
* tips/gimp_tips.pl.txt: Updated Polish translation.
2001-10-15 07:52:22 +00:00
Chyla Zbigniew
dd98a8b51b Updated Polish translation 2001-10-14 21:33:13 +00:00
Christian Rose
171a921742 Fixed. Thanks to Per Larsson <tucker@algonet.se> for his comment.
2001-10-14  Christian Rose  <menthos@menthos.com>

	* sv.po: Fixed. Thanks to
	Per Larsson <tucker@algonet.se> for his comment.
2001-10-14 14:31:26 +00:00
Pablo Saratxaga
f96c4dca9c updated Catalan files (merge from HEAD branch) 2001-10-12 23:33:29 +00:00
Ole Laursen
c14df8d671 Updated Danish translation.
2001-10-13  Ole Laursen  <olau@hardworking.dk>

	* da.po: Updated Danish translation.
2001-10-12 22:09:16 +00:00
Christian Rose
854608727d Fixed. Thanks to Tomas gren <stric@ing.umu.se> for his review.
2001-10-11  Christian Rose  <menthos@menthos.com>

	* sv.po: Fixed. Thanks to
	Tomas gren <stric@ing.umu.se> for his review.
2001-10-11 08:05:42 +00:00
Ole Laursen
9c439ba7cc Updated Danish translation.
2001-10-10  Ole Laursen  <olau@hardworking.dk>

	* da.po: Updated Danish translation.
2001-10-10 20:07:03 +00:00
Christian Rose
29ae0d0f34 Updated Swedish translation.
2001-10-10  Christian Rose  <menthos@menthos.com>

	* sv.po: Updated Swedish translation.
2001-10-10 20:06:13 +00:00
Christian Rose
6e80dc4a35 Fixed the Swedish translation. Thanks to Fredrik Wendt
2001-10-10  Christian Rose  <menthos@menthos.com>

	* sv.po: Fixed the Swedish translation. Thanks to
	Fredrik Wendt <fredrik.wendt@linux.se> for his comment.
2001-10-10 10:12:51 +00:00
Sven Neumann
a3d31243c6 merged fix for bug #22161 from HEAD.
2001-10-10  Sven Neumann  <sven@gimp.org>

	* plug-ins/Lighting/lighting_image.c: merged fix for bug #22161
	from HEAD.
2001-10-10 00:59:02 +00:00
Sven Neumann
f6ded5059d translate gimp_tips.txt with gimp_tips.lt.txt so the tips file is actually
2001-10-10  Sven Neumann  <sven@gimp.org>

	* lt.po: translate gimp_tips.txt with gimp_tips.lt.txt so the tips
	file is actually used.
2001-10-10 00:45:20 +00:00
Sven Neumann
03deca0206 app/fileops_cmds.c tools/pdbgen/app.pl call mkdir() in the PDB function
2001-10-10  Sven Neumann  <sven@gimp.org>

	* app/fileops_cmds.c
	* tools/pdbgen/app.pl
	* tools/pdbgen/pdb/fileops.pdb: call mkdir() in the PDB function
	gimp_temp_name() so there's a better chance the temp dir exists
	before plug-ins try to place temporary files there. This is a
	workaround for bug #61803.
2001-10-10 00:42:48 +00:00
Mantas Kriauciunas
ba98f23082 Updated Lithuanian translation
2001-10-10  Mantas Kriauciunas <mantelis@centras.lt>

	* lt.po: Updated Lithuanian translation

2001-10-10  Gediminas Paulauskas <menesis@delfi.lt>

        * tips/Makefile.am|makefile.mingw: Added gimp_tips.lt.txt to the
	targets.

	* tips/gimp_tips.lt.txt: Added Lithuanian tips file.
2001-10-10 00:35:29 +00:00
Sven Neumann
773ae52ab4 rewrote parser to make it more robust against a corrupt ideas file (bug
2001-10-10  Sven Neumann  <sven@gimp.org>

	* app/docindex.c: rewrote parser to make it more robust against a
	corrupt ideas file (bug #61894).
2001-10-10 00:05:32 +00:00
Sven Neumann
9b07f1d198 app/blend.c app/by_color_select.c app/channel_ops.c app/clone.c
2001-10-10  Sven Neumann  <sven@gimp.org>

	* app/blend.c
	* app/by_color_select.c
	* app/channel_ops.c
	* app/clone.c
	* app/color_panel.c
	* app/color_picker.c
	* app/edit_selection.c
	* app/ellipse_select.c
	* app/free_select.c
	* app/gdisplay.c
	* app/magnify.c
	* app/measure.c
	* app/move.c
	* app/paint_core.c
	* app/path_bezier.c
	* app/path_tool.c
	* app/rect_select.c
	* app/selection.c
	* app/text_tool.c
	* app/transform_core.c: small cleanups (use TRUE/FALSE instead of 1/0)
	I did while trying to fix bug #17904. I will commit the real changes
	separately.
2001-10-09 22:47:48 +00:00
Christian Rose
a6c987628b Fixed Swedish translation, thanks to Gran Uddeborg
2001-10-10  Christian Rose  <menthos@menthos.com>

	* sv.po: Fixed Swedish translation, thanks to
	Gran Uddeborg <goeran@uddeborg.pp.se> for his review.
2001-10-09 22:04:31 +00:00
Christian Rose
327a66f308 Updated Swedish translation.
2001-10-09  Christian Rose  <menthos@menthos.com>

	* sv.po: Updated Swedish translation.
2001-10-09 15:57:08 +00:00
Ole Laursen
6b105fb5af Partiel update of Danish translation.
2001-10-08  Ole Laursen  <olau@hardworking.dk>

	* po/da.po, po-libgimp/da.po, po-plug-ins/da.po,
	  po-script-fu/da.po: Partiel update of Danish translation.
2001-10-08 20:15:51 +00:00
Michael Natterer
e3ed234a5c some .cvsignore files... 2001-10-08 14:34:31 +00:00
Michael Natterer
9e9d72bf6b some new Makefiles in help/.
2001-10-08  Michael Natterer  <mitch@gimp.org>

	* configure.in: some new Makefiles in help/.
2001-10-08 14:32:47 +00:00
Michael Natterer
b20f69b3ef well... 2001-10-08 11:25:42 +00:00
Michael Natterer
1aa0ea4472 C/images/Makefile.am.orig C/images/Makefile.am~ C/images/Makefile.in
2001-10-08  Michael Natterer  <mitch@gimp.org>

	* C/images/Makefile.am.orig
	* C/images/Makefile.am~
	* C/images/Makefile.in
2001-10-08 11:24:12 +00:00
Daniel Egger
aa194a2bb6 This is a really large commit to update the help to the latest texts we
2001-09-07  Daniel Egger <degger@fhm.edu>

	This is a really large commit to update the help to the
	latest texts we have in the gimp-help module.

	* C/filters/animate_cells.html
	* C/filters/animationplay.html
	* C/filters/animoptimize.html
	* C/filters/apply_lens.html
	* C/filters/blended2.html
	* C/filters/blowinout.html
	* C/filters/border.html
	* C/filters/bumpmap.html
	* C/filters/cml_explorer.html
	* C/filters/convmatrix.html
	* C/filters/curve_bend.html
	* C/filters/deinterlace.html
	* C/filters/depthmerge.html
	* C/filters/despeckle.html
	* C/filters/destripe.html
	* C/filters/diffraction.html
	* C/filters/displace.html
	* C/filters/edge.html
	* C/filters/emboss.html
	* C/filters/engrave.html
	* C/filters/film.html
	* C/filters/fire.html
	* C/filters/flarefx.html
	* C/filters/fractalexplorer.html
	* C/filters/fractaltrace.html
	* C/filters/gap_frontends.html
	* C/filters/gap_navigator_dialog.html
	* C/filters/gap_plugins.html
	* C/filters/gdyntext.html
	* C/filters/gflare.html
	* C/filters/gimpressionist.html
	* C/filters/glasstile.html
	* C/filters/glowing_steel.html
	* C/filters/gouge.html
	* C/filters/ifscompose.html
	* C/filters/illusion.html
	* C/filters/imagemap.html
	* C/filters/image_tile.html
	* C/filters/iwarp.html
	* C/filters/laplace.html
	* C/filters/lic.html
	* C/filters/lighting.html
	* C/filters/logulator.html
	* C/filters/mapobject.html
	* C/filters/map_to_gradient.html
	* C/filters/mirrorsplit.html
	* C/filters/newsprint.html
	* C/filters/nlfilt.html
	* C/filters/nova.html
	* C/filters/pagecurl.html
	* C/filters/papertile.html
	* C/filters/perlotine.html
	* C/filters/pixelmap.html
	* C/filters/polar.html
	* C/filters/prep4gif.html
	* C/filters/resynth.html
	* C/filters/scratches.html
	* C/filters/sinus.html
	* C/filters/sobel.html
	* C/filters/sparkle.html
	* C/filters/struc.html
	* C/filters/tileit.html
	* C/filters/tiler.html
	* C/filters/translogo.html
	* C/filters/unsharp.html
	* C/filters/video.html
	* C/filters/vpropagate.html
	* C/filters/warp.html
	* C/filters/warp-sharp.html
	* C/filters/waves.html
	* C/filters/webify.html
	* C/filters/whirlpinch.html
	* C/filters/wind.html
	* C/filters/windify.html
	* C/filters/xachlego.html
	* C/filters/xachshadow.html
	* C/images/add_point.png
	* C/images/anchor_layer.png
	* C/images/channel_to_selection.png
	* C/images/delete_channel.png
	* C/images/delete_directory.png
	* C/images/delete_layer.png
	* C/images/delete_path.png
	* C/images/dotted_square.png
	* C/images/duplicate_channel.png
	* C/images/duplicate_layer.png
	* C/images/duplicate_path.png
	* C/images/edit_point.png
	* C/images/examples/border-selection-01.png
	* C/images/examples/border-selection-02.png
	* C/images/examples/Makefile.am
	* C/images/eye.png
	* C/images/geezoom.png
	* C/images/glossary/Makefile.am
	* C/images/glossary/modes-addition.png
	* C/images/glossary/modes-color.png
	* C/images/glossary/modes-darken.png
	* C/images/glossary/modes-difference.png
	* C/images/glossary/modes-dissolve.png
	* C/images/glossary/modes-divide.png
	* C/images/glossary/modes-hue.png
	* C/images/glossary/modes-lighten.png
	* C/images/glossary/modes-multiply.png
	* C/images/glossary/modes-normal2.png
	* C/images/glossary/modes-normal.png
	* C/images/glossary/modes-overlay.png
	* C/images/glossary/modes-saturation.png
	* C/images/glossary/modes-screen.png
	* C/images/glossary/modes-subtract.png
	* C/images/glossary/modes-value.png
	* C/images/layers_example.png
	* C/images/layers_overview.png
	* C/images/lower_channel.png
	* C/images/lower_directory.png
	* C/images/lower_layer.png
	* C/images/Makefile.am~
	* C/images/Makefile.am.orig
	* C/images/Makefile.in
	* C/images/new_channel.png
	* C/images/new_directory.png
	* C/images/new_path.png
	* C/images/new_point.png
	* C/images/path_to_selection.png
	* C/images/preview_box.png
	* C/images/raise_channel.png
	* C/images/raise_directory.png
	* C/images/raise_layer.png
	* C/images/red_square.png
	* C/images/remove_point.png
	* C/images/selection_to_path.png
	* C/images/stroke_path.png
	* C/images/tools/Makefile.am
	* C/images/tools/tool_airbrush.png
	* C/images/tools/tool_apartheid.png
	* C/images/tools/tool_bezier.png
	* C/images/tools/tool_blend.png
	* C/images/tools/tool_burndodge.png
	* C/images/tools/tool_convolver.png
	* C/images/tools/tool_crop.png
	* C/images/tools/tool_dodgeburn.png
	* C/images/tools/tool_ellipse_sel.png
	* C/images/tools/tool_eraser.png
	* C/images/tools/tool_fill.png
	* C/images/tools/tool_flip.png
	* C/images/tools/tool_free_sel.png
	* C/images/tools/tool_fuzzy_sel.png
	* C/images/tools/tool_gradient.png
	* C/images/tools/tool_ink.png
	* C/images/tools/tool_measure.png
	* C/images/tools/tool_move.png
	* C/images/tools/tool-opt-increment.png
	* C/images/tools/tool-opt-nonincrement.png
	* C/images/tools/tool_paintbrush.png
	* C/images/tools/tool_pencil.png
	* C/images/tools/tool_picker.png
	* C/images/tools/tool_rect_sel.png
	* C/images/tools/tool_scissors.png
	* C/images/tools/tool_smudge.png
	* C/images/tools/tool_smuge.png
	* C/images/tools/tool_text.png
	* C/images/tools/tool_transform.png
	* C/images/tools/tool_zoom.png
	* C/images/triangle.png
	* C/images/wilber.png
	* C/stylesheet-images/Makefile.am
	* C/stylesheet-images/note.gif
	* C/stylesheet-images/tip.gif
	* C/stylesheet-images/warning.gif:
	Added lots of new files.

	* C/bug_submission.html
	* C/channels/channel_to_selection.html
	* C/channels/delete_channel.html
	* C/channels/duplicate_channel.html
	* C/channels/index.html
	* C/channels/lower_channel.html
	* C/channels/raise_channel.html
	* C/command_line.html
	* C/contents.html
	* C/dialogs/about.html
	* C/dialogs/border_selection.html
	* C/dialogs/brush_editor.html
	* C/dialogs/brush_selection.html
	* C/dialogs/channels/channels.html
	* C/dialogs/channels/edit_channel_attributes.html
	* C/dialogs/channels/new_channel.html
	* C/dialogs/color_selectors/built_in.html
	* C/dialogs/color_selectors/gtk.html
	* C/dialogs/color_selectors/triangle.html
	* C/dialogs/color_selectors/watercolor.html
	* C/dialogs/convert_to_indexed.html
	* C/dialogs/copy_named.html
	* C/dialogs/cut_named.html
	* C/dialogs/device_status.html
	* C/dialogs/document_index.html
	* C/dialogs/edit_qmask_attributes.html
	* C/dialogs/error_console.html
	* C/dialogs/feather_selection.html
	* C/dialogs/file_new.html
	* C/dialogs/file_open.html
	* C/dialogs/file_save.html
	* C/dialogs/gradient_editor/copy_gradient.html
	* C/dialogs/gradient_editor/delete_gradient.html
	* C/dialogs/gradient_editor/gradient_editor.html
	* C/dialogs/gradient_editor/new_gradient.html
	* C/dialogs/gradient_editor/rename_gradient.html
	* C/dialogs/gradient_editor/replicate_segment.html
	* C/dialogs/gradient_editor/save_as_povray.html
	* C/dialogs/gradient_editor/split_segments_uniformly.html
	* C/dialogs/gradient_selection.html
	* C/dialogs/grow_selection.html
	* C/dialogs/help.html
	* C/dialogs/indexed_palette.html
	* C/dialogs/index.html
	* C/dialogs/info_window.html
	* C/dialogs/input_devices.html
	* C/dialogs/layers/add_layer_mask.html
	* C/dialogs/layers_and_channels.html
	* C/dialogs/layers/edit_layer_attributes.html
	* C/dialogs/layers/layer_boundary_size.html
	* C/dialogs/layers/layers.html
	* C/dialogs/layers/merge_visible_layers.html
	* C/dialogs/layers/new_layer.html
	* C/dialogs/layers/scale_layer.html
	* C/dialogs/module_browser.html
	* C/dialogs/navigation_window.html
	* C/dialogs/offset.html
	* C/dialogs/palette_editor/delete_palette.html
	* C/dialogs/palette_editor/import_palette.html
	* C/dialogs/palette_editor/merge_palette.html
	* C/dialogs/palette_editor/new_palette.html
	* C/dialogs/palette_editor/palette_editor.html
	* C/dialogs/palette_selection.html
	* C/dialogs/paste_named.html
	* C/dialogs/paths/edit_path_attributes.html
	* C/dialogs/paths/export_path.html
	* C/dialogs/paths/import_path.html
	* C/dialogs/paths/paths.html
	* C/dialogs/pattern_selection.html
	* C/dialogs/preferences/directories.html
	* C/dialogs/preferences/display.html
	* C/dialogs/preferences/environment.html
	* C/dialogs/preferences/interface.html
	* C/dialogs/preferences/monitor.html
	* C/dialogs/preferences/new_file.html
	* C/dialogs/preferences/preferences.html
	* C/dialogs/preferences/session.html
	* C/dialogs/really_close.html
	* C/dialogs/really_quit.html
	* C/dialogs/scale_image.html
	* C/dialogs/scale_layer_warn.html
	* C/dialogs/set_canvas_size.html
	* C/dialogs/shrink_selection.html
	* C/dialogs/tip_of_the_day.html
	* C/dialogs/tool_options.html
	* C/dialogs/undo_history.html
	* C/file/close.html
	* C/file_formats.html
	* C/file/index.html
	* C/file/last_opened.html
	* C/file/quit.html
	* C/file/revert.html
	* C/filters/alienmap2.html
	* C/filters/alienmap.html
	* C/filters/align_layers.html
	* C/filters/applycanvas.html
	* C/filters/autocrop.html
	* C/filters/autostretch_hsv.html
	* C/filters/blinds.html
	* C/filters/blur.html
	* C/filters/borderaverage.html
	* C/filters/burst.html
	* C/filters/bz2.html
	* C/filters/c_astretch.html
	* C/filters/centerguide.html
	* C/filters/checkerboard.html
	* C/filters/color_enhance.html
	* C/filters/colorify.html
	* C/filters/colortoalpha.html
	* C/filters/compose.html
	* C/filters/cubism.html
	* C/filters/decompose.html
	* C/filters/ditherize.html
	* C/filters/dust.html
	* C/filters/exchange.html
	* C/filters/fade-alpha.html
	* C/filters/fits.html
	* C/filters/fit-text.html
	* C/filters/flame.html
	* C/filters/fp.html
	* C/filters/frame_filter.html
	* C/filters/gap_filter.html
	* C/filters/gauss_iir.html
	* C/filters/gauss_rle.html
	* C/filters/gee_zoom.html
	* C/filters/gfig.html
	* C/filters/gih.html
	* C/filters/gqbist.html
	* C/filters/gradmap.html
	* C/filters/grid.html
	* C/filters/gtm.html
	* C/filters/guidegrid.html
	* C/filters/guide_remove.html
	* C/filters/guides_to_selection.html
	* C/filters/guillotine.html
	* C/filters/gz.html
	* C/filters/hot.html
	* C/filters/hrz.html
	* C/filters/index.html
	* C/filters/jigsaw.html
	* C/filters/jpeg.html
	* C/filters/layerfuncs.html
	* C/filters/mail.html
	* C/filters/Makefile.am
	* C/filters/mapcolor.html
	* C/filters/max_rgb.html
	* C/filters/maze.html
	* C/filters/mblur.html
	* C/filters/miff.html
	* C/filters/mosaic.html
	* C/filters/noisify.html
	* C/filters/none.html
	* C/filters/normalize.html
	* C/filters/oilify.html
	* C/filters/pat.html
	* C/filters/pixelize.html
	* C/filters/plasma.html
	* C/filters/png.html
	* C/filters/pnm.html
	* C/filters/print.html
	* C/filters/psp.html
	* C/filters/randomblends.html
	* C/filters/randomize.html
	* C/filters/rcm.html
	* C/filters/repdup.html
	* C/filters/repeat_last.html
	* C/filters/reshow_last.html
	* C/filters/ripple.html
	* C/filters/rotate.html
	* C/filters/roundsel.html
	* C/filters/sample_colorize.html
	* C/filters/scatter_hsv.html
	* C/filters/sel2path.html
	* C/filters/sel_gauss.html
	* C/filters/semiflatten.html
	* C/filters/sgi.html
	* C/filters/sharpen.html
	* C/filters/shift.html
	* C/filters/smooth_palette.html
	* C/filters/snoise.html
	* C/filters/spread.html
	* C/filters/stampify.html
	* C/filters/sunras.html
	* C/filters/terral_text.html
	* C/filters/tex-to-float.html
	* C/filters/tga.html
	* C/filters/threshold_alpha.html
	* C/filters/tiff.html
	* C/filters/tileable_blur.html
	* C/filters/tile.html
	* C/filters/url.html
	* C/filters/vinvert.html
	* C/filters/wmf.html
	* C/filters/xachvision.html
	* C/filters/xwd.html
	* C/filters/zealouscrop.html
	* C/gimp_license.html
	* C/gimp_remote.html
	* C/gimptool.html
	* C/glossary.html
	* C/image/edit/clear.html
	* C/image/edit/copy.html
	* C/image/edit/cut.html
	* C/image/edit/fill.html
	* C/image/edit/paste_as_new.html
	* C/image/edit/paste.html
	* C/image/edit/paste_into.html
	* C/image/edit/redo.html
	* C/image/edit/stroke.html
	* C/image/edit/undo.html
	* C/image/image/colors/auto/equalize.html
	* C/image/image/colors/desaturate.html
	* C/image/image/colors/invert.html
	* C/image/image/duplicate.html
	* C/image/image/mode/convert_to_grayscale.html
	* C/image/image/mode/convert_to_rgb.html
	* C/image/image_window.html
	* C/image/index.html
	* C/image/select/all.html
	* C/image/select/float.html
	* C/image/select/invert.html
	* C/image/select/none.html
	* C/image/select/save_to_channel.html
	* C/image/select/sharpen.html
	* C/images/Makefile.am
	* C/image/view/dot_for_dot.html
	* C/image/view/new_view.html
	* C/image/view/shrink_wrap.html
	* C/image/view/snap_to_guides.html
	* C/image/view/toggle_guides.html
	* C/image/view/toggle_rulers.html
	* C/image/view/toggle_selection.html
	* C/image/view/toggle_statusbar.html
	* C/image/view/zoom.html
	* C/index.html
	* C/introduction.html
	* C/keyboard_shortcuts.html
	* C/layers/add_alpha_channel.html
	* C/layers/alpha_to_selection.html
	* C/layers/anchor_layer.html
	* C/layers/apply_mask.html
	* C/layers/delete_layer.html
	* C/layers/delete_mask.html
	* C/layers/duplicate_layer.html
	* C/layers/flatten_image.html
	* C/layers/index.html
	* C/layers/layer_to_image_size.html
	* C/layers/mask_to_selection.html
	* C/layers/merge_down.html
	* C/layers/stack/stack.html
	* C/layers/using_layers.html
	* C/ln7.html
	* C/main_interface.html
	* C/Makefile.am
	* C/open/index.html
	* C/open/open_by_extension.html
	* C/paths/copy_path.html
	* C/paths/delete_path.html
	* C/paths/duplicate_path.html
	* C/paths/index.html
	* C/paths/new_path.html
	* C/paths/paste_path.html
	* C/paths/path_to_selection.html
	* C/paths/stroke_path.html
	* C/save/index.html
	* C/save/save_by_extension.html
	* C/toolbox/help/context_help.html
	* C/toolbox/index.html
	* C/toolbox/toolbox.html
	* C/tools/airbrush.html
	* C/tools/bezier_select.html
	* C/tools/blend.html
	* C/tools/brightness_contrast.html
	* C/tools/bucket_fill.html
	* C/tools/by_color_select.html
	* C/tools/clone.html
	* C/tools/color_balance.html
	* C/tools/color_picker.html
	* C/tools/convolve.html
	* C/tools/crop.html
	* C/tools/curves.html
	* C/tools/dodgeburn.html
	* C/tools/ellipse_select.html
	* C/tools/eraser.html
	* C/tools/flip.html
	* C/tools/free_select.html
	* C/tools/fuzzy_select.html
	* C/tools/histogram.html
	* C/tools/hue_saturation.html
	* C/tools/index.html
	* C/tools/ink.html
	* C/tools/intelligent_scissors.html
	* C/tools/levels.html
	* C/tools/magnify.html
	* C/tools/measure.html
	* C/tools/move.html
	* C/tools/paintbrush.html
	* C/tools/pencil.html
	* C/tools/posterize.html
	* C/tools/rect_select.html
	* C/tools/smudge.html
	* C/tools/text.html
	* C/tools/threshold.html
	* C/tools/transform.html
	* C/using_gimp.html
	* C/why_gimp.html
	* Makefile.am:
	Updated to the latest version from the converted SGML
	sources.

	* images/add_point.png
	* images/anchor_layer.png
	* images/channel_to_selection.png
	* images/.cvsignore
	* images/delete_channel.png
	* images/delete_directory.png
	* images/delete_layer.png
	* images/delete_path.png
	* images/dotted_square.png
	* images/duplicate_channel.png
	* images/duplicate_layer.png
	* images/duplicate_path.png
	* images/edit_point.png
	* images/eek.png
	* images/geezoom.png
	* images/layers_example.png
	* images/layers_overview.png
	* images/lower_channel.png
	* images/lower_directory.png
	* images/lower_layer.png
	* images/Makefile.am
	* images/new_channel.png
	* images/new_directory.png
	* images/new_path.png
	* images/new_point.png
	* images/note.png
	* images/path_to_selection.png
	* images/preview_box.png
	* images/raise_channel.png
	* images/raise_directory.png
	* images/raise_layer.png
	* images/red_square.png
	* images/remove_point.png
	* images/selection_to_path.png
	* images/stroke_path.png
	* images/tip.png
	* images/warning.png
	* images/wilber.png:
	Files which were moved to a different directory or are
	obsolete now.
2001-10-08 01:38:59 +00:00
Daniel Egger
bb4c7e413a This is a really large commit to update the help to the latest texts we
2001-09-07  Daniel Egger <degger@fhm.edu>

	This is a really large commit to update the help to the
	latest texts we have in the gimp-help module.

	* C/filters/animate_cells.html
	* C/filters/animationplay.html
	* C/filters/animoptimize.html
	* C/filters/apply_lens.html
	* C/filters/blended2.html
	* C/filters/blowinout.html
	* C/filters/border.html
	* C/filters/bumpmap.html
	* C/filters/cml_explorer.html
	* C/filters/convmatrix.html
	* C/filters/curve_bend.html
	* C/filters/deinterlace.html
	* C/filters/depthmerge.html
	* C/filters/despeckle.html
	* C/filters/destripe.html
	* C/filters/diffraction.html
	* C/filters/displace.html
	* C/filters/edge.html
	* C/filters/emboss.html
	* C/filters/engrave.html
	* C/filters/film.html
	* C/filters/fire.html
	* C/filters/flarefx.html
	* C/filters/fractalexplorer.html
	* C/filters/fractaltrace.html
	* C/filters/gap_frontends.html
	* C/filters/gap_navigator_dialog.html
	* C/filters/gap_plugins.html
	* C/filters/gdyntext.html
	* C/filters/gflare.html
	* C/filters/gimpressionist.html
	* C/filters/glasstile.html
	* C/filters/glowing_steel.html
	* C/filters/gouge.html
	* C/filters/ifscompose.html
	* C/filters/illusion.html
	* C/filters/imagemap.html
	* C/filters/image_tile.html
	* C/filters/iwarp.html
	* C/filters/laplace.html
	* C/filters/lic.html
	* C/filters/lighting.html
	* C/filters/logulator.html
	* C/filters/mapobject.html
	* C/filters/map_to_gradient.html
	* C/filters/mirrorsplit.html
	* C/filters/newsprint.html
	* C/filters/nlfilt.html
	* C/filters/nova.html
	* C/filters/pagecurl.html
	* C/filters/papertile.html
	* C/filters/perlotine.html
	* C/filters/pixelmap.html
	* C/filters/polar.html
	* C/filters/prep4gif.html
	* C/filters/resynth.html
	* C/filters/scratches.html
	* C/filters/sinus.html
	* C/filters/sobel.html
	* C/filters/sparkle.html
	* C/filters/struc.html
	* C/filters/tileit.html
	* C/filters/tiler.html
	* C/filters/translogo.html
	* C/filters/unsharp.html
	* C/filters/video.html
	* C/filters/vpropagate.html
	* C/filters/warp.html
	* C/filters/warp-sharp.html
	* C/filters/waves.html
	* C/filters/webify.html
	* C/filters/whirlpinch.html
	* C/filters/wind.html
	* C/filters/windify.html
	* C/filters/xachlego.html
	* C/filters/xachshadow.html
	* C/images/add_point.png
	* C/images/anchor_layer.png
	* C/images/channel_to_selection.png
	* C/images/delete_channel.png
	* C/images/delete_directory.png
	* C/images/delete_layer.png
	* C/images/delete_path.png
	* C/images/dotted_square.png
	* C/images/duplicate_channel.png
	* C/images/duplicate_layer.png
	* C/images/duplicate_path.png
	* C/images/edit_point.png
	* C/images/examples/border-selection-01.png
	* C/images/examples/border-selection-02.png
	* C/images/examples/Makefile.am
	* C/images/eye.png
	* C/images/geezoom.png
	* C/images/glossary/Makefile.am
	* C/images/glossary/modes-addition.png
	* C/images/glossary/modes-color.png
	* C/images/glossary/modes-darken.png
	* C/images/glossary/modes-difference.png
	* C/images/glossary/modes-dissolve.png
	* C/images/glossary/modes-divide.png
	* C/images/glossary/modes-hue.png
	* C/images/glossary/modes-lighten.png
	* C/images/glossary/modes-multiply.png
	* C/images/glossary/modes-normal2.png
	* C/images/glossary/modes-normal.png
	* C/images/glossary/modes-overlay.png
	* C/images/glossary/modes-saturation.png
	* C/images/glossary/modes-screen.png
	* C/images/glossary/modes-subtract.png
	* C/images/glossary/modes-value.png
	* C/images/layers_example.png
	* C/images/layers_overview.png
	* C/images/lower_channel.png
	* C/images/lower_directory.png
	* C/images/lower_layer.png
	* C/images/Makefile.am~
	* C/images/Makefile.am.orig
	* C/images/Makefile.in
	* C/images/new_channel.png
	* C/images/new_directory.png
	* C/images/new_path.png
	* C/images/new_point.png
	* C/images/path_to_selection.png
	* C/images/preview_box.png
	* C/images/raise_channel.png
	* C/images/raise_directory.png
	* C/images/raise_layer.png
	* C/images/red_square.png
	* C/images/remove_point.png
	* C/images/selection_to_path.png
	* C/images/stroke_path.png
	* C/images/tools/Makefile.am
	* C/images/tools/tool_airbrush.png
	* C/images/tools/tool_apartheid.png
	* C/images/tools/tool_bezier.png
	* C/images/tools/tool_blend.png
	* C/images/tools/tool_burndodge.png
	* C/images/tools/tool_convolver.png
	* C/images/tools/tool_crop.png
	* C/images/tools/tool_dodgeburn.png
	* C/images/tools/tool_ellipse_sel.png
	* C/images/tools/tool_eraser.png
	* C/images/tools/tool_fill.png
	* C/images/tools/tool_flip.png
	* C/images/tools/tool_free_sel.png
	* C/images/tools/tool_fuzzy_sel.png
	* C/images/tools/tool_gradient.png
	* C/images/tools/tool_ink.png
	* C/images/tools/tool_measure.png
	* C/images/tools/tool_move.png
	* C/images/tools/tool-opt-increment.png
	* C/images/tools/tool-opt-nonincrement.png
	* C/images/tools/tool_paintbrush.png
	* C/images/tools/tool_pencil.png
	* C/images/tools/tool_picker.png
	* C/images/tools/tool_rect_sel.png
	* C/images/tools/tool_scissors.png
	* C/images/tools/tool_smudge.png
	* C/images/tools/tool_smuge.png
	* C/images/tools/tool_text.png
	* C/images/tools/tool_transform.png
	* C/images/tools/tool_zoom.png
	* C/images/triangle.png
	* C/images/wilber.png
	* C/stylesheet-images/Makefile.am
	* C/stylesheet-images/note.gif
	* C/stylesheet-images/tip.gif
	* C/stylesheet-images/warning.gif:
	Added lots of new files.

	* C/bug_submission.html
	* C/channels/channel_to_selection.html
	* C/channels/delete_channel.html
	* C/channels/duplicate_channel.html
	* C/channels/index.html
	* C/channels/lower_channel.html
	* C/channels/raise_channel.html
	* C/command_line.html
	* C/contents.html
	* C/dialogs/about.html
	* C/dialogs/border_selection.html
	* C/dialogs/brush_editor.html
	* C/dialogs/brush_selection.html
	* C/dialogs/channels/channels.html
	* C/dialogs/channels/edit_channel_attributes.html
	* C/dialogs/channels/new_channel.html
	* C/dialogs/color_selectors/built_in.html
	* C/dialogs/color_selectors/gtk.html
	* C/dialogs/color_selectors/triangle.html
	* C/dialogs/color_selectors/watercolor.html
	* C/dialogs/convert_to_indexed.html
	* C/dialogs/copy_named.html
	* C/dialogs/cut_named.html
	* C/dialogs/device_status.html
	* C/dialogs/document_index.html
	* C/dialogs/edit_qmask_attributes.html
	* C/dialogs/error_console.html
	* C/dialogs/feather_selection.html
	* C/dialogs/file_new.html
	* C/dialogs/file_open.html
	* C/dialogs/file_save.html
	* C/dialogs/gradient_editor/copy_gradient.html
	* C/dialogs/gradient_editor/delete_gradient.html
	* C/dialogs/gradient_editor/gradient_editor.html
	* C/dialogs/gradient_editor/new_gradient.html
	* C/dialogs/gradient_editor/rename_gradient.html
	* C/dialogs/gradient_editor/replicate_segment.html
	* C/dialogs/gradient_editor/save_as_povray.html
	* C/dialogs/gradient_editor/split_segments_uniformly.html
	* C/dialogs/gradient_selection.html
	* C/dialogs/grow_selection.html
	* C/dialogs/help.html
	* C/dialogs/indexed_palette.html
	* C/dialogs/index.html
	* C/dialogs/info_window.html
	* C/dialogs/input_devices.html
	* C/dialogs/layers/add_layer_mask.html
	* C/dialogs/layers_and_channels.html
	* C/dialogs/layers/edit_layer_attributes.html
	* C/dialogs/layers/layer_boundary_size.html
	* C/dialogs/layers/layers.html
	* C/dialogs/layers/merge_visible_layers.html
	* C/dialogs/layers/new_layer.html
	* C/dialogs/layers/scale_layer.html
	* C/dialogs/module_browser.html
	* C/dialogs/navigation_window.html
	* C/dialogs/offset.html
	* C/dialogs/palette_editor/delete_palette.html
	* C/dialogs/palette_editor/import_palette.html
	* C/dialogs/palette_editor/merge_palette.html
	* C/dialogs/palette_editor/new_palette.html
	* C/dialogs/palette_editor/palette_editor.html
	* C/dialogs/palette_selection.html
	* C/dialogs/paste_named.html
	* C/dialogs/paths/edit_path_attributes.html
	* C/dialogs/paths/export_path.html
	* C/dialogs/paths/import_path.html
	* C/dialogs/paths/paths.html
	* C/dialogs/pattern_selection.html
	* C/dialogs/preferences/directories.html
	* C/dialogs/preferences/display.html
	* C/dialogs/preferences/environment.html
	* C/dialogs/preferences/interface.html
	* C/dialogs/preferences/monitor.html
	* C/dialogs/preferences/new_file.html
	* C/dialogs/preferences/preferences.html
	* C/dialogs/preferences/session.html
	* C/dialogs/really_close.html
	* C/dialogs/really_quit.html
	* C/dialogs/scale_image.html
	* C/dialogs/scale_layer_warn.html
	* C/dialogs/set_canvas_size.html
	* C/dialogs/shrink_selection.html
	* C/dialogs/tip_of_the_day.html
	* C/dialogs/tool_options.html
	* C/dialogs/undo_history.html
	* C/file/close.html
	* C/file_formats.html
	* C/file/index.html
	* C/file/last_opened.html
	* C/file/quit.html
	* C/file/revert.html
	* C/filters/alienmap2.html
	* C/filters/alienmap.html
	* C/filters/align_layers.html
	* C/filters/applycanvas.html
	* C/filters/autocrop.html
	* C/filters/autostretch_hsv.html
	* C/filters/blinds.html
	* C/filters/blur.html
	* C/filters/borderaverage.html
	* C/filters/burst.html
	* C/filters/bz2.html
	* C/filters/c_astretch.html
	* C/filters/centerguide.html
	* C/filters/checkerboard.html
	* C/filters/color_enhance.html
	* C/filters/colorify.html
	* C/filters/colortoalpha.html
	* C/filters/compose.html
	* C/filters/cubism.html
	* C/filters/decompose.html
	* C/filters/ditherize.html
	* C/filters/dust.html
	* C/filters/exchange.html
	* C/filters/fade-alpha.html
	* C/filters/fits.html
	* C/filters/fit-text.html
	* C/filters/flame.html
	* C/filters/fp.html
	* C/filters/frame_filter.html
	* C/filters/gap_filter.html
	* C/filters/gauss_iir.html
	* C/filters/gauss_rle.html
	* C/filters/gee_zoom.html
	* C/filters/gfig.html
	* C/filters/gih.html
	* C/filters/gqbist.html
	* C/filters/gradmap.html
	* C/filters/grid.html
	* C/filters/gtm.html
	* C/filters/guidegrid.html
	* C/filters/guide_remove.html
	* C/filters/guides_to_selection.html
	* C/filters/guillotine.html
	* C/filters/gz.html
	* C/filters/hot.html
	* C/filters/hrz.html
	* C/filters/index.html
	* C/filters/jigsaw.html
	* C/filters/jpeg.html
	* C/filters/layerfuncs.html
	* C/filters/mail.html
	* C/filters/Makefile.am
	* C/filters/mapcolor.html
	* C/filters/max_rgb.html
	* C/filters/maze.html
	* C/filters/mblur.html
	* C/filters/miff.html
	* C/filters/mosaic.html
	* C/filters/noisify.html
	* C/filters/none.html
	* C/filters/normalize.html
	* C/filters/oilify.html
	* C/filters/pat.html
	* C/filters/pixelize.html
	* C/filters/plasma.html
	* C/filters/png.html
	* C/filters/pnm.html
	* C/filters/print.html
	* C/filters/psp.html
	* C/filters/randomblends.html
	* C/filters/randomize.html
	* C/filters/rcm.html
	* C/filters/repdup.html
	* C/filters/repeat_last.html
	* C/filters/reshow_last.html
	* C/filters/ripple.html
	* C/filters/rotate.html
	* C/filters/roundsel.html
	* C/filters/sample_colorize.html
	* C/filters/scatter_hsv.html
	* C/filters/sel2path.html
	* C/filters/sel_gauss.html
	* C/filters/semiflatten.html
	* C/filters/sgi.html
	* C/filters/sharpen.html
	* C/filters/shift.html
	* C/filters/smooth_palette.html
	* C/filters/snoise.html
	* C/filters/spread.html
	* C/filters/stampify.html
	* C/filters/sunras.html
	* C/filters/terral_text.html
	* C/filters/tex-to-float.html
	* C/filters/tga.html
	* C/filters/threshold_alpha.html
	* C/filters/tiff.html
	* C/filters/tileable_blur.html
	* C/filters/tile.html
	* C/filters/url.html
	* C/filters/vinvert.html
	* C/filters/wmf.html
	* C/filters/xachvision.html
	* C/filters/xwd.html
	* C/filters/zealouscrop.html
	* C/gimp_license.html
	* C/gimp_remote.html
	* C/gimptool.html
	* C/glossary.html
	* C/image/edit/clear.html
	* C/image/edit/copy.html
	* C/image/edit/cut.html
	* C/image/edit/fill.html
	* C/image/edit/paste_as_new.html
	* C/image/edit/paste.html
	* C/image/edit/paste_into.html
	* C/image/edit/redo.html
	* C/image/edit/stroke.html
	* C/image/edit/undo.html
	* C/image/image/colors/auto/equalize.html
	* C/image/image/colors/desaturate.html
	* C/image/image/colors/invert.html
	* C/image/image/duplicate.html
	* C/image/image/mode/convert_to_grayscale.html
	* C/image/image/mode/convert_to_rgb.html
	* C/image/image_window.html
	* C/image/index.html
	* C/image/select/all.html
	* C/image/select/float.html
	* C/image/select/invert.html
	* C/image/select/none.html
	* C/image/select/save_to_channel.html
	* C/image/select/sharpen.html
	* C/images/Makefile.am
	* C/image/view/dot_for_dot.html
	* C/image/view/new_view.html
	* C/image/view/shrink_wrap.html
	* C/image/view/snap_to_guides.html
	* C/image/view/toggle_guides.html
	* C/image/view/toggle_rulers.html
	* C/image/view/toggle_selection.html
	* C/image/view/toggle_statusbar.html
	* C/image/view/zoom.html
	* C/index.html
	* C/introduction.html
	* C/keyboard_shortcuts.html
	* C/layers/add_alpha_channel.html
	* C/layers/alpha_to_selection.html
	* C/layers/anchor_layer.html
	* C/layers/apply_mask.html
	* C/layers/delete_layer.html
	* C/layers/delete_mask.html
	* C/layers/duplicate_layer.html
	* C/layers/flatten_image.html
	* C/layers/index.html
	* C/layers/layer_to_image_size.html
	* C/layers/mask_to_selection.html
	* C/layers/merge_down.html
	* C/layers/stack/stack.html
	* C/layers/using_layers.html
	* C/ln7.html
	* C/main_interface.html
	* C/Makefile.am
	* C/open/index.html
	* C/open/open_by_extension.html
	* C/paths/copy_path.html
	* C/paths/delete_path.html
	* C/paths/duplicate_path.html
	* C/paths/index.html
	* C/paths/new_path.html
	* C/paths/paste_path.html
	* C/paths/path_to_selection.html
	* C/paths/stroke_path.html
	* C/save/index.html
	* C/save/save_by_extension.html
	* C/toolbox/help/context_help.html
	* C/toolbox/index.html
	* C/toolbox/toolbox.html
	* C/tools/airbrush.html
	* C/tools/bezier_select.html
	* C/tools/blend.html
	* C/tools/brightness_contrast.html
	* C/tools/bucket_fill.html
	* C/tools/by_color_select.html
	* C/tools/clone.html
	* C/tools/color_balance.html
	* C/tools/color_picker.html
	* C/tools/convolve.html
	* C/tools/crop.html
	* C/tools/curves.html
	* C/tools/dodgeburn.html
	* C/tools/ellipse_select.html
	* C/tools/eraser.html
	* C/tools/flip.html
	* C/tools/free_select.html
	* C/tools/fuzzy_select.html
	* C/tools/histogram.html
	* C/tools/hue_saturation.html
	* C/tools/index.html
	* C/tools/ink.html
	* C/tools/intelligent_scissors.html
	* C/tools/levels.html
	* C/tools/magnify.html
	* C/tools/measure.html
	* C/tools/move.html
	* C/tools/paintbrush.html
	* C/tools/pencil.html
	* C/tools/posterize.html
	* C/tools/rect_select.html
	* C/tools/smudge.html
	* C/tools/text.html
	* C/tools/threshold.html
	* C/tools/transform.html
	* C/using_gimp.html
	* C/why_gimp.html
	* Makefile.am:
	Updated to the latest version from the converted SGML
	sources.

	* images/add_point.png
	* images/anchor_layer.png
	* images/channel_to_selection.png
	* images/.cvsignore
	* images/delete_channel.png
	* images/delete_directory.png
	* images/delete_layer.png
	* images/delete_path.png
	* images/dotted_square.png
	* images/duplicate_channel.png
	* images/duplicate_layer.png
	* images/duplicate_path.png
	* images/edit_point.png
	* images/eek.png
	* images/geezoom.png
	* images/layers_example.png
	* images/layers_overview.png
	* images/lower_channel.png
	* images/lower_directory.png
	* images/lower_layer.png
	* images/Makefile.am
	* images/new_channel.png
	* images/new_directory.png
	* images/new_path.png
	* images/new_point.png
	* images/note.png
	* images/path_to_selection.png
	* images/preview_box.png
	* images/raise_channel.png
	* images/raise_directory.png
	* images/raise_layer.png
	* images/red_square.png
	* images/remove_point.png
	* images/selection_to_path.png
	* images/stroke_path.png
	* images/tip.png
	* images/warning.png
	* images/wilber.png:
	Files which were moved to a different directory or are
	obsolete now.
2001-10-08 01:01:15 +00:00
Daniel Egger
29e1a6e6e4 This is a really large commit to update the help to the latest texts we
2001-09-07  Daniel Egger <degger@fhm.edu>

	This is a really large commit to update the help to the
	latest texts we have in the gimp-help module.

	* C/filters/animate_cells.html
	* C/filters/animationplay.html
	* C/filters/animoptimize.html
	* C/filters/apply_lens.html
	* C/filters/blended2.html
	* C/filters/blowinout.html
	* C/filters/border.html
	* C/filters/bumpmap.html
	* C/filters/cml_explorer.html
	* C/filters/convmatrix.html
	* C/filters/curve_bend.html
	* C/filters/deinterlace.html
	* C/filters/depthmerge.html
	* C/filters/despeckle.html
	* C/filters/destripe.html
	* C/filters/diffraction.html
	* C/filters/displace.html
	* C/filters/edge.html
	* C/filters/emboss.html
	* C/filters/engrave.html
	* C/filters/film.html
	* C/filters/fire.html
	* C/filters/flarefx.html
	* C/filters/fractalexplorer.html
	* C/filters/fractaltrace.html
	* C/filters/gap_frontends.html
	* C/filters/gap_navigator_dialog.html
	* C/filters/gap_plugins.html
	* C/filters/gdyntext.html
	* C/filters/gflare.html
	* C/filters/gimpressionist.html
	* C/filters/glasstile.html
	* C/filters/glowing_steel.html
	* C/filters/gouge.html
	* C/filters/ifscompose.html
	* C/filters/illusion.html
	* C/filters/imagemap.html
	* C/filters/image_tile.html
	* C/filters/iwarp.html
	* C/filters/laplace.html
	* C/filters/lic.html
	* C/filters/lighting.html
	* C/filters/logulator.html
	* C/filters/mapobject.html
	* C/filters/map_to_gradient.html
	* C/filters/mirrorsplit.html
	* C/filters/newsprint.html
	* C/filters/nlfilt.html
	* C/filters/nova.html
	* C/filters/pagecurl.html
	* C/filters/papertile.html
	* C/filters/perlotine.html
	* C/filters/pixelmap.html
	* C/filters/polar.html
	* C/filters/prep4gif.html
	* C/filters/resynth.html
	* C/filters/scratches.html
	* C/filters/sinus.html
	* C/filters/sobel.html
	* C/filters/sparkle.html
	* C/filters/struc.html
	* C/filters/tileit.html
	* C/filters/tiler.html
	* C/filters/translogo.html
	* C/filters/unsharp.html
	* C/filters/video.html
	* C/filters/vpropagate.html
	* C/filters/warp.html
	* C/filters/warp-sharp.html
	* C/filters/waves.html
	* C/filters/webify.html
	* C/filters/whirlpinch.html
	* C/filters/wind.html
	* C/filters/windify.html
	* C/filters/xachlego.html
	* C/filters/xachshadow.html
	* C/images/add_point.png
	* C/images/anchor_layer.png
	* C/images/channel_to_selection.png
	* C/images/delete_channel.png
	* C/images/delete_directory.png
	* C/images/delete_layer.png
	* C/images/delete_path.png
	* C/images/dotted_square.png
	* C/images/duplicate_channel.png
	* C/images/duplicate_layer.png
	* C/images/duplicate_path.png
	* C/images/edit_point.png
	* C/images/examples/border-selection-01.png
	* C/images/examples/border-selection-02.png
	* C/images/examples/Makefile.am
	* C/images/eye.png
	* C/images/geezoom.png
	* C/images/glossary/Makefile.am
	* C/images/glossary/modes-addition.png
	* C/images/glossary/modes-color.png
	* C/images/glossary/modes-darken.png
	* C/images/glossary/modes-difference.png
	* C/images/glossary/modes-dissolve.png
	* C/images/glossary/modes-divide.png
	* C/images/glossary/modes-hue.png
	* C/images/glossary/modes-lighten.png
	* C/images/glossary/modes-multiply.png
	* C/images/glossary/modes-normal2.png
	* C/images/glossary/modes-normal.png
	* C/images/glossary/modes-overlay.png
	* C/images/glossary/modes-saturation.png
	* C/images/glossary/modes-screen.png
	* C/images/glossary/modes-subtract.png
	* C/images/glossary/modes-value.png
	* C/images/layers_example.png
	* C/images/layers_overview.png
	* C/images/lower_channel.png
	* C/images/lower_directory.png
	* C/images/lower_layer.png
	* C/images/Makefile.am~
	* C/images/Makefile.am.orig
	* C/images/Makefile.in
	* C/images/new_channel.png
	* C/images/new_directory.png
	* C/images/new_path.png
	* C/images/new_point.png
	* C/images/path_to_selection.png
	* C/images/preview_box.png
	* C/images/raise_channel.png
	* C/images/raise_directory.png
	* C/images/raise_layer.png
	* C/images/red_square.png
	* C/images/remove_point.png
	* C/images/selection_to_path.png
	* C/images/stroke_path.png
	* C/images/tools/Makefile.am
	* C/images/tools/tool_airbrush.png
	* C/images/tools/tool_apartheid.png
	* C/images/tools/tool_bezier.png
	* C/images/tools/tool_blend.png
	* C/images/tools/tool_burndodge.png
	* C/images/tools/tool_convolver.png
	* C/images/tools/tool_crop.png
	* C/images/tools/tool_dodgeburn.png
	* C/images/tools/tool_ellipse_sel.png
	* C/images/tools/tool_eraser.png
	* C/images/tools/tool_fill.png
	* C/images/tools/tool_flip.png
	* C/images/tools/tool_free_sel.png
	* C/images/tools/tool_fuzzy_sel.png
	* C/images/tools/tool_gradient.png
	* C/images/tools/tool_ink.png
	* C/images/tools/tool_measure.png
	* C/images/tools/tool_move.png
	* C/images/tools/tool-opt-increment.png
	* C/images/tools/tool-opt-nonincrement.png
	* C/images/tools/tool_paintbrush.png
	* C/images/tools/tool_pencil.png
	* C/images/tools/tool_picker.png
	* C/images/tools/tool_rect_sel.png
	* C/images/tools/tool_scissors.png
	* C/images/tools/tool_smudge.png
	* C/images/tools/tool_smuge.png
	* C/images/tools/tool_text.png
	* C/images/tools/tool_transform.png
	* C/images/tools/tool_zoom.png
	* C/images/triangle.png
	* C/images/wilber.png
	* C/stylesheet-images/Makefile.am
	* C/stylesheet-images/note.gif
	* C/stylesheet-images/tip.gif
	* C/stylesheet-images/warning.gif:
	Added lots of new files.

	* C/bug_submission.html
	* C/channels/channel_to_selection.html
	* C/channels/delete_channel.html
	* C/channels/duplicate_channel.html
	* C/channels/index.html
	* C/channels/lower_channel.html
	* C/channels/raise_channel.html
	* C/command_line.html
	* C/contents.html
	* C/dialogs/about.html
	* C/dialogs/border_selection.html
	* C/dialogs/brush_editor.html
	* C/dialogs/brush_selection.html
	* C/dialogs/channels/channels.html
	* C/dialogs/channels/edit_channel_attributes.html
	* C/dialogs/channels/new_channel.html
	* C/dialogs/color_selectors/built_in.html
	* C/dialogs/color_selectors/gtk.html
	* C/dialogs/color_selectors/triangle.html
	* C/dialogs/color_selectors/watercolor.html
	* C/dialogs/convert_to_indexed.html
	* C/dialogs/copy_named.html
	* C/dialogs/cut_named.html
	* C/dialogs/device_status.html
	* C/dialogs/document_index.html
	* C/dialogs/edit_qmask_attributes.html
	* C/dialogs/error_console.html
	* C/dialogs/feather_selection.html
	* C/dialogs/file_new.html
	* C/dialogs/file_open.html
	* C/dialogs/file_save.html
	* C/dialogs/gradient_editor/copy_gradient.html
	* C/dialogs/gradient_editor/delete_gradient.html
	* C/dialogs/gradient_editor/gradient_editor.html
	* C/dialogs/gradient_editor/new_gradient.html
	* C/dialogs/gradient_editor/rename_gradient.html
	* C/dialogs/gradient_editor/replicate_segment.html
	* C/dialogs/gradient_editor/save_as_povray.html
	* C/dialogs/gradient_editor/split_segments_uniformly.html
	* C/dialogs/gradient_selection.html
	* C/dialogs/grow_selection.html
	* C/dialogs/help.html
	* C/dialogs/indexed_palette.html
	* C/dialogs/index.html
	* C/dialogs/info_window.html
	* C/dialogs/input_devices.html
	* C/dialogs/layers/add_layer_mask.html
	* C/dialogs/layers_and_channels.html
	* C/dialogs/layers/edit_layer_attributes.html
	* C/dialogs/layers/layer_boundary_size.html
	* C/dialogs/layers/layers.html
	* C/dialogs/layers/merge_visible_layers.html
	* C/dialogs/layers/new_layer.html
	* C/dialogs/layers/scale_layer.html
	* C/dialogs/module_browser.html
	* C/dialogs/navigation_window.html
	* C/dialogs/offset.html
	* C/dialogs/palette_editor/delete_palette.html
	* C/dialogs/palette_editor/import_palette.html
	* C/dialogs/palette_editor/merge_palette.html
	* C/dialogs/palette_editor/new_palette.html
	* C/dialogs/palette_editor/palette_editor.html
	* C/dialogs/palette_selection.html
	* C/dialogs/paste_named.html
	* C/dialogs/paths/edit_path_attributes.html
	* C/dialogs/paths/export_path.html
	* C/dialogs/paths/import_path.html
	* C/dialogs/paths/paths.html
	* C/dialogs/pattern_selection.html
	* C/dialogs/preferences/directories.html
	* C/dialogs/preferences/display.html
	* C/dialogs/preferences/environment.html
	* C/dialogs/preferences/interface.html
	* C/dialogs/preferences/monitor.html
	* C/dialogs/preferences/new_file.html
	* C/dialogs/preferences/preferences.html
	* C/dialogs/preferences/session.html
	* C/dialogs/really_close.html
	* C/dialogs/really_quit.html
	* C/dialogs/scale_image.html
	* C/dialogs/scale_layer_warn.html
	* C/dialogs/set_canvas_size.html
	* C/dialogs/shrink_selection.html
	* C/dialogs/tip_of_the_day.html
	* C/dialogs/tool_options.html
	* C/dialogs/undo_history.html
	* C/file/close.html
	* C/file_formats.html
	* C/file/index.html
	* C/file/last_opened.html
	* C/file/quit.html
	* C/file/revert.html
	* C/filters/alienmap2.html
	* C/filters/alienmap.html
	* C/filters/align_layers.html
	* C/filters/applycanvas.html
	* C/filters/autocrop.html
	* C/filters/autostretch_hsv.html
	* C/filters/blinds.html
	* C/filters/blur.html
	* C/filters/borderaverage.html
	* C/filters/burst.html
	* C/filters/bz2.html
	* C/filters/c_astretch.html
	* C/filters/centerguide.html
	* C/filters/checkerboard.html
	* C/filters/color_enhance.html
	* C/filters/colorify.html
	* C/filters/colortoalpha.html
	* C/filters/compose.html
	* C/filters/cubism.html
	* C/filters/decompose.html
	* C/filters/ditherize.html
	* C/filters/dust.html
	* C/filters/exchange.html
	* C/filters/fade-alpha.html
	* C/filters/fits.html
	* C/filters/fit-text.html
	* C/filters/flame.html
	* C/filters/fp.html
	* C/filters/frame_filter.html
	* C/filters/gap_filter.html
	* C/filters/gauss_iir.html
	* C/filters/gauss_rle.html
	* C/filters/gee_zoom.html
	* C/filters/gfig.html
	* C/filters/gih.html
	* C/filters/gqbist.html
	* C/filters/gradmap.html
	* C/filters/grid.html
	* C/filters/gtm.html
	* C/filters/guidegrid.html
	* C/filters/guide_remove.html
	* C/filters/guides_to_selection.html
	* C/filters/guillotine.html
	* C/filters/gz.html
	* C/filters/hot.html
	* C/filters/hrz.html
	* C/filters/index.html
	* C/filters/jigsaw.html
	* C/filters/jpeg.html
	* C/filters/layerfuncs.html
	* C/filters/mail.html
	* C/filters/Makefile.am
	* C/filters/mapcolor.html
	* C/filters/max_rgb.html
	* C/filters/maze.html
	* C/filters/mblur.html
	* C/filters/miff.html
	* C/filters/mosaic.html
	* C/filters/noisify.html
	* C/filters/none.html
	* C/filters/normalize.html
	* C/filters/oilify.html
	* C/filters/pat.html
	* C/filters/pixelize.html
	* C/filters/plasma.html
	* C/filters/png.html
	* C/filters/pnm.html
	* C/filters/print.html
	* C/filters/psp.html
	* C/filters/randomblends.html
	* C/filters/randomize.html
	* C/filters/rcm.html
	* C/filters/repdup.html
	* C/filters/repeat_last.html
	* C/filters/reshow_last.html
	* C/filters/ripple.html
	* C/filters/rotate.html
	* C/filters/roundsel.html
	* C/filters/sample_colorize.html
	* C/filters/scatter_hsv.html
	* C/filters/sel2path.html
	* C/filters/sel_gauss.html
	* C/filters/semiflatten.html
	* C/filters/sgi.html
	* C/filters/sharpen.html
	* C/filters/shift.html
	* C/filters/smooth_palette.html
	* C/filters/snoise.html
	* C/filters/spread.html
	* C/filters/stampify.html
	* C/filters/sunras.html
	* C/filters/terral_text.html
	* C/filters/tex-to-float.html
	* C/filters/tga.html
	* C/filters/threshold_alpha.html
	* C/filters/tiff.html
	* C/filters/tileable_blur.html
	* C/filters/tile.html
	* C/filters/url.html
	* C/filters/vinvert.html
	* C/filters/wmf.html
	* C/filters/xachvision.html
	* C/filters/xwd.html
	* C/filters/zealouscrop.html
	* C/gimp_license.html
	* C/gimp_remote.html
	* C/gimptool.html
	* C/glossary.html
	* C/image/edit/clear.html
	* C/image/edit/copy.html
	* C/image/edit/cut.html
	* C/image/edit/fill.html
	* C/image/edit/paste_as_new.html
	* C/image/edit/paste.html
	* C/image/edit/paste_into.html
	* C/image/edit/redo.html
	* C/image/edit/stroke.html
	* C/image/edit/undo.html
	* C/image/image/colors/auto/equalize.html
	* C/image/image/colors/desaturate.html
	* C/image/image/colors/invert.html
	* C/image/image/duplicate.html
	* C/image/image/mode/convert_to_grayscale.html
	* C/image/image/mode/convert_to_rgb.html
	* C/image/image_window.html
	* C/image/index.html
	* C/image/select/all.html
	* C/image/select/float.html
	* C/image/select/invert.html
	* C/image/select/none.html
	* C/image/select/save_to_channel.html
	* C/image/select/sharpen.html
	* C/images/Makefile.am
	* C/image/view/dot_for_dot.html
	* C/image/view/new_view.html
	* C/image/view/shrink_wrap.html
	* C/image/view/snap_to_guides.html
	* C/image/view/toggle_guides.html
	* C/image/view/toggle_rulers.html
	* C/image/view/toggle_selection.html
	* C/image/view/toggle_statusbar.html
	* C/image/view/zoom.html
	* C/index.html
	* C/introduction.html
	* C/keyboard_shortcuts.html
	* C/layers/add_alpha_channel.html
	* C/layers/alpha_to_selection.html
	* C/layers/anchor_layer.html
	* C/layers/apply_mask.html
	* C/layers/delete_layer.html
	* C/layers/delete_mask.html
	* C/layers/duplicate_layer.html
	* C/layers/flatten_image.html
	* C/layers/index.html
	* C/layers/layer_to_image_size.html
	* C/layers/mask_to_selection.html
	* C/layers/merge_down.html
	* C/layers/stack/stack.html
	* C/layers/using_layers.html
	* C/ln7.html
	* C/main_interface.html
	* C/Makefile.am
	* C/open/index.html
	* C/open/open_by_extension.html
	* C/paths/copy_path.html
	* C/paths/delete_path.html
	* C/paths/duplicate_path.html
	* C/paths/index.html
	* C/paths/new_path.html
	* C/paths/paste_path.html
	* C/paths/path_to_selection.html
	* C/paths/stroke_path.html
	* C/save/index.html
	* C/save/save_by_extension.html
	* C/toolbox/help/context_help.html
	* C/toolbox/index.html
	* C/toolbox/toolbox.html
	* C/tools/airbrush.html
	* C/tools/bezier_select.html
	* C/tools/blend.html
	* C/tools/brightness_contrast.html
	* C/tools/bucket_fill.html
	* C/tools/by_color_select.html
	* C/tools/clone.html
	* C/tools/color_balance.html
	* C/tools/color_picker.html
	* C/tools/convolve.html
	* C/tools/crop.html
	* C/tools/curves.html
	* C/tools/dodgeburn.html
	* C/tools/ellipse_select.html
	* C/tools/eraser.html
	* C/tools/flip.html
	* C/tools/free_select.html
	* C/tools/fuzzy_select.html
	* C/tools/histogram.html
	* C/tools/hue_saturation.html
	* C/tools/index.html
	* C/tools/ink.html
	* C/tools/intelligent_scissors.html
	* C/tools/levels.html
	* C/tools/magnify.html
	* C/tools/measure.html
	* C/tools/move.html
	* C/tools/paintbrush.html
	* C/tools/pencil.html
	* C/tools/posterize.html
	* C/tools/rect_select.html
	* C/tools/smudge.html
	* C/tools/text.html
	* C/tools/threshold.html
	* C/tools/transform.html
	* C/using_gimp.html
	* C/why_gimp.html
	* Makefile.am:
	Updated to the latest version from the converted SGML
	sources.

	* images/add_point.png
	* images/anchor_layer.png
	* images/channel_to_selection.png
	* images/.cvsignore
	* images/delete_channel.png
	* images/delete_directory.png
	* images/delete_layer.png
	* images/delete_path.png
	* images/dotted_square.png
	* images/duplicate_channel.png
	* images/duplicate_layer.png
	* images/duplicate_path.png
	* images/edit_point.png
	* images/eek.png
	* images/geezoom.png
	* images/layers_example.png
	* images/layers_overview.png
	* images/lower_channel.png
	* images/lower_directory.png
	* images/lower_layer.png
	* images/Makefile.am
	* images/new_channel.png
	* images/new_directory.png
	* images/new_path.png
	* images/new_point.png
	* images/note.png
	* images/path_to_selection.png
	* images/preview_box.png
	* images/raise_channel.png
	* images/raise_directory.png
	* images/raise_layer.png
	* images/red_square.png
	* images/remove_point.png
	* images/selection_to_path.png
	* images/stroke_path.png
	* images/tip.png
	* images/warning.png
	* images/wilber.png:
	Files which were moved to a different directory or are
	obsolete now.
2001-10-08 00:56:15 +00:00
Daniel Egger
b38ed3fac4 This is a really large commit to update the help to the latest texts we
2001-09-07  Daniel Egger <degger@fhm.edu>

	This is a really large commit to update the help to the
	latest texts we have in the gimp-help module.

	* C/filters/animate_cells.html
	* C/filters/animationplay.html
	* C/filters/animoptimize.html
	* C/filters/apply_lens.html
	* C/filters/blended2.html
	* C/filters/blowinout.html
	* C/filters/border.html
	* C/filters/bumpmap.html
	* C/filters/cml_explorer.html
	* C/filters/convmatrix.html
	* C/filters/curve_bend.html
	* C/filters/deinterlace.html
	* C/filters/depthmerge.html
	* C/filters/despeckle.html
	* C/filters/destripe.html
	* C/filters/diffraction.html
	* C/filters/displace.html
	* C/filters/edge.html
	* C/filters/emboss.html
	* C/filters/engrave.html
	* C/filters/film.html
	* C/filters/fire.html
	* C/filters/flarefx.html
	* C/filters/fractalexplorer.html
	* C/filters/fractaltrace.html
	* C/filters/gap_frontends.html
	* C/filters/gap_navigator_dialog.html
	* C/filters/gap_plugins.html
	* C/filters/gdyntext.html
	* C/filters/gflare.html
	* C/filters/gimpressionist.html
	* C/filters/glasstile.html
	* C/filters/glowing_steel.html
	* C/filters/gouge.html
	* C/filters/ifscompose.html
	* C/filters/illusion.html
	* C/filters/imagemap.html
	* C/filters/image_tile.html
	* C/filters/iwarp.html
	* C/filters/laplace.html
	* C/filters/lic.html
	* C/filters/lighting.html
	* C/filters/logulator.html
	* C/filters/mapobject.html
	* C/filters/map_to_gradient.html
	* C/filters/mirrorsplit.html
	* C/filters/newsprint.html
	* C/filters/nlfilt.html
	* C/filters/nova.html
	* C/filters/pagecurl.html
	* C/filters/papertile.html
	* C/filters/perlotine.html
	* C/filters/pixelmap.html
	* C/filters/polar.html
	* C/filters/prep4gif.html
	* C/filters/resynth.html
	* C/filters/scratches.html
	* C/filters/sinus.html
	* C/filters/sobel.html
	* C/filters/sparkle.html
	* C/filters/struc.html
	* C/filters/tileit.html
	* C/filters/tiler.html
	* C/filters/translogo.html
	* C/filters/unsharp.html
	* C/filters/video.html
	* C/filters/vpropagate.html
	* C/filters/warp.html
	* C/filters/warp-sharp.html
	* C/filters/waves.html
	* C/filters/webify.html
	* C/filters/whirlpinch.html
	* C/filters/wind.html
	* C/filters/windify.html
	* C/filters/xachlego.html
	* C/filters/xachshadow.html
	* C/images/add_point.png
	* C/images/anchor_layer.png
	* C/images/channel_to_selection.png
	* C/images/delete_channel.png
	* C/images/delete_directory.png
	* C/images/delete_layer.png
	* C/images/delete_path.png
	* C/images/dotted_square.png
	* C/images/duplicate_channel.png
	* C/images/duplicate_layer.png
	* C/images/duplicate_path.png
	* C/images/edit_point.png
	* C/images/examples/border-selection-01.png
	* C/images/examples/border-selection-02.png
	* C/images/examples/Makefile.am
	* C/images/eye.png
	* C/images/geezoom.png
	* C/images/glossary/Makefile.am
	* C/images/glossary/modes-addition.png
	* C/images/glossary/modes-color.png
	* C/images/glossary/modes-darken.png
	* C/images/glossary/modes-difference.png
	* C/images/glossary/modes-dissolve.png
	* C/images/glossary/modes-divide.png
	* C/images/glossary/modes-hue.png
	* C/images/glossary/modes-lighten.png
	* C/images/glossary/modes-multiply.png
	* C/images/glossary/modes-normal2.png
	* C/images/glossary/modes-normal.png
	* C/images/glossary/modes-overlay.png
	* C/images/glossary/modes-saturation.png
	* C/images/glossary/modes-screen.png
	* C/images/glossary/modes-subtract.png
	* C/images/glossary/modes-value.png
	* C/images/layers_example.png
	* C/images/layers_overview.png
	* C/images/lower_channel.png
	* C/images/lower_directory.png
	* C/images/lower_layer.png
	* C/images/Makefile.am~
	* C/images/Makefile.am.orig
	* C/images/Makefile.in
	* C/images/new_channel.png
	* C/images/new_directory.png
	* C/images/new_path.png
	* C/images/new_point.png
	* C/images/path_to_selection.png
	* C/images/preview_box.png
	* C/images/raise_channel.png
	* C/images/raise_directory.png
	* C/images/raise_layer.png
	* C/images/red_square.png
	* C/images/remove_point.png
	* C/images/selection_to_path.png
	* C/images/stroke_path.png
	* C/images/tools/Makefile.am
	* C/images/tools/tool_airbrush.png
	* C/images/tools/tool_apartheid.png
	* C/images/tools/tool_bezier.png
	* C/images/tools/tool_blend.png
	* C/images/tools/tool_burndodge.png
	* C/images/tools/tool_convolver.png
	* C/images/tools/tool_crop.png
	* C/images/tools/tool_dodgeburn.png
	* C/images/tools/tool_ellipse_sel.png
	* C/images/tools/tool_eraser.png
	* C/images/tools/tool_fill.png
	* C/images/tools/tool_flip.png
	* C/images/tools/tool_free_sel.png
	* C/images/tools/tool_fuzzy_sel.png
	* C/images/tools/tool_gradient.png
	* C/images/tools/tool_ink.png
	* C/images/tools/tool_measure.png
	* C/images/tools/tool_move.png
	* C/images/tools/tool-opt-increment.png
	* C/images/tools/tool-opt-nonincrement.png
	* C/images/tools/tool_paintbrush.png
	* C/images/tools/tool_pencil.png
	* C/images/tools/tool_picker.png
	* C/images/tools/tool_rect_sel.png
	* C/images/tools/tool_scissors.png
	* C/images/tools/tool_smudge.png
	* C/images/tools/tool_smuge.png
	* C/images/tools/tool_text.png
	* C/images/tools/tool_transform.png
	* C/images/tools/tool_zoom.png
	* C/images/triangle.png
	* C/images/wilber.png
	* C/stylesheet-images/Makefile.am
	* C/stylesheet-images/note.gif
	* C/stylesheet-images/tip.gif
	* C/stylesheet-images/warning.gif:
	Added lots of new files.

	* C/bug_submission.html
	* C/channels/channel_to_selection.html
	* C/channels/delete_channel.html
	* C/channels/duplicate_channel.html
	* C/channels/index.html
	* C/channels/lower_channel.html
	* C/channels/raise_channel.html
	* C/command_line.html
	* C/contents.html
	* C/dialogs/about.html
	* C/dialogs/border_selection.html
	* C/dialogs/brush_editor.html
	* C/dialogs/brush_selection.html
	* C/dialogs/channels/channels.html
	* C/dialogs/channels/edit_channel_attributes.html
	* C/dialogs/channels/new_channel.html
	* C/dialogs/color_selectors/built_in.html
	* C/dialogs/color_selectors/gtk.html
	* C/dialogs/color_selectors/triangle.html
	* C/dialogs/color_selectors/watercolor.html
	* C/dialogs/convert_to_indexed.html
	* C/dialogs/copy_named.html
	* C/dialogs/cut_named.html
	* C/dialogs/device_status.html
	* C/dialogs/document_index.html
	* C/dialogs/edit_qmask_attributes.html
	* C/dialogs/error_console.html
	* C/dialogs/feather_selection.html
	* C/dialogs/file_new.html
	* C/dialogs/file_open.html
	* C/dialogs/file_save.html
	* C/dialogs/gradient_editor/copy_gradient.html
	* C/dialogs/gradient_editor/delete_gradient.html
	* C/dialogs/gradient_editor/gradient_editor.html
	* C/dialogs/gradient_editor/new_gradient.html
	* C/dialogs/gradient_editor/rename_gradient.html
	* C/dialogs/gradient_editor/replicate_segment.html
	* C/dialogs/gradient_editor/save_as_povray.html
	* C/dialogs/gradient_editor/split_segments_uniformly.html
	* C/dialogs/gradient_selection.html
	* C/dialogs/grow_selection.html
	* C/dialogs/help.html
	* C/dialogs/indexed_palette.html
	* C/dialogs/index.html
	* C/dialogs/info_window.html
	* C/dialogs/input_devices.html
	* C/dialogs/layers/add_layer_mask.html
	* C/dialogs/layers_and_channels.html
	* C/dialogs/layers/edit_layer_attributes.html
	* C/dialogs/layers/layer_boundary_size.html
	* C/dialogs/layers/layers.html
	* C/dialogs/layers/merge_visible_layers.html
	* C/dialogs/layers/new_layer.html
	* C/dialogs/layers/scale_layer.html
	* C/dialogs/module_browser.html
	* C/dialogs/navigation_window.html
	* C/dialogs/offset.html
	* C/dialogs/palette_editor/delete_palette.html
	* C/dialogs/palette_editor/import_palette.html
	* C/dialogs/palette_editor/merge_palette.html
	* C/dialogs/palette_editor/new_palette.html
	* C/dialogs/palette_editor/palette_editor.html
	* C/dialogs/palette_selection.html
	* C/dialogs/paste_named.html
	* C/dialogs/paths/edit_path_attributes.html
	* C/dialogs/paths/export_path.html
	* C/dialogs/paths/import_path.html
	* C/dialogs/paths/paths.html
	* C/dialogs/pattern_selection.html
	* C/dialogs/preferences/directories.html
	* C/dialogs/preferences/display.html
	* C/dialogs/preferences/environment.html
	* C/dialogs/preferences/interface.html
	* C/dialogs/preferences/monitor.html
	* C/dialogs/preferences/new_file.html
	* C/dialogs/preferences/preferences.html
	* C/dialogs/preferences/session.html
	* C/dialogs/really_close.html
	* C/dialogs/really_quit.html
	* C/dialogs/scale_image.html
	* C/dialogs/scale_layer_warn.html
	* C/dialogs/set_canvas_size.html
	* C/dialogs/shrink_selection.html
	* C/dialogs/tip_of_the_day.html
	* C/dialogs/tool_options.html
	* C/dialogs/undo_history.html
	* C/file/close.html
	* C/file_formats.html
	* C/file/index.html
	* C/file/last_opened.html
	* C/file/quit.html
	* C/file/revert.html
	* C/filters/alienmap2.html
	* C/filters/alienmap.html
	* C/filters/align_layers.html
	* C/filters/applycanvas.html
	* C/filters/autocrop.html
	* C/filters/autostretch_hsv.html
	* C/filters/blinds.html
	* C/filters/blur.html
	* C/filters/borderaverage.html
	* C/filters/burst.html
	* C/filters/bz2.html
	* C/filters/c_astretch.html
	* C/filters/centerguide.html
	* C/filters/checkerboard.html
	* C/filters/color_enhance.html
	* C/filters/colorify.html
	* C/filters/colortoalpha.html
	* C/filters/compose.html
	* C/filters/cubism.html
	* C/filters/decompose.html
	* C/filters/ditherize.html
	* C/filters/dust.html
	* C/filters/exchange.html
	* C/filters/fade-alpha.html
	* C/filters/fits.html
	* C/filters/fit-text.html
	* C/filters/flame.html
	* C/filters/fp.html
	* C/filters/frame_filter.html
	* C/filters/gap_filter.html
	* C/filters/gauss_iir.html
	* C/filters/gauss_rle.html
	* C/filters/gee_zoom.html
	* C/filters/gfig.html
	* C/filters/gih.html
	* C/filters/gqbist.html
	* C/filters/gradmap.html
	* C/filters/grid.html
	* C/filters/gtm.html
	* C/filters/guidegrid.html
	* C/filters/guide_remove.html
	* C/filters/guides_to_selection.html
	* C/filters/guillotine.html
	* C/filters/gz.html
	* C/filters/hot.html
	* C/filters/hrz.html
	* C/filters/index.html
	* C/filters/jigsaw.html
	* C/filters/jpeg.html
	* C/filters/layerfuncs.html
	* C/filters/mail.html
	* C/filters/Makefile.am
	* C/filters/mapcolor.html
	* C/filters/max_rgb.html
	* C/filters/maze.html
	* C/filters/mblur.html
	* C/filters/miff.html
	* C/filters/mosaic.html
	* C/filters/noisify.html
	* C/filters/none.html
	* C/filters/normalize.html
	* C/filters/oilify.html
	* C/filters/pat.html
	* C/filters/pixelize.html
	* C/filters/plasma.html
	* C/filters/png.html
	* C/filters/pnm.html
	* C/filters/print.html
	* C/filters/psp.html
	* C/filters/randomblends.html
	* C/filters/randomize.html
	* C/filters/rcm.html
	* C/filters/repdup.html
	* C/filters/repeat_last.html
	* C/filters/reshow_last.html
	* C/filters/ripple.html
	* C/filters/rotate.html
	* C/filters/roundsel.html
	* C/filters/sample_colorize.html
	* C/filters/scatter_hsv.html
	* C/filters/sel2path.html
	* C/filters/sel_gauss.html
	* C/filters/semiflatten.html
	* C/filters/sgi.html
	* C/filters/sharpen.html
	* C/filters/shift.html
	* C/filters/smooth_palette.html
	* C/filters/snoise.html
	* C/filters/spread.html
	* C/filters/stampify.html
	* C/filters/sunras.html
	* C/filters/terral_text.html
	* C/filters/tex-to-float.html
	* C/filters/tga.html
	* C/filters/threshold_alpha.html
	* C/filters/tiff.html
	* C/filters/tileable_blur.html
	* C/filters/tile.html
	* C/filters/url.html
	* C/filters/vinvert.html
	* C/filters/wmf.html
	* C/filters/xachvision.html
	* C/filters/xwd.html
	* C/filters/zealouscrop.html
	* C/gimp_license.html
	* C/gimp_remote.html
	* C/gimptool.html
	* C/glossary.html
	* C/image/edit/clear.html
	* C/image/edit/copy.html
	* C/image/edit/cut.html
	* C/image/edit/fill.html
	* C/image/edit/paste_as_new.html
	* C/image/edit/paste.html
	* C/image/edit/paste_into.html
	* C/image/edit/redo.html
	* C/image/edit/stroke.html
	* C/image/edit/undo.html
	* C/image/image/colors/auto/equalize.html
	* C/image/image/colors/desaturate.html
	* C/image/image/colors/invert.html
	* C/image/image/duplicate.html
	* C/image/image/mode/convert_to_grayscale.html
	* C/image/image/mode/convert_to_rgb.html
	* C/image/image_window.html
	* C/image/index.html
	* C/image/select/all.html
	* C/image/select/float.html
	* C/image/select/invert.html
	* C/image/select/none.html
	* C/image/select/save_to_channel.html
	* C/image/select/sharpen.html
	* C/images/Makefile.am
	* C/image/view/dot_for_dot.html
	* C/image/view/new_view.html
	* C/image/view/shrink_wrap.html
	* C/image/view/snap_to_guides.html
	* C/image/view/toggle_guides.html
	* C/image/view/toggle_rulers.html
	* C/image/view/toggle_selection.html
	* C/image/view/toggle_statusbar.html
	* C/image/view/zoom.html
	* C/index.html
	* C/introduction.html
	* C/keyboard_shortcuts.html
	* C/layers/add_alpha_channel.html
	* C/layers/alpha_to_selection.html
	* C/layers/anchor_layer.html
	* C/layers/apply_mask.html
	* C/layers/delete_layer.html
	* C/layers/delete_mask.html
	* C/layers/duplicate_layer.html
	* C/layers/flatten_image.html
	* C/layers/index.html
	* C/layers/layer_to_image_size.html
	* C/layers/mask_to_selection.html
	* C/layers/merge_down.html
	* C/layers/stack/stack.html
	* C/layers/using_layers.html
	* C/ln7.html
	* C/main_interface.html
	* C/Makefile.am
	* C/open/index.html
	* C/open/open_by_extension.html
	* C/paths/copy_path.html
	* C/paths/delete_path.html
	* C/paths/duplicate_path.html
	* C/paths/index.html
	* C/paths/new_path.html
	* C/paths/paste_path.html
	* C/paths/path_to_selection.html
	* C/paths/stroke_path.html
	* C/save/index.html
	* C/save/save_by_extension.html
	* C/toolbox/help/context_help.html
	* C/toolbox/index.html
	* C/toolbox/toolbox.html
	* C/tools/airbrush.html
	* C/tools/bezier_select.html
	* C/tools/blend.html
	* C/tools/brightness_contrast.html
	* C/tools/bucket_fill.html
	* C/tools/by_color_select.html
	* C/tools/clone.html
	* C/tools/color_balance.html
	* C/tools/color_picker.html
	* C/tools/convolve.html
	* C/tools/crop.html
	* C/tools/curves.html
	* C/tools/dodgeburn.html
	* C/tools/ellipse_select.html
	* C/tools/eraser.html
	* C/tools/flip.html
	* C/tools/free_select.html
	* C/tools/fuzzy_select.html
	* C/tools/histogram.html
	* C/tools/hue_saturation.html
	* C/tools/index.html
	* C/tools/ink.html
	* C/tools/intelligent_scissors.html
	* C/tools/levels.html
	* C/tools/magnify.html
	* C/tools/measure.html
	* C/tools/move.html
	* C/tools/paintbrush.html
	* C/tools/pencil.html
	* C/tools/posterize.html
	* C/tools/rect_select.html
	* C/tools/smudge.html
	* C/tools/text.html
	* C/tools/threshold.html
	* C/tools/transform.html
	* C/using_gimp.html
	* C/why_gimp.html
	* Makefile.am:
	Updated to the latest version from the converted SGML
	sources.

	* images/add_point.png
	* images/anchor_layer.png
	* images/channel_to_selection.png
	* images/.cvsignore
	* images/delete_channel.png
	* images/delete_directory.png
	* images/delete_layer.png
	* images/delete_path.png
	* images/dotted_square.png
	* images/duplicate_channel.png
	* images/duplicate_layer.png
	* images/duplicate_path.png
	* images/edit_point.png
	* images/eek.png
	* images/geezoom.png
	* images/layers_example.png
	* images/layers_overview.png
	* images/lower_channel.png
	* images/lower_directory.png
	* images/lower_layer.png
	* images/Makefile.am
	* images/new_channel.png
	* images/new_directory.png
	* images/new_path.png
	* images/new_point.png
	* images/note.png
	* images/path_to_selection.png
	* images/preview_box.png
	* images/raise_channel.png
	* images/raise_directory.png
	* images/raise_layer.png
	* images/red_square.png
	* images/remove_point.png
	* images/selection_to_path.png
	* images/stroke_path.png
	* images/tip.png
	* images/warning.png
	* images/wilber.png:
	Files which were moved to a different directory or are
	obsolete now.
2001-10-08 00:52:19 +00:00
Daniel Egger
4acd20bbb2 This is a really large commit to update the help to the latest texts we
2001-09-07  Daniel Egger <degger@fhm.edu>

	This is a really large commit to update the help to the
	latest texts we have in the gimp-help module.

	* C/filters/animate_cells.html
	* C/filters/animationplay.html
	* C/filters/animoptimize.html
	* C/filters/apply_lens.html
	* C/filters/blended2.html
	* C/filters/blowinout.html
	* C/filters/border.html
	* C/filters/bumpmap.html
	* C/filters/cml_explorer.html
	* C/filters/convmatrix.html
	* C/filters/curve_bend.html
	* C/filters/deinterlace.html
	* C/filters/depthmerge.html
	* C/filters/despeckle.html
	* C/filters/destripe.html
	* C/filters/diffraction.html
	* C/filters/displace.html
	* C/filters/edge.html
	* C/filters/emboss.html
	* C/filters/engrave.html
	* C/filters/film.html
	* C/filters/fire.html
	* C/filters/flarefx.html
	* C/filters/fractalexplorer.html
	* C/filters/fractaltrace.html
	* C/filters/gap_frontends.html
	* C/filters/gap_navigator_dialog.html
	* C/filters/gap_plugins.html
	* C/filters/gdyntext.html
	* C/filters/gflare.html
	* C/filters/gimpressionist.html
	* C/filters/glasstile.html
	* C/filters/glowing_steel.html
	* C/filters/gouge.html
	* C/filters/ifscompose.html
	* C/filters/illusion.html
	* C/filters/imagemap.html
	* C/filters/image_tile.html
	* C/filters/iwarp.html
	* C/filters/laplace.html
	* C/filters/lic.html
	* C/filters/lighting.html
	* C/filters/logulator.html
	* C/filters/mapobject.html
	* C/filters/map_to_gradient.html
	* C/filters/mirrorsplit.html
	* C/filters/newsprint.html
	* C/filters/nlfilt.html
	* C/filters/nova.html
	* C/filters/pagecurl.html
	* C/filters/papertile.html
	* C/filters/perlotine.html
	* C/filters/pixelmap.html
	* C/filters/polar.html
	* C/filters/prep4gif.html
	* C/filters/resynth.html
	* C/filters/scratches.html
	* C/filters/sinus.html
	* C/filters/sobel.html
	* C/filters/sparkle.html
	* C/filters/struc.html
	* C/filters/tileit.html
	* C/filters/tiler.html
	* C/filters/translogo.html
	* C/filters/unsharp.html
	* C/filters/video.html
	* C/filters/vpropagate.html
	* C/filters/warp.html
	* C/filters/warp-sharp.html
	* C/filters/waves.html
	* C/filters/webify.html
	* C/filters/whirlpinch.html
	* C/filters/wind.html
	* C/filters/windify.html
	* C/filters/xachlego.html
	* C/filters/xachshadow.html
	* C/images/add_point.png
	* C/images/anchor_layer.png
	* C/images/channel_to_selection.png
	* C/images/delete_channel.png
	* C/images/delete_directory.png
	* C/images/delete_layer.png
	* C/images/delete_path.png
	* C/images/dotted_square.png
	* C/images/duplicate_channel.png
	* C/images/duplicate_layer.png
	* C/images/duplicate_path.png
	* C/images/edit_point.png
	* C/images/examples/border-selection-01.png
	* C/images/examples/border-selection-02.png
	* C/images/examples/Makefile.am
	* C/images/eye.png
	* C/images/geezoom.png
	* C/images/glossary/Makefile.am
	* C/images/glossary/modes-addition.png
	* C/images/glossary/modes-color.png
	* C/images/glossary/modes-darken.png
	* C/images/glossary/modes-difference.png
	* C/images/glossary/modes-dissolve.png
	* C/images/glossary/modes-divide.png
	* C/images/glossary/modes-hue.png
	* C/images/glossary/modes-lighten.png
	* C/images/glossary/modes-multiply.png
	* C/images/glossary/modes-normal2.png
	* C/images/glossary/modes-normal.png
	* C/images/glossary/modes-overlay.png
	* C/images/glossary/modes-saturation.png
	* C/images/glossary/modes-screen.png
	* C/images/glossary/modes-subtract.png
	* C/images/glossary/modes-value.png
	* C/images/layers_example.png
	* C/images/layers_overview.png
	* C/images/lower_channel.png
	* C/images/lower_directory.png
	* C/images/lower_layer.png
	* C/images/Makefile.am~
	* C/images/Makefile.am.orig
	* C/images/Makefile.in
	* C/images/new_channel.png
	* C/images/new_directory.png
	* C/images/new_path.png
	* C/images/new_point.png
	* C/images/path_to_selection.png
	* C/images/preview_box.png
	* C/images/raise_channel.png
	* C/images/raise_directory.png
	* C/images/raise_layer.png
	* C/images/red_square.png
	* C/images/remove_point.png
	* C/images/selection_to_path.png
	* C/images/stroke_path.png
	* C/images/tools/Makefile.am
	* C/images/tools/tool_airbrush.png
	* C/images/tools/tool_apartheid.png
	* C/images/tools/tool_bezier.png
	* C/images/tools/tool_blend.png
	* C/images/tools/tool_burndodge.png
	* C/images/tools/tool_convolver.png
	* C/images/tools/tool_crop.png
	* C/images/tools/tool_dodgeburn.png
	* C/images/tools/tool_ellipse_sel.png
	* C/images/tools/tool_eraser.png
	* C/images/tools/tool_fill.png
	* C/images/tools/tool_flip.png
	* C/images/tools/tool_free_sel.png
	* C/images/tools/tool_fuzzy_sel.png
	* C/images/tools/tool_gradient.png
	* C/images/tools/tool_ink.png
	* C/images/tools/tool_measure.png
	* C/images/tools/tool_move.png
	* C/images/tools/tool-opt-increment.png
	* C/images/tools/tool-opt-nonincrement.png
	* C/images/tools/tool_paintbrush.png
	* C/images/tools/tool_pencil.png
	* C/images/tools/tool_picker.png
	* C/images/tools/tool_rect_sel.png
	* C/images/tools/tool_scissors.png
	* C/images/tools/tool_smudge.png
	* C/images/tools/tool_smuge.png
	* C/images/tools/tool_text.png
	* C/images/tools/tool_transform.png
	* C/images/tools/tool_zoom.png
	* C/images/triangle.png
	* C/images/wilber.png
	* C/stylesheet-images/Makefile.am
	* C/stylesheet-images/note.gif
	* C/stylesheet-images/tip.gif
	* C/stylesheet-images/warning.gif:
	Added lots of new files.

	* C/bug_submission.html
	* C/channels/channel_to_selection.html
	* C/channels/delete_channel.html
	* C/channels/duplicate_channel.html
	* C/channels/index.html
	* C/channels/lower_channel.html
	* C/channels/raise_channel.html
	* C/command_line.html
	* C/contents.html
	* C/dialogs/about.html
	* C/dialogs/border_selection.html
	* C/dialogs/brush_editor.html
	* C/dialogs/brush_selection.html
	* C/dialogs/channels/channels.html
	* C/dialogs/channels/edit_channel_attributes.html
	* C/dialogs/channels/new_channel.html
	* C/dialogs/color_selectors/built_in.html
	* C/dialogs/color_selectors/gtk.html
	* C/dialogs/color_selectors/triangle.html
	* C/dialogs/color_selectors/watercolor.html
	* C/dialogs/convert_to_indexed.html
	* C/dialogs/copy_named.html
	* C/dialogs/cut_named.html
	* C/dialogs/device_status.html
	* C/dialogs/document_index.html
	* C/dialogs/edit_qmask_attributes.html
	* C/dialogs/error_console.html
	* C/dialogs/feather_selection.html
	* C/dialogs/file_new.html
	* C/dialogs/file_open.html
	* C/dialogs/file_save.html
	* C/dialogs/gradient_editor/copy_gradient.html
	* C/dialogs/gradient_editor/delete_gradient.html
	* C/dialogs/gradient_editor/gradient_editor.html
	* C/dialogs/gradient_editor/new_gradient.html
	* C/dialogs/gradient_editor/rename_gradient.html
	* C/dialogs/gradient_editor/replicate_segment.html
	* C/dialogs/gradient_editor/save_as_povray.html
	* C/dialogs/gradient_editor/split_segments_uniformly.html
	* C/dialogs/gradient_selection.html
	* C/dialogs/grow_selection.html
	* C/dialogs/help.html
	* C/dialogs/indexed_palette.html
	* C/dialogs/index.html
	* C/dialogs/info_window.html
	* C/dialogs/input_devices.html
	* C/dialogs/layers/add_layer_mask.html
	* C/dialogs/layers_and_channels.html
	* C/dialogs/layers/edit_layer_attributes.html
	* C/dialogs/layers/layer_boundary_size.html
	* C/dialogs/layers/layers.html
	* C/dialogs/layers/merge_visible_layers.html
	* C/dialogs/layers/new_layer.html
	* C/dialogs/layers/scale_layer.html
	* C/dialogs/module_browser.html
	* C/dialogs/navigation_window.html
	* C/dialogs/offset.html
	* C/dialogs/palette_editor/delete_palette.html
	* C/dialogs/palette_editor/import_palette.html
	* C/dialogs/palette_editor/merge_palette.html
	* C/dialogs/palette_editor/new_palette.html
	* C/dialogs/palette_editor/palette_editor.html
	* C/dialogs/palette_selection.html
	* C/dialogs/paste_named.html
	* C/dialogs/paths/edit_path_attributes.html
	* C/dialogs/paths/export_path.html
	* C/dialogs/paths/import_path.html
	* C/dialogs/paths/paths.html
	* C/dialogs/pattern_selection.html
	* C/dialogs/preferences/directories.html
	* C/dialogs/preferences/display.html
	* C/dialogs/preferences/environment.html
	* C/dialogs/preferences/interface.html
	* C/dialogs/preferences/monitor.html
	* C/dialogs/preferences/new_file.html
	* C/dialogs/preferences/preferences.html
	* C/dialogs/preferences/session.html
	* C/dialogs/really_close.html
	* C/dialogs/really_quit.html
	* C/dialogs/scale_image.html
	* C/dialogs/scale_layer_warn.html
	* C/dialogs/set_canvas_size.html
	* C/dialogs/shrink_selection.html
	* C/dialogs/tip_of_the_day.html
	* C/dialogs/tool_options.html
	* C/dialogs/undo_history.html
	* C/file/close.html
	* C/file_formats.html
	* C/file/index.html
	* C/file/last_opened.html
	* C/file/quit.html
	* C/file/revert.html
	* C/filters/alienmap2.html
	* C/filters/alienmap.html
	* C/filters/align_layers.html
	* C/filters/applycanvas.html
	* C/filters/autocrop.html
	* C/filters/autostretch_hsv.html
	* C/filters/blinds.html
	* C/filters/blur.html
	* C/filters/borderaverage.html
	* C/filters/burst.html
	* C/filters/bz2.html
	* C/filters/c_astretch.html
	* C/filters/centerguide.html
	* C/filters/checkerboard.html
	* C/filters/color_enhance.html
	* C/filters/colorify.html
	* C/filters/colortoalpha.html
	* C/filters/compose.html
	* C/filters/cubism.html
	* C/filters/decompose.html
	* C/filters/ditherize.html
	* C/filters/dust.html
	* C/filters/exchange.html
	* C/filters/fade-alpha.html
	* C/filters/fits.html
	* C/filters/fit-text.html
	* C/filters/flame.html
	* C/filters/fp.html
	* C/filters/frame_filter.html
	* C/filters/gap_filter.html
	* C/filters/gauss_iir.html
	* C/filters/gauss_rle.html
	* C/filters/gee_zoom.html
	* C/filters/gfig.html
	* C/filters/gih.html
	* C/filters/gqbist.html
	* C/filters/gradmap.html
	* C/filters/grid.html
	* C/filters/gtm.html
	* C/filters/guidegrid.html
	* C/filters/guide_remove.html
	* C/filters/guides_to_selection.html
	* C/filters/guillotine.html
	* C/filters/gz.html
	* C/filters/hot.html
	* C/filters/hrz.html
	* C/filters/index.html
	* C/filters/jigsaw.html
	* C/filters/jpeg.html
	* C/filters/layerfuncs.html
	* C/filters/mail.html
	* C/filters/Makefile.am
	* C/filters/mapcolor.html
	* C/filters/max_rgb.html
	* C/filters/maze.html
	* C/filters/mblur.html
	* C/filters/miff.html
	* C/filters/mosaic.html
	* C/filters/noisify.html
	* C/filters/none.html
	* C/filters/normalize.html
	* C/filters/oilify.html
	* C/filters/pat.html
	* C/filters/pixelize.html
	* C/filters/plasma.html
	* C/filters/png.html
	* C/filters/pnm.html
	* C/filters/print.html
	* C/filters/psp.html
	* C/filters/randomblends.html
	* C/filters/randomize.html
	* C/filters/rcm.html
	* C/filters/repdup.html
	* C/filters/repeat_last.html
	* C/filters/reshow_last.html
	* C/filters/ripple.html
	* C/filters/rotate.html
	* C/filters/roundsel.html
	* C/filters/sample_colorize.html
	* C/filters/scatter_hsv.html
	* C/filters/sel2path.html
	* C/filters/sel_gauss.html
	* C/filters/semiflatten.html
	* C/filters/sgi.html
	* C/filters/sharpen.html
	* C/filters/shift.html
	* C/filters/smooth_palette.html
	* C/filters/snoise.html
	* C/filters/spread.html
	* C/filters/stampify.html
	* C/filters/sunras.html
	* C/filters/terral_text.html
	* C/filters/tex-to-float.html
	* C/filters/tga.html
	* C/filters/threshold_alpha.html
	* C/filters/tiff.html
	* C/filters/tileable_blur.html
	* C/filters/tile.html
	* C/filters/url.html
	* C/filters/vinvert.html
	* C/filters/wmf.html
	* C/filters/xachvision.html
	* C/filters/xwd.html
	* C/filters/zealouscrop.html
	* C/gimp_license.html
	* C/gimp_remote.html
	* C/gimptool.html
	* C/glossary.html
	* C/image/edit/clear.html
	* C/image/edit/copy.html
	* C/image/edit/cut.html
	* C/image/edit/fill.html
	* C/image/edit/paste_as_new.html
	* C/image/edit/paste.html
	* C/image/edit/paste_into.html
	* C/image/edit/redo.html
	* C/image/edit/stroke.html
	* C/image/edit/undo.html
	* C/image/image/colors/auto/equalize.html
	* C/image/image/colors/desaturate.html
	* C/image/image/colors/invert.html
	* C/image/image/duplicate.html
	* C/image/image/mode/convert_to_grayscale.html
	* C/image/image/mode/convert_to_rgb.html
	* C/image/image_window.html
	* C/image/index.html
	* C/image/select/all.html
	* C/image/select/float.html
	* C/image/select/invert.html
	* C/image/select/none.html
	* C/image/select/save_to_channel.html
	* C/image/select/sharpen.html
	* C/images/Makefile.am
	* C/image/view/dot_for_dot.html
	* C/image/view/new_view.html
	* C/image/view/shrink_wrap.html
	* C/image/view/snap_to_guides.html
	* C/image/view/toggle_guides.html
	* C/image/view/toggle_rulers.html
	* C/image/view/toggle_selection.html
	* C/image/view/toggle_statusbar.html
	* C/image/view/zoom.html
	* C/index.html
	* C/introduction.html
	* C/keyboard_shortcuts.html
	* C/layers/add_alpha_channel.html
	* C/layers/alpha_to_selection.html
	* C/layers/anchor_layer.html
	* C/layers/apply_mask.html
	* C/layers/delete_layer.html
	* C/layers/delete_mask.html
	* C/layers/duplicate_layer.html
	* C/layers/flatten_image.html
	* C/layers/index.html
	* C/layers/layer_to_image_size.html
	* C/layers/mask_to_selection.html
	* C/layers/merge_down.html
	* C/layers/stack/stack.html
	* C/layers/using_layers.html
	* C/ln7.html
	* C/main_interface.html
	* C/Makefile.am
	* C/open/index.html
	* C/open/open_by_extension.html
	* C/paths/copy_path.html
	* C/paths/delete_path.html
	* C/paths/duplicate_path.html
	* C/paths/index.html
	* C/paths/new_path.html
	* C/paths/paste_path.html
	* C/paths/path_to_selection.html
	* C/paths/stroke_path.html
	* C/save/index.html
	* C/save/save_by_extension.html
	* C/toolbox/help/context_help.html
	* C/toolbox/index.html
	* C/toolbox/toolbox.html
	* C/tools/airbrush.html
	* C/tools/bezier_select.html
	* C/tools/blend.html
	* C/tools/brightness_contrast.html
	* C/tools/bucket_fill.html
	* C/tools/by_color_select.html
	* C/tools/clone.html
	* C/tools/color_balance.html
	* C/tools/color_picker.html
	* C/tools/convolve.html
	* C/tools/crop.html
	* C/tools/curves.html
	* C/tools/dodgeburn.html
	* C/tools/ellipse_select.html
	* C/tools/eraser.html
	* C/tools/flip.html
	* C/tools/free_select.html
	* C/tools/fuzzy_select.html
	* C/tools/histogram.html
	* C/tools/hue_saturation.html
	* C/tools/index.html
	* C/tools/ink.html
	* C/tools/intelligent_scissors.html
	* C/tools/levels.html
	* C/tools/magnify.html
	* C/tools/measure.html
	* C/tools/move.html
	* C/tools/paintbrush.html
	* C/tools/pencil.html
	* C/tools/posterize.html
	* C/tools/rect_select.html
	* C/tools/smudge.html
	* C/tools/text.html
	* C/tools/threshold.html
	* C/tools/transform.html
	* C/using_gimp.html
	* C/why_gimp.html
	* Makefile.am:
	Updated to the latest version from the converted SGML
	sources.

	* images/add_point.png
	* images/anchor_layer.png
	* images/channel_to_selection.png
	* images/.cvsignore
	* images/delete_channel.png
	* images/delete_directory.png
	* images/delete_layer.png
	* images/delete_path.png
	* images/dotted_square.png
	* images/duplicate_channel.png
	* images/duplicate_layer.png
	* images/duplicate_path.png
	* images/edit_point.png
	* images/eek.png
	* images/geezoom.png
	* images/layers_example.png
	* images/layers_overview.png
	* images/lower_channel.png
	* images/lower_directory.png
	* images/lower_layer.png
	* images/Makefile.am
	* images/new_channel.png
	* images/new_directory.png
	* images/new_path.png
	* images/new_point.png
	* images/note.png
	* images/path_to_selection.png
	* images/preview_box.png
	* images/raise_channel.png
	* images/raise_directory.png
	* images/raise_layer.png
	* images/red_square.png
	* images/remove_point.png
	* images/selection_to_path.png
	* images/stroke_path.png
	* images/tip.png
	* images/warning.png
	* images/wilber.png:
	Files which were moved to a different directory or are
	obsolete now.
2001-10-08 00:47:21 +00:00
Daniel Egger
86ee5f61a9 This is a really large commit to update the help to the latest texts we
2001-09-07  Daniel Egger <degger@fhm.edu>

	This is a really large commit to update the help to the
	latest texts we have in the gimp-help module.

	* C/filters/animate_cells.html
	* C/filters/animationplay.html
	* C/filters/animoptimize.html
	* C/filters/apply_lens.html
	* C/filters/blended2.html
	* C/filters/blowinout.html
	* C/filters/border.html
	* C/filters/bumpmap.html
	* C/filters/cml_explorer.html
	* C/filters/convmatrix.html
	* C/filters/curve_bend.html
	* C/filters/deinterlace.html
	* C/filters/depthmerge.html
	* C/filters/despeckle.html
	* C/filters/destripe.html
	* C/filters/diffraction.html
	* C/filters/displace.html
	* C/filters/edge.html
	* C/filters/emboss.html
	* C/filters/engrave.html
	* C/filters/film.html
	* C/filters/fire.html
	* C/filters/flarefx.html
	* C/filters/fractalexplorer.html
	* C/filters/fractaltrace.html
	* C/filters/gap_frontends.html
	* C/filters/gap_navigator_dialog.html
	* C/filters/gap_plugins.html
	* C/filters/gdyntext.html
	* C/filters/gflare.html
	* C/filters/gimpressionist.html
	* C/filters/glasstile.html
	* C/filters/glowing_steel.html
	* C/filters/gouge.html
	* C/filters/ifscompose.html
	* C/filters/illusion.html
	* C/filters/imagemap.html
	* C/filters/image_tile.html
	* C/filters/iwarp.html
	* C/filters/laplace.html
	* C/filters/lic.html
	* C/filters/lighting.html
	* C/filters/logulator.html
	* C/filters/mapobject.html
	* C/filters/map_to_gradient.html
	* C/filters/mirrorsplit.html
	* C/filters/newsprint.html
	* C/filters/nlfilt.html
	* C/filters/nova.html
	* C/filters/pagecurl.html
	* C/filters/papertile.html
	* C/filters/perlotine.html
	* C/filters/pixelmap.html
	* C/filters/polar.html
	* C/filters/prep4gif.html
	* C/filters/resynth.html
	* C/filters/scratches.html
	* C/filters/sinus.html
	* C/filters/sobel.html
	* C/filters/sparkle.html
	* C/filters/struc.html
	* C/filters/tileit.html
	* C/filters/tiler.html
	* C/filters/translogo.html
	* C/filters/unsharp.html
	* C/filters/video.html
	* C/filters/vpropagate.html
	* C/filters/warp.html
	* C/filters/warp-sharp.html
	* C/filters/waves.html
	* C/filters/webify.html
	* C/filters/whirlpinch.html
	* C/filters/wind.html
	* C/filters/windify.html
	* C/filters/xachlego.html
	* C/filters/xachshadow.html
	* C/images/add_point.png
	* C/images/anchor_layer.png
	* C/images/channel_to_selection.png
	* C/images/delete_channel.png
	* C/images/delete_directory.png
	* C/images/delete_layer.png
	* C/images/delete_path.png
	* C/images/dotted_square.png
	* C/images/duplicate_channel.png
	* C/images/duplicate_layer.png
	* C/images/duplicate_path.png
	* C/images/edit_point.png
	* C/images/examples/border-selection-01.png
	* C/images/examples/border-selection-02.png
	* C/images/examples/Makefile.am
	* C/images/eye.png
	* C/images/geezoom.png
	* C/images/glossary/Makefile.am
	* C/images/glossary/modes-addition.png
	* C/images/glossary/modes-color.png
	* C/images/glossary/modes-darken.png
	* C/images/glossary/modes-difference.png
	* C/images/glossary/modes-dissolve.png
	* C/images/glossary/modes-divide.png
	* C/images/glossary/modes-hue.png
	* C/images/glossary/modes-lighten.png
	* C/images/glossary/modes-multiply.png
	* C/images/glossary/modes-normal2.png
	* C/images/glossary/modes-normal.png
	* C/images/glossary/modes-overlay.png
	* C/images/glossary/modes-saturation.png
	* C/images/glossary/modes-screen.png
	* C/images/glossary/modes-subtract.png
	* C/images/glossary/modes-value.png
	* C/images/layers_example.png
	* C/images/layers_overview.png
	* C/images/lower_channel.png
	* C/images/lower_directory.png
	* C/images/lower_layer.png
	* C/images/Makefile.am~
	* C/images/Makefile.am.orig
	* C/images/Makefile.in
	* C/images/new_channel.png
	* C/images/new_directory.png
	* C/images/new_path.png
	* C/images/new_point.png
	* C/images/path_to_selection.png
	* C/images/preview_box.png
	* C/images/raise_channel.png
	* C/images/raise_directory.png
	* C/images/raise_layer.png
	* C/images/red_square.png
	* C/images/remove_point.png
	* C/images/selection_to_path.png
	* C/images/stroke_path.png
	* C/images/tools/Makefile.am
	* C/images/tools/tool_airbrush.png
	* C/images/tools/tool_apartheid.png
	* C/images/tools/tool_bezier.png
	* C/images/tools/tool_blend.png
	* C/images/tools/tool_burndodge.png
	* C/images/tools/tool_convolver.png
	* C/images/tools/tool_crop.png
	* C/images/tools/tool_dodgeburn.png
	* C/images/tools/tool_ellipse_sel.png
	* C/images/tools/tool_eraser.png
	* C/images/tools/tool_fill.png
	* C/images/tools/tool_flip.png
	* C/images/tools/tool_free_sel.png
	* C/images/tools/tool_fuzzy_sel.png
	* C/images/tools/tool_gradient.png
	* C/images/tools/tool_ink.png
	* C/images/tools/tool_measure.png
	* C/images/tools/tool_move.png
	* C/images/tools/tool-opt-increment.png
	* C/images/tools/tool-opt-nonincrement.png
	* C/images/tools/tool_paintbrush.png
	* C/images/tools/tool_pencil.png
	* C/images/tools/tool_picker.png
	* C/images/tools/tool_rect_sel.png
	* C/images/tools/tool_scissors.png
	* C/images/tools/tool_smudge.png
	* C/images/tools/tool_smuge.png
	* C/images/tools/tool_text.png
	* C/images/tools/tool_transform.png
	* C/images/tools/tool_zoom.png
	* C/images/triangle.png
	* C/images/wilber.png
	* C/stylesheet-images/Makefile.am
	* C/stylesheet-images/note.gif
	* C/stylesheet-images/tip.gif
	* C/stylesheet-images/warning.gif:
	Added lots of new files.

	* C/bug_submission.html
	* C/channels/channel_to_selection.html
	* C/channels/delete_channel.html
	* C/channels/duplicate_channel.html
	* C/channels/index.html
	* C/channels/lower_channel.html
	* C/channels/raise_channel.html
	* C/command_line.html
	* C/contents.html
	* C/dialogs/about.html
	* C/dialogs/border_selection.html
	* C/dialogs/brush_editor.html
	* C/dialogs/brush_selection.html
	* C/dialogs/channels/channels.html
	* C/dialogs/channels/edit_channel_attributes.html
	* C/dialogs/channels/new_channel.html
	* C/dialogs/color_selectors/built_in.html
	* C/dialogs/color_selectors/gtk.html
	* C/dialogs/color_selectors/triangle.html
	* C/dialogs/color_selectors/watercolor.html
	* C/dialogs/convert_to_indexed.html
	* C/dialogs/copy_named.html
	* C/dialogs/cut_named.html
	* C/dialogs/device_status.html
	* C/dialogs/document_index.html
	* C/dialogs/edit_qmask_attributes.html
	* C/dialogs/error_console.html
	* C/dialogs/feather_selection.html
	* C/dialogs/file_new.html
	* C/dialogs/file_open.html
	* C/dialogs/file_save.html
	* C/dialogs/gradient_editor/copy_gradient.html
	* C/dialogs/gradient_editor/delete_gradient.html
	* C/dialogs/gradient_editor/gradient_editor.html
	* C/dialogs/gradient_editor/new_gradient.html
	* C/dialogs/gradient_editor/rename_gradient.html
	* C/dialogs/gradient_editor/replicate_segment.html
	* C/dialogs/gradient_editor/save_as_povray.html
	* C/dialogs/gradient_editor/split_segments_uniformly.html
	* C/dialogs/gradient_selection.html
	* C/dialogs/grow_selection.html
	* C/dialogs/help.html
	* C/dialogs/indexed_palette.html
	* C/dialogs/index.html
	* C/dialogs/info_window.html
	* C/dialogs/input_devices.html
	* C/dialogs/layers/add_layer_mask.html
	* C/dialogs/layers_and_channels.html
	* C/dialogs/layers/edit_layer_attributes.html
	* C/dialogs/layers/layer_boundary_size.html
	* C/dialogs/layers/layers.html
	* C/dialogs/layers/merge_visible_layers.html
	* C/dialogs/layers/new_layer.html
	* C/dialogs/layers/scale_layer.html
	* C/dialogs/module_browser.html
	* C/dialogs/navigation_window.html
	* C/dialogs/offset.html
	* C/dialogs/palette_editor/delete_palette.html
	* C/dialogs/palette_editor/import_palette.html
	* C/dialogs/palette_editor/merge_palette.html
	* C/dialogs/palette_editor/new_palette.html
	* C/dialogs/palette_editor/palette_editor.html
	* C/dialogs/palette_selection.html
	* C/dialogs/paste_named.html
	* C/dialogs/paths/edit_path_attributes.html
	* C/dialogs/paths/export_path.html
	* C/dialogs/paths/import_path.html
	* C/dialogs/paths/paths.html
	* C/dialogs/pattern_selection.html
	* C/dialogs/preferences/directories.html
	* C/dialogs/preferences/display.html
	* C/dialogs/preferences/environment.html
	* C/dialogs/preferences/interface.html
	* C/dialogs/preferences/monitor.html
	* C/dialogs/preferences/new_file.html
	* C/dialogs/preferences/preferences.html
	* C/dialogs/preferences/session.html
	* C/dialogs/really_close.html
	* C/dialogs/really_quit.html
	* C/dialogs/scale_image.html
	* C/dialogs/scale_layer_warn.html
	* C/dialogs/set_canvas_size.html
	* C/dialogs/shrink_selection.html
	* C/dialogs/tip_of_the_day.html
	* C/dialogs/tool_options.html
	* C/dialogs/undo_history.html
	* C/file/close.html
	* C/file_formats.html
	* C/file/index.html
	* C/file/last_opened.html
	* C/file/quit.html
	* C/file/revert.html
	* C/filters/alienmap2.html
	* C/filters/alienmap.html
	* C/filters/align_layers.html
	* C/filters/applycanvas.html
	* C/filters/autocrop.html
	* C/filters/autostretch_hsv.html
	* C/filters/blinds.html
	* C/filters/blur.html
	* C/filters/borderaverage.html
	* C/filters/burst.html
	* C/filters/bz2.html
	* C/filters/c_astretch.html
	* C/filters/centerguide.html
	* C/filters/checkerboard.html
	* C/filters/color_enhance.html
	* C/filters/colorify.html
	* C/filters/colortoalpha.html
	* C/filters/compose.html
	* C/filters/cubism.html
	* C/filters/decompose.html
	* C/filters/ditherize.html
	* C/filters/dust.html
	* C/filters/exchange.html
	* C/filters/fade-alpha.html
	* C/filters/fits.html
	* C/filters/fit-text.html
	* C/filters/flame.html
	* C/filters/fp.html
	* C/filters/frame_filter.html
	* C/filters/gap_filter.html
	* C/filters/gauss_iir.html
	* C/filters/gauss_rle.html
	* C/filters/gee_zoom.html
	* C/filters/gfig.html
	* C/filters/gih.html
	* C/filters/gqbist.html
	* C/filters/gradmap.html
	* C/filters/grid.html
	* C/filters/gtm.html
	* C/filters/guidegrid.html
	* C/filters/guide_remove.html
	* C/filters/guides_to_selection.html
	* C/filters/guillotine.html
	* C/filters/gz.html
	* C/filters/hot.html
	* C/filters/hrz.html
	* C/filters/index.html
	* C/filters/jigsaw.html
	* C/filters/jpeg.html
	* C/filters/layerfuncs.html
	* C/filters/mail.html
	* C/filters/Makefile.am
	* C/filters/mapcolor.html
	* C/filters/max_rgb.html
	* C/filters/maze.html
	* C/filters/mblur.html
	* C/filters/miff.html
	* C/filters/mosaic.html
	* C/filters/noisify.html
	* C/filters/none.html
	* C/filters/normalize.html
	* C/filters/oilify.html
	* C/filters/pat.html
	* C/filters/pixelize.html
	* C/filters/plasma.html
	* C/filters/png.html
	* C/filters/pnm.html
	* C/filters/print.html
	* C/filters/psp.html
	* C/filters/randomblends.html
	* C/filters/randomize.html
	* C/filters/rcm.html
	* C/filters/repdup.html
	* C/filters/repeat_last.html
	* C/filters/reshow_last.html
	* C/filters/ripple.html
	* C/filters/rotate.html
	* C/filters/roundsel.html
	* C/filters/sample_colorize.html
	* C/filters/scatter_hsv.html
	* C/filters/sel2path.html
	* C/filters/sel_gauss.html
	* C/filters/semiflatten.html
	* C/filters/sgi.html
	* C/filters/sharpen.html
	* C/filters/shift.html
	* C/filters/smooth_palette.html
	* C/filters/snoise.html
	* C/filters/spread.html
	* C/filters/stampify.html
	* C/filters/sunras.html
	* C/filters/terral_text.html
	* C/filters/tex-to-float.html
	* C/filters/tga.html
	* C/filters/threshold_alpha.html
	* C/filters/tiff.html
	* C/filters/tileable_blur.html
	* C/filters/tile.html
	* C/filters/url.html
	* C/filters/vinvert.html
	* C/filters/wmf.html
	* C/filters/xachvision.html
	* C/filters/xwd.html
	* C/filters/zealouscrop.html
	* C/gimp_license.html
	* C/gimp_remote.html
	* C/gimptool.html
	* C/glossary.html
	* C/image/edit/clear.html
	* C/image/edit/copy.html
	* C/image/edit/cut.html
	* C/image/edit/fill.html
	* C/image/edit/paste_as_new.html
	* C/image/edit/paste.html
	* C/image/edit/paste_into.html
	* C/image/edit/redo.html
	* C/image/edit/stroke.html
	* C/image/edit/undo.html
	* C/image/image/colors/auto/equalize.html
	* C/image/image/colors/desaturate.html
	* C/image/image/colors/invert.html
	* C/image/image/duplicate.html
	* C/image/image/mode/convert_to_grayscale.html
	* C/image/image/mode/convert_to_rgb.html
	* C/image/image_window.html
	* C/image/index.html
	* C/image/select/all.html
	* C/image/select/float.html
	* C/image/select/invert.html
	* C/image/select/none.html
	* C/image/select/save_to_channel.html
	* C/image/select/sharpen.html
	* C/images/Makefile.am
	* C/image/view/dot_for_dot.html
	* C/image/view/new_view.html
	* C/image/view/shrink_wrap.html
	* C/image/view/snap_to_guides.html
	* C/image/view/toggle_guides.html
	* C/image/view/toggle_rulers.html
	* C/image/view/toggle_selection.html
	* C/image/view/toggle_statusbar.html
	* C/image/view/zoom.html
	* C/index.html
	* C/introduction.html
	* C/keyboard_shortcuts.html
	* C/layers/add_alpha_channel.html
	* C/layers/alpha_to_selection.html
	* C/layers/anchor_layer.html
	* C/layers/apply_mask.html
	* C/layers/delete_layer.html
	* C/layers/delete_mask.html
	* C/layers/duplicate_layer.html
	* C/layers/flatten_image.html
	* C/layers/index.html
	* C/layers/layer_to_image_size.html
	* C/layers/mask_to_selection.html
	* C/layers/merge_down.html
	* C/layers/stack/stack.html
	* C/layers/using_layers.html
	* C/ln7.html
	* C/main_interface.html
	* C/Makefile.am
	* C/open/index.html
	* C/open/open_by_extension.html
	* C/paths/copy_path.html
	* C/paths/delete_path.html
	* C/paths/duplicate_path.html
	* C/paths/index.html
	* C/paths/new_path.html
	* C/paths/paste_path.html
	* C/paths/path_to_selection.html
	* C/paths/stroke_path.html
	* C/save/index.html
	* C/save/save_by_extension.html
	* C/toolbox/help/context_help.html
	* C/toolbox/index.html
	* C/toolbox/toolbox.html
	* C/tools/airbrush.html
	* C/tools/bezier_select.html
	* C/tools/blend.html
	* C/tools/brightness_contrast.html
	* C/tools/bucket_fill.html
	* C/tools/by_color_select.html
	* C/tools/clone.html
	* C/tools/color_balance.html
	* C/tools/color_picker.html
	* C/tools/convolve.html
	* C/tools/crop.html
	* C/tools/curves.html
	* C/tools/dodgeburn.html
	* C/tools/ellipse_select.html
	* C/tools/eraser.html
	* C/tools/flip.html
	* C/tools/free_select.html
	* C/tools/fuzzy_select.html
	* C/tools/histogram.html
	* C/tools/hue_saturation.html
	* C/tools/index.html
	* C/tools/ink.html
	* C/tools/intelligent_scissors.html
	* C/tools/levels.html
	* C/tools/magnify.html
	* C/tools/measure.html
	* C/tools/move.html
	* C/tools/paintbrush.html
	* C/tools/pencil.html
	* C/tools/posterize.html
	* C/tools/rect_select.html
	* C/tools/smudge.html
	* C/tools/text.html
	* C/tools/threshold.html
	* C/tools/transform.html
	* C/using_gimp.html
	* C/why_gimp.html
	* Makefile.am:
	Updated to the latest version from the converted SGML
	sources.

	* images/add_point.png
	* images/anchor_layer.png
	* images/channel_to_selection.png
	* images/.cvsignore
	* images/delete_channel.png
	* images/delete_directory.png
	* images/delete_layer.png
	* images/delete_path.png
	* images/dotted_square.png
	* images/duplicate_channel.png
	* images/duplicate_layer.png
	* images/duplicate_path.png
	* images/edit_point.png
	* images/eek.png
	* images/geezoom.png
	* images/layers_example.png
	* images/layers_overview.png
	* images/lower_channel.png
	* images/lower_directory.png
	* images/lower_layer.png
	* images/Makefile.am
	* images/new_channel.png
	* images/new_directory.png
	* images/new_path.png
	* images/new_point.png
	* images/note.png
	* images/path_to_selection.png
	* images/preview_box.png
	* images/raise_channel.png
	* images/raise_directory.png
	* images/raise_layer.png
	* images/red_square.png
	* images/remove_point.png
	* images/selection_to_path.png
	* images/stroke_path.png
	* images/tip.png
	* images/warning.png
	* images/wilber.png:
	Files which were moved to a different directory or are
	obsolete now.
2001-10-08 00:40:06 +00:00
Daniel Egger
a32b7dc1f0 This is a really large commit to update the help to the latest texts we
2001-09-07  Daniel Egger <degger@fhm.edu>

	This is a really large commit to update the help to the
	latest texts we have in the gimp-help module.

	* C/filters/animate_cells.html
	* C/filters/animationplay.html
	* C/filters/animoptimize.html
	* C/filters/apply_lens.html
	* C/filters/blended2.html
	* C/filters/blowinout.html
	* C/filters/border.html
	* C/filters/bumpmap.html
	* C/filters/cml_explorer.html
	* C/filters/convmatrix.html
	* C/filters/curve_bend.html
	* C/filters/deinterlace.html
	* C/filters/depthmerge.html
	* C/filters/despeckle.html
	* C/filters/destripe.html
	* C/filters/diffraction.html
	* C/filters/displace.html
	* C/filters/edge.html
	* C/filters/emboss.html
	* C/filters/engrave.html
	* C/filters/film.html
	* C/filters/fire.html
	* C/filters/flarefx.html
	* C/filters/fractalexplorer.html
	* C/filters/fractaltrace.html
	* C/filters/gap_frontends.html
	* C/filters/gap_navigator_dialog.html
	* C/filters/gap_plugins.html
	* C/filters/gdyntext.html
	* C/filters/gflare.html
	* C/filters/gimpressionist.html
	* C/filters/glasstile.html
	* C/filters/glowing_steel.html
	* C/filters/gouge.html
	* C/filters/ifscompose.html
	* C/filters/illusion.html
	* C/filters/imagemap.html
	* C/filters/image_tile.html
	* C/filters/iwarp.html
	* C/filters/laplace.html
	* C/filters/lic.html
	* C/filters/lighting.html
	* C/filters/logulator.html
	* C/filters/mapobject.html
	* C/filters/map_to_gradient.html
	* C/filters/mirrorsplit.html
	* C/filters/newsprint.html
	* C/filters/nlfilt.html
	* C/filters/nova.html
	* C/filters/pagecurl.html
	* C/filters/papertile.html
	* C/filters/perlotine.html
	* C/filters/pixelmap.html
	* C/filters/polar.html
	* C/filters/prep4gif.html
	* C/filters/resynth.html
	* C/filters/scratches.html
	* C/filters/sinus.html
	* C/filters/sobel.html
	* C/filters/sparkle.html
	* C/filters/struc.html
	* C/filters/tileit.html
	* C/filters/tiler.html
	* C/filters/translogo.html
	* C/filters/unsharp.html
	* C/filters/video.html
	* C/filters/vpropagate.html
	* C/filters/warp.html
	* C/filters/warp-sharp.html
	* C/filters/waves.html
	* C/filters/webify.html
	* C/filters/whirlpinch.html
	* C/filters/wind.html
	* C/filters/windify.html
	* C/filters/xachlego.html
	* C/filters/xachshadow.html
	* C/images/add_point.png
	* C/images/anchor_layer.png
	* C/images/channel_to_selection.png
	* C/images/delete_channel.png
	* C/images/delete_directory.png
	* C/images/delete_layer.png
	* C/images/delete_path.png
	* C/images/dotted_square.png
	* C/images/duplicate_channel.png
	* C/images/duplicate_layer.png
	* C/images/duplicate_path.png
	* C/images/edit_point.png
	* C/images/examples/border-selection-01.png
	* C/images/examples/border-selection-02.png
	* C/images/examples/Makefile.am
	* C/images/eye.png
	* C/images/geezoom.png
	* C/images/glossary/Makefile.am
	* C/images/glossary/modes-addition.png
	* C/images/glossary/modes-color.png
	* C/images/glossary/modes-darken.png
	* C/images/glossary/modes-difference.png
	* C/images/glossary/modes-dissolve.png
	* C/images/glossary/modes-divide.png
	* C/images/glossary/modes-hue.png
	* C/images/glossary/modes-lighten.png
	* C/images/glossary/modes-multiply.png
	* C/images/glossary/modes-normal2.png
	* C/images/glossary/modes-normal.png
	* C/images/glossary/modes-overlay.png
	* C/images/glossary/modes-saturation.png
	* C/images/glossary/modes-screen.png
	* C/images/glossary/modes-subtract.png
	* C/images/glossary/modes-value.png
	* C/images/layers_example.png
	* C/images/layers_overview.png
	* C/images/lower_channel.png
	* C/images/lower_directory.png
	* C/images/lower_layer.png
	* C/images/Makefile.am~
	* C/images/Makefile.am.orig
	* C/images/Makefile.in
	* C/images/new_channel.png
	* C/images/new_directory.png
	* C/images/new_path.png
	* C/images/new_point.png
	* C/images/path_to_selection.png
	* C/images/preview_box.png
	* C/images/raise_channel.png
	* C/images/raise_directory.png
	* C/images/raise_layer.png
	* C/images/red_square.png
	* C/images/remove_point.png
	* C/images/selection_to_path.png
	* C/images/stroke_path.png
	* C/images/tools/Makefile.am
	* C/images/tools/tool_airbrush.png
	* C/images/tools/tool_apartheid.png
	* C/images/tools/tool_bezier.png
	* C/images/tools/tool_blend.png
	* C/images/tools/tool_burndodge.png
	* C/images/tools/tool_convolver.png
	* C/images/tools/tool_crop.png
	* C/images/tools/tool_dodgeburn.png
	* C/images/tools/tool_ellipse_sel.png
	* C/images/tools/tool_eraser.png
	* C/images/tools/tool_fill.png
	* C/images/tools/tool_flip.png
	* C/images/tools/tool_free_sel.png
	* C/images/tools/tool_fuzzy_sel.png
	* C/images/tools/tool_gradient.png
	* C/images/tools/tool_ink.png
	* C/images/tools/tool_measure.png
	* C/images/tools/tool_move.png
	* C/images/tools/tool-opt-increment.png
	* C/images/tools/tool-opt-nonincrement.png
	* C/images/tools/tool_paintbrush.png
	* C/images/tools/tool_pencil.png
	* C/images/tools/tool_picker.png
	* C/images/tools/tool_rect_sel.png
	* C/images/tools/tool_scissors.png
	* C/images/tools/tool_smudge.png
	* C/images/tools/tool_smuge.png
	* C/images/tools/tool_text.png
	* C/images/tools/tool_transform.png
	* C/images/tools/tool_zoom.png
	* C/images/triangle.png
	* C/images/wilber.png
	* C/stylesheet-images/Makefile.am
	* C/stylesheet-images/note.gif
	* C/stylesheet-images/tip.gif
	* C/stylesheet-images/warning.gif:
	Added lots of new files.

	* C/bug_submission.html
	* C/channels/channel_to_selection.html
	* C/channels/delete_channel.html
	* C/channels/duplicate_channel.html
	* C/channels/index.html
	* C/channels/lower_channel.html
	* C/channels/raise_channel.html
	* C/command_line.html
	* C/contents.html
	* C/dialogs/about.html
	* C/dialogs/border_selection.html
	* C/dialogs/brush_editor.html
	* C/dialogs/brush_selection.html
	* C/dialogs/channels/channels.html
	* C/dialogs/channels/edit_channel_attributes.html
	* C/dialogs/channels/new_channel.html
	* C/dialogs/color_selectors/built_in.html
	* C/dialogs/color_selectors/gtk.html
	* C/dialogs/color_selectors/triangle.html
	* C/dialogs/color_selectors/watercolor.html
	* C/dialogs/convert_to_indexed.html
	* C/dialogs/copy_named.html
	* C/dialogs/cut_named.html
	* C/dialogs/device_status.html
	* C/dialogs/document_index.html
	* C/dialogs/edit_qmask_attributes.html
	* C/dialogs/error_console.html
	* C/dialogs/feather_selection.html
	* C/dialogs/file_new.html
	* C/dialogs/file_open.html
	* C/dialogs/file_save.html
	* C/dialogs/gradient_editor/copy_gradient.html
	* C/dialogs/gradient_editor/delete_gradient.html
	* C/dialogs/gradient_editor/gradient_editor.html
	* C/dialogs/gradient_editor/new_gradient.html
	* C/dialogs/gradient_editor/rename_gradient.html
	* C/dialogs/gradient_editor/replicate_segment.html
	* C/dialogs/gradient_editor/save_as_povray.html
	* C/dialogs/gradient_editor/split_segments_uniformly.html
	* C/dialogs/gradient_selection.html
	* C/dialogs/grow_selection.html
	* C/dialogs/help.html
	* C/dialogs/indexed_palette.html
	* C/dialogs/index.html
	* C/dialogs/info_window.html
	* C/dialogs/input_devices.html
	* C/dialogs/layers/add_layer_mask.html
	* C/dialogs/layers_and_channels.html
	* C/dialogs/layers/edit_layer_attributes.html
	* C/dialogs/layers/layer_boundary_size.html
	* C/dialogs/layers/layers.html
	* C/dialogs/layers/merge_visible_layers.html
	* C/dialogs/layers/new_layer.html
	* C/dialogs/layers/scale_layer.html
	* C/dialogs/module_browser.html
	* C/dialogs/navigation_window.html
	* C/dialogs/offset.html
	* C/dialogs/palette_editor/delete_palette.html
	* C/dialogs/palette_editor/import_palette.html
	* C/dialogs/palette_editor/merge_palette.html
	* C/dialogs/palette_editor/new_palette.html
	* C/dialogs/palette_editor/palette_editor.html
	* C/dialogs/palette_selection.html
	* C/dialogs/paste_named.html
	* C/dialogs/paths/edit_path_attributes.html
	* C/dialogs/paths/export_path.html
	* C/dialogs/paths/import_path.html
	* C/dialogs/paths/paths.html
	* C/dialogs/pattern_selection.html
	* C/dialogs/preferences/directories.html
	* C/dialogs/preferences/display.html
	* C/dialogs/preferences/environment.html
	* C/dialogs/preferences/interface.html
	* C/dialogs/preferences/monitor.html
	* C/dialogs/preferences/new_file.html
	* C/dialogs/preferences/preferences.html
	* C/dialogs/preferences/session.html
	* C/dialogs/really_close.html
	* C/dialogs/really_quit.html
	* C/dialogs/scale_image.html
	* C/dialogs/scale_layer_warn.html
	* C/dialogs/set_canvas_size.html
	* C/dialogs/shrink_selection.html
	* C/dialogs/tip_of_the_day.html
	* C/dialogs/tool_options.html
	* C/dialogs/undo_history.html
	* C/file/close.html
	* C/file_formats.html
	* C/file/index.html
	* C/file/last_opened.html
	* C/file/quit.html
	* C/file/revert.html
	* C/filters/alienmap2.html
	* C/filters/alienmap.html
	* C/filters/align_layers.html
	* C/filters/applycanvas.html
	* C/filters/autocrop.html
	* C/filters/autostretch_hsv.html
	* C/filters/blinds.html
	* C/filters/blur.html
	* C/filters/borderaverage.html
	* C/filters/burst.html
	* C/filters/bz2.html
	* C/filters/c_astretch.html
	* C/filters/centerguide.html
	* C/filters/checkerboard.html
	* C/filters/color_enhance.html
	* C/filters/colorify.html
	* C/filters/colortoalpha.html
	* C/filters/compose.html
	* C/filters/cubism.html
	* C/filters/decompose.html
	* C/filters/ditherize.html
	* C/filters/dust.html
	* C/filters/exchange.html
	* C/filters/fade-alpha.html
	* C/filters/fits.html
	* C/filters/fit-text.html
	* C/filters/flame.html
	* C/filters/fp.html
	* C/filters/frame_filter.html
	* C/filters/gap_filter.html
	* C/filters/gauss_iir.html
	* C/filters/gauss_rle.html
	* C/filters/gee_zoom.html
	* C/filters/gfig.html
	* C/filters/gih.html
	* C/filters/gqbist.html
	* C/filters/gradmap.html
	* C/filters/grid.html
	* C/filters/gtm.html
	* C/filters/guidegrid.html
	* C/filters/guide_remove.html
	* C/filters/guides_to_selection.html
	* C/filters/guillotine.html
	* C/filters/gz.html
	* C/filters/hot.html
	* C/filters/hrz.html
	* C/filters/index.html
	* C/filters/jigsaw.html
	* C/filters/jpeg.html
	* C/filters/layerfuncs.html
	* C/filters/mail.html
	* C/filters/Makefile.am
	* C/filters/mapcolor.html
	* C/filters/max_rgb.html
	* C/filters/maze.html
	* C/filters/mblur.html
	* C/filters/miff.html
	* C/filters/mosaic.html
	* C/filters/noisify.html
	* C/filters/none.html
	* C/filters/normalize.html
	* C/filters/oilify.html
	* C/filters/pat.html
	* C/filters/pixelize.html
	* C/filters/plasma.html
	* C/filters/png.html
	* C/filters/pnm.html
	* C/filters/print.html
	* C/filters/psp.html
	* C/filters/randomblends.html
	* C/filters/randomize.html
	* C/filters/rcm.html
	* C/filters/repdup.html
	* C/filters/repeat_last.html
	* C/filters/reshow_last.html
	* C/filters/ripple.html
	* C/filters/rotate.html
	* C/filters/roundsel.html
	* C/filters/sample_colorize.html
	* C/filters/scatter_hsv.html
	* C/filters/sel2path.html
	* C/filters/sel_gauss.html
	* C/filters/semiflatten.html
	* C/filters/sgi.html
	* C/filters/sharpen.html
	* C/filters/shift.html
	* C/filters/smooth_palette.html
	* C/filters/snoise.html
	* C/filters/spread.html
	* C/filters/stampify.html
	* C/filters/sunras.html
	* C/filters/terral_text.html
	* C/filters/tex-to-float.html
	* C/filters/tga.html
	* C/filters/threshold_alpha.html
	* C/filters/tiff.html
	* C/filters/tileable_blur.html
	* C/filters/tile.html
	* C/filters/url.html
	* C/filters/vinvert.html
	* C/filters/wmf.html
	* C/filters/xachvision.html
	* C/filters/xwd.html
	* C/filters/zealouscrop.html
	* C/gimp_license.html
	* C/gimp_remote.html
	* C/gimptool.html
	* C/glossary.html
	* C/image/edit/clear.html
	* C/image/edit/copy.html
	* C/image/edit/cut.html
	* C/image/edit/fill.html
	* C/image/edit/paste_as_new.html
	* C/image/edit/paste.html
	* C/image/edit/paste_into.html
	* C/image/edit/redo.html
	* C/image/edit/stroke.html
	* C/image/edit/undo.html
	* C/image/image/colors/auto/equalize.html
	* C/image/image/colors/desaturate.html
	* C/image/image/colors/invert.html
	* C/image/image/duplicate.html
	* C/image/image/mode/convert_to_grayscale.html
	* C/image/image/mode/convert_to_rgb.html
	* C/image/image_window.html
	* C/image/index.html
	* C/image/select/all.html
	* C/image/select/float.html
	* C/image/select/invert.html
	* C/image/select/none.html
	* C/image/select/save_to_channel.html
	* C/image/select/sharpen.html
	* C/images/Makefile.am
	* C/image/view/dot_for_dot.html
	* C/image/view/new_view.html
	* C/image/view/shrink_wrap.html
	* C/image/view/snap_to_guides.html
	* C/image/view/toggle_guides.html
	* C/image/view/toggle_rulers.html
	* C/image/view/toggle_selection.html
	* C/image/view/toggle_statusbar.html
	* C/image/view/zoom.html
	* C/index.html
	* C/introduction.html
	* C/keyboard_shortcuts.html
	* C/layers/add_alpha_channel.html
	* C/layers/alpha_to_selection.html
	* C/layers/anchor_layer.html
	* C/layers/apply_mask.html
	* C/layers/delete_layer.html
	* C/layers/delete_mask.html
	* C/layers/duplicate_layer.html
	* C/layers/flatten_image.html
	* C/layers/index.html
	* C/layers/layer_to_image_size.html
	* C/layers/mask_to_selection.html
	* C/layers/merge_down.html
	* C/layers/stack/stack.html
	* C/layers/using_layers.html
	* C/ln7.html
	* C/main_interface.html
	* C/Makefile.am
	* C/open/index.html
	* C/open/open_by_extension.html
	* C/paths/copy_path.html
	* C/paths/delete_path.html
	* C/paths/duplicate_path.html
	* C/paths/index.html
	* C/paths/new_path.html
	* C/paths/paste_path.html
	* C/paths/path_to_selection.html
	* C/paths/stroke_path.html
	* C/save/index.html
	* C/save/save_by_extension.html
	* C/toolbox/help/context_help.html
	* C/toolbox/index.html
	* C/toolbox/toolbox.html
	* C/tools/airbrush.html
	* C/tools/bezier_select.html
	* C/tools/blend.html
	* C/tools/brightness_contrast.html
	* C/tools/bucket_fill.html
	* C/tools/by_color_select.html
	* C/tools/clone.html
	* C/tools/color_balance.html
	* C/tools/color_picker.html
	* C/tools/convolve.html
	* C/tools/crop.html
	* C/tools/curves.html
	* C/tools/dodgeburn.html
	* C/tools/ellipse_select.html
	* C/tools/eraser.html
	* C/tools/flip.html
	* C/tools/free_select.html
	* C/tools/fuzzy_select.html
	* C/tools/histogram.html
	* C/tools/hue_saturation.html
	* C/tools/index.html
	* C/tools/ink.html
	* C/tools/intelligent_scissors.html
	* C/tools/levels.html
	* C/tools/magnify.html
	* C/tools/measure.html
	* C/tools/move.html
	* C/tools/paintbrush.html
	* C/tools/pencil.html
	* C/tools/posterize.html
	* C/tools/rect_select.html
	* C/tools/smudge.html
	* C/tools/text.html
	* C/tools/threshold.html
	* C/tools/transform.html
	* C/using_gimp.html
	* C/why_gimp.html
	* Makefile.am:
	Updated to the latest version from the converted SGML
	sources.

	* images/add_point.png
	* images/anchor_layer.png
	* images/channel_to_selection.png
	* images/.cvsignore
	* images/delete_channel.png
	* images/delete_directory.png
	* images/delete_layer.png
	* images/delete_path.png
	* images/dotted_square.png
	* images/duplicate_channel.png
	* images/duplicate_layer.png
	* images/duplicate_path.png
	* images/edit_point.png
	* images/eek.png
	* images/geezoom.png
	* images/layers_example.png
	* images/layers_overview.png
	* images/lower_channel.png
	* images/lower_directory.png
	* images/lower_layer.png
	* images/Makefile.am
	* images/new_channel.png
	* images/new_directory.png
	* images/new_path.png
	* images/new_point.png
	* images/note.png
	* images/path_to_selection.png
	* images/preview_box.png
	* images/raise_channel.png
	* images/raise_directory.png
	* images/raise_layer.png
	* images/red_square.png
	* images/remove_point.png
	* images/selection_to_path.png
	* images/stroke_path.png
	* images/tip.png
	* images/warning.png
	* images/wilber.png:
	Files which were moved to a different directory or are
	obsolete now.
2001-10-08 00:12:06 +00:00
Daniel Egger
8146a60694 This is a really large commit to update the help to the latest texts we
2001-09-07  Daniel Egger <degger@fhm.edu>

	This is a really large commit to update the help to the
	latest texts we have in the gimp-help module.

	* C/filters/animate_cells.html
	* C/filters/animationplay.html
	* C/filters/animoptimize.html
	* C/filters/apply_lens.html
	* C/filters/blended2.html
	* C/filters/blowinout.html
	* C/filters/border.html
	* C/filters/bumpmap.html
	* C/filters/cml_explorer.html
	* C/filters/convmatrix.html
	* C/filters/curve_bend.html
	* C/filters/deinterlace.html
	* C/filters/depthmerge.html
	* C/filters/despeckle.html
	* C/filters/destripe.html
	* C/filters/diffraction.html
	* C/filters/displace.html
	* C/filters/edge.html
	* C/filters/emboss.html
	* C/filters/engrave.html
	* C/filters/film.html
	* C/filters/fire.html
	* C/filters/flarefx.html
	* C/filters/fractalexplorer.html
	* C/filters/fractaltrace.html
	* C/filters/gap_frontends.html
	* C/filters/gap_navigator_dialog.html
	* C/filters/gap_plugins.html
	* C/filters/gdyntext.html
	* C/filters/gflare.html
	* C/filters/gimpressionist.html
	* C/filters/glasstile.html
	* C/filters/glowing_steel.html
	* C/filters/gouge.html
	* C/filters/ifscompose.html
	* C/filters/illusion.html
	* C/filters/imagemap.html
	* C/filters/image_tile.html
	* C/filters/iwarp.html
	* C/filters/laplace.html
	* C/filters/lic.html
	* C/filters/lighting.html
	* C/filters/logulator.html
	* C/filters/mapobject.html
	* C/filters/map_to_gradient.html
	* C/filters/mirrorsplit.html
	* C/filters/newsprint.html
	* C/filters/nlfilt.html
	* C/filters/nova.html
	* C/filters/pagecurl.html
	* C/filters/papertile.html
	* C/filters/perlotine.html
	* C/filters/pixelmap.html
	* C/filters/polar.html
	* C/filters/prep4gif.html
	* C/filters/resynth.html
	* C/filters/scratches.html
	* C/filters/sinus.html
	* C/filters/sobel.html
	* C/filters/sparkle.html
	* C/filters/struc.html
	* C/filters/tileit.html
	* C/filters/tiler.html
	* C/filters/translogo.html
	* C/filters/unsharp.html
	* C/filters/video.html
	* C/filters/vpropagate.html
	* C/filters/warp.html
	* C/filters/warp-sharp.html
	* C/filters/waves.html
	* C/filters/webify.html
	* C/filters/whirlpinch.html
	* C/filters/wind.html
	* C/filters/windify.html
	* C/filters/xachlego.html
	* C/filters/xachshadow.html
	* C/images/add_point.png
	* C/images/anchor_layer.png
	* C/images/channel_to_selection.png
	* C/images/delete_channel.png
	* C/images/delete_directory.png
	* C/images/delete_layer.png
	* C/images/delete_path.png
	* C/images/dotted_square.png
	* C/images/duplicate_channel.png
	* C/images/duplicate_layer.png
	* C/images/duplicate_path.png
	* C/images/edit_point.png
	* C/images/examples/border-selection-01.png
	* C/images/examples/border-selection-02.png
	* C/images/examples/Makefile.am
	* C/images/eye.png
	* C/images/geezoom.png
	* C/images/glossary/Makefile.am
	* C/images/glossary/modes-addition.png
	* C/images/glossary/modes-color.png
	* C/images/glossary/modes-darken.png
	* C/images/glossary/modes-difference.png
	* C/images/glossary/modes-dissolve.png
	* C/images/glossary/modes-divide.png
	* C/images/glossary/modes-hue.png
	* C/images/glossary/modes-lighten.png
	* C/images/glossary/modes-multiply.png
	* C/images/glossary/modes-normal2.png
	* C/images/glossary/modes-normal.png
	* C/images/glossary/modes-overlay.png
	* C/images/glossary/modes-saturation.png
	* C/images/glossary/modes-screen.png
	* C/images/glossary/modes-subtract.png
	* C/images/glossary/modes-value.png
	* C/images/layers_example.png
	* C/images/layers_overview.png
	* C/images/lower_channel.png
	* C/images/lower_directory.png
	* C/images/lower_layer.png
	* C/images/Makefile.am~
	* C/images/Makefile.am.orig
	* C/images/Makefile.in
	* C/images/new_channel.png
	* C/images/new_directory.png
	* C/images/new_path.png
	* C/images/new_point.png
	* C/images/path_to_selection.png
	* C/images/preview_box.png
	* C/images/raise_channel.png
	* C/images/raise_directory.png
	* C/images/raise_layer.png
	* C/images/red_square.png
	* C/images/remove_point.png
	* C/images/selection_to_path.png
	* C/images/stroke_path.png
	* C/images/tools/Makefile.am
	* C/images/tools/tool_airbrush.png
	* C/images/tools/tool_apartheid.png
	* C/images/tools/tool_bezier.png
	* C/images/tools/tool_blend.png
	* C/images/tools/tool_burndodge.png
	* C/images/tools/tool_convolver.png
	* C/images/tools/tool_crop.png
	* C/images/tools/tool_dodgeburn.png
	* C/images/tools/tool_ellipse_sel.png
	* C/images/tools/tool_eraser.png
	* C/images/tools/tool_fill.png
	* C/images/tools/tool_flip.png
	* C/images/tools/tool_free_sel.png
	* C/images/tools/tool_fuzzy_sel.png
	* C/images/tools/tool_gradient.png
	* C/images/tools/tool_ink.png
	* C/images/tools/tool_measure.png
	* C/images/tools/tool_move.png
	* C/images/tools/tool-opt-increment.png
	* C/images/tools/tool-opt-nonincrement.png
	* C/images/tools/tool_paintbrush.png
	* C/images/tools/tool_pencil.png
	* C/images/tools/tool_picker.png
	* C/images/tools/tool_rect_sel.png
	* C/images/tools/tool_scissors.png
	* C/images/tools/tool_smudge.png
	* C/images/tools/tool_smuge.png
	* C/images/tools/tool_text.png
	* C/images/tools/tool_transform.png
	* C/images/tools/tool_zoom.png
	* C/images/triangle.png
	* C/images/wilber.png
	* C/stylesheet-images/Makefile.am
	* C/stylesheet-images/note.gif
	* C/stylesheet-images/tip.gif
	* C/stylesheet-images/warning.gif:
	Added lots of new files.

	* C/bug_submission.html
	* C/channels/channel_to_selection.html
	* C/channels/delete_channel.html
	* C/channels/duplicate_channel.html
	* C/channels/index.html
	* C/channels/lower_channel.html
	* C/channels/raise_channel.html
	* C/command_line.html
	* C/contents.html
	* C/dialogs/about.html
	* C/dialogs/border_selection.html
	* C/dialogs/brush_editor.html
	* C/dialogs/brush_selection.html
	* C/dialogs/channels/channels.html
	* C/dialogs/channels/edit_channel_attributes.html
	* C/dialogs/channels/new_channel.html
	* C/dialogs/color_selectors/built_in.html
	* C/dialogs/color_selectors/gtk.html
	* C/dialogs/color_selectors/triangle.html
	* C/dialogs/color_selectors/watercolor.html
	* C/dialogs/convert_to_indexed.html
	* C/dialogs/copy_named.html
	* C/dialogs/cut_named.html
	* C/dialogs/device_status.html
	* C/dialogs/document_index.html
	* C/dialogs/edit_qmask_attributes.html
	* C/dialogs/error_console.html
	* C/dialogs/feather_selection.html
	* C/dialogs/file_new.html
	* C/dialogs/file_open.html
	* C/dialogs/file_save.html
	* C/dialogs/gradient_editor/copy_gradient.html
	* C/dialogs/gradient_editor/delete_gradient.html
	* C/dialogs/gradient_editor/gradient_editor.html
	* C/dialogs/gradient_editor/new_gradient.html
	* C/dialogs/gradient_editor/rename_gradient.html
	* C/dialogs/gradient_editor/replicate_segment.html
	* C/dialogs/gradient_editor/save_as_povray.html
	* C/dialogs/gradient_editor/split_segments_uniformly.html
	* C/dialogs/gradient_selection.html
	* C/dialogs/grow_selection.html
	* C/dialogs/help.html
	* C/dialogs/indexed_palette.html
	* C/dialogs/index.html
	* C/dialogs/info_window.html
	* C/dialogs/input_devices.html
	* C/dialogs/layers/add_layer_mask.html
	* C/dialogs/layers_and_channels.html
	* C/dialogs/layers/edit_layer_attributes.html
	* C/dialogs/layers/layer_boundary_size.html
	* C/dialogs/layers/layers.html
	* C/dialogs/layers/merge_visible_layers.html
	* C/dialogs/layers/new_layer.html
	* C/dialogs/layers/scale_layer.html
	* C/dialogs/module_browser.html
	* C/dialogs/navigation_window.html
	* C/dialogs/offset.html
	* C/dialogs/palette_editor/delete_palette.html
	* C/dialogs/palette_editor/import_palette.html
	* C/dialogs/palette_editor/merge_palette.html
	* C/dialogs/palette_editor/new_palette.html
	* C/dialogs/palette_editor/palette_editor.html
	* C/dialogs/palette_selection.html
	* C/dialogs/paste_named.html
	* C/dialogs/paths/edit_path_attributes.html
	* C/dialogs/paths/export_path.html
	* C/dialogs/paths/import_path.html
	* C/dialogs/paths/paths.html
	* C/dialogs/pattern_selection.html
	* C/dialogs/preferences/directories.html
	* C/dialogs/preferences/display.html
	* C/dialogs/preferences/environment.html
	* C/dialogs/preferences/interface.html
	* C/dialogs/preferences/monitor.html
	* C/dialogs/preferences/new_file.html
	* C/dialogs/preferences/preferences.html
	* C/dialogs/preferences/session.html
	* C/dialogs/really_close.html
	* C/dialogs/really_quit.html
	* C/dialogs/scale_image.html
	* C/dialogs/scale_layer_warn.html
	* C/dialogs/set_canvas_size.html
	* C/dialogs/shrink_selection.html
	* C/dialogs/tip_of_the_day.html
	* C/dialogs/tool_options.html
	* C/dialogs/undo_history.html
	* C/file/close.html
	* C/file_formats.html
	* C/file/index.html
	* C/file/last_opened.html
	* C/file/quit.html
	* C/file/revert.html
	* C/filters/alienmap2.html
	* C/filters/alienmap.html
	* C/filters/align_layers.html
	* C/filters/applycanvas.html
	* C/filters/autocrop.html
	* C/filters/autostretch_hsv.html
	* C/filters/blinds.html
	* C/filters/blur.html
	* C/filters/borderaverage.html
	* C/filters/burst.html
	* C/filters/bz2.html
	* C/filters/c_astretch.html
	* C/filters/centerguide.html
	* C/filters/checkerboard.html
	* C/filters/color_enhance.html
	* C/filters/colorify.html
	* C/filters/colortoalpha.html
	* C/filters/compose.html
	* C/filters/cubism.html
	* C/filters/decompose.html
	* C/filters/ditherize.html
	* C/filters/dust.html
	* C/filters/exchange.html
	* C/filters/fade-alpha.html
	* C/filters/fits.html
	* C/filters/fit-text.html
	* C/filters/flame.html
	* C/filters/fp.html
	* C/filters/frame_filter.html
	* C/filters/gap_filter.html
	* C/filters/gauss_iir.html
	* C/filters/gauss_rle.html
	* C/filters/gee_zoom.html
	* C/filters/gfig.html
	* C/filters/gih.html
	* C/filters/gqbist.html
	* C/filters/gradmap.html
	* C/filters/grid.html
	* C/filters/gtm.html
	* C/filters/guidegrid.html
	* C/filters/guide_remove.html
	* C/filters/guides_to_selection.html
	* C/filters/guillotine.html
	* C/filters/gz.html
	* C/filters/hot.html
	* C/filters/hrz.html
	* C/filters/index.html
	* C/filters/jigsaw.html
	* C/filters/jpeg.html
	* C/filters/layerfuncs.html
	* C/filters/mail.html
	* C/filters/Makefile.am
	* C/filters/mapcolor.html
	* C/filters/max_rgb.html
	* C/filters/maze.html
	* C/filters/mblur.html
	* C/filters/miff.html
	* C/filters/mosaic.html
	* C/filters/noisify.html
	* C/filters/none.html
	* C/filters/normalize.html
	* C/filters/oilify.html
	* C/filters/pat.html
	* C/filters/pixelize.html
	* C/filters/plasma.html
	* C/filters/png.html
	* C/filters/pnm.html
	* C/filters/print.html
	* C/filters/psp.html
	* C/filters/randomblends.html
	* C/filters/randomize.html
	* C/filters/rcm.html
	* C/filters/repdup.html
	* C/filters/repeat_last.html
	* C/filters/reshow_last.html
	* C/filters/ripple.html
	* C/filters/rotate.html
	* C/filters/roundsel.html
	* C/filters/sample_colorize.html
	* C/filters/scatter_hsv.html
	* C/filters/sel2path.html
	* C/filters/sel_gauss.html
	* C/filters/semiflatten.html
	* C/filters/sgi.html
	* C/filters/sharpen.html
	* C/filters/shift.html
	* C/filters/smooth_palette.html
	* C/filters/snoise.html
	* C/filters/spread.html
	* C/filters/stampify.html
	* C/filters/sunras.html
	* C/filters/terral_text.html
	* C/filters/tex-to-float.html
	* C/filters/tga.html
	* C/filters/threshold_alpha.html
	* C/filters/tiff.html
	* C/filters/tileable_blur.html
	* C/filters/tile.html
	* C/filters/url.html
	* C/filters/vinvert.html
	* C/filters/wmf.html
	* C/filters/xachvision.html
	* C/filters/xwd.html
	* C/filters/zealouscrop.html
	* C/gimp_license.html
	* C/gimp_remote.html
	* C/gimptool.html
	* C/glossary.html
	* C/image/edit/clear.html
	* C/image/edit/copy.html
	* C/image/edit/cut.html
	* C/image/edit/fill.html
	* C/image/edit/paste_as_new.html
	* C/image/edit/paste.html
	* C/image/edit/paste_into.html
	* C/image/edit/redo.html
	* C/image/edit/stroke.html
	* C/image/edit/undo.html
	* C/image/image/colors/auto/equalize.html
	* C/image/image/colors/desaturate.html
	* C/image/image/colors/invert.html
	* C/image/image/duplicate.html
	* C/image/image/mode/convert_to_grayscale.html
	* C/image/image/mode/convert_to_rgb.html
	* C/image/image_window.html
	* C/image/index.html
	* C/image/select/all.html
	* C/image/select/float.html
	* C/image/select/invert.html
	* C/image/select/none.html
	* C/image/select/save_to_channel.html
	* C/image/select/sharpen.html
	* C/images/Makefile.am
	* C/image/view/dot_for_dot.html
	* C/image/view/new_view.html
	* C/image/view/shrink_wrap.html
	* C/image/view/snap_to_guides.html
	* C/image/view/toggle_guides.html
	* C/image/view/toggle_rulers.html
	* C/image/view/toggle_selection.html
	* C/image/view/toggle_statusbar.html
	* C/image/view/zoom.html
	* C/index.html
	* C/introduction.html
	* C/keyboard_shortcuts.html
	* C/layers/add_alpha_channel.html
	* C/layers/alpha_to_selection.html
	* C/layers/anchor_layer.html
	* C/layers/apply_mask.html
	* C/layers/delete_layer.html
	* C/layers/delete_mask.html
	* C/layers/duplicate_layer.html
	* C/layers/flatten_image.html
	* C/layers/index.html
	* C/layers/layer_to_image_size.html
	* C/layers/mask_to_selection.html
	* C/layers/merge_down.html
	* C/layers/stack/stack.html
	* C/layers/using_layers.html
	* C/ln7.html
	* C/main_interface.html
	* C/Makefile.am
	* C/open/index.html
	* C/open/open_by_extension.html
	* C/paths/copy_path.html
	* C/paths/delete_path.html
	* C/paths/duplicate_path.html
	* C/paths/index.html
	* C/paths/new_path.html
	* C/paths/paste_path.html
	* C/paths/path_to_selection.html
	* C/paths/stroke_path.html
	* C/save/index.html
	* C/save/save_by_extension.html
	* C/toolbox/help/context_help.html
	* C/toolbox/index.html
	* C/toolbox/toolbox.html
	* C/tools/airbrush.html
	* C/tools/bezier_select.html
	* C/tools/blend.html
	* C/tools/brightness_contrast.html
	* C/tools/bucket_fill.html
	* C/tools/by_color_select.html
	* C/tools/clone.html
	* C/tools/color_balance.html
	* C/tools/color_picker.html
	* C/tools/convolve.html
	* C/tools/crop.html
	* C/tools/curves.html
	* C/tools/dodgeburn.html
	* C/tools/ellipse_select.html
	* C/tools/eraser.html
	* C/tools/flip.html
	* C/tools/free_select.html
	* C/tools/fuzzy_select.html
	* C/tools/histogram.html
	* C/tools/hue_saturation.html
	* C/tools/index.html
	* C/tools/ink.html
	* C/tools/intelligent_scissors.html
	* C/tools/levels.html
	* C/tools/magnify.html
	* C/tools/measure.html
	* C/tools/move.html
	* C/tools/paintbrush.html
	* C/tools/pencil.html
	* C/tools/posterize.html
	* C/tools/rect_select.html
	* C/tools/smudge.html
	* C/tools/text.html
	* C/tools/threshold.html
	* C/tools/transform.html
	* C/using_gimp.html
	* C/why_gimp.html
	* Makefile.am:
	Updated to the latest version from the converted SGML
	sources.

	* images/add_point.png
	* images/anchor_layer.png
	* images/channel_to_selection.png
	* images/.cvsignore
	* images/delete_channel.png
	* images/delete_directory.png
	* images/delete_layer.png
	* images/delete_path.png
	* images/dotted_square.png
	* images/duplicate_channel.png
	* images/duplicate_layer.png
	* images/duplicate_path.png
	* images/edit_point.png
	* images/eek.png
	* images/geezoom.png
	* images/layers_example.png
	* images/layers_overview.png
	* images/lower_channel.png
	* images/lower_directory.png
	* images/lower_layer.png
	* images/Makefile.am
	* images/new_channel.png
	* images/new_directory.png
	* images/new_path.png
	* images/new_point.png
	* images/note.png
	* images/path_to_selection.png
	* images/preview_box.png
	* images/raise_channel.png
	* images/raise_directory.png
	* images/raise_layer.png
	* images/red_square.png
	* images/remove_point.png
	* images/selection_to_path.png
	* images/stroke_path.png
	* images/tip.png
	* images/warning.png
	* images/wilber.png:
	Files which were moved to a different directory or are
	obsolete now.
2001-10-07 23:23:41 +00:00
Chyla Zbigniew
36afccc631 Updated Polish translation 2001-10-05 09:18:33 +00:00
Ole Laursen
fb17f771bb Fixed a few things in Danish translation and switched to using a Danish
2001-10-05  Ole Laursen  <olau@hardworking.dk>

	* da.po: Fixed a few things in Danish translation and switched to
	using a Danish tips file.
2001-10-04 23:29:11 +00:00
Ole Laursen
08f9ba8581 tips/gimp_tips.da.txt tips/Makefile.am Added a Danish translation of the
2001-10-05  Ole Laursen  <olau@hardworking.dk>

	* tips/gimp_tips.da.txt
	* tips/Makefile.am
	* tips/makefile.mingw: Added a Danish translation of the tips.
2001-10-04 23:27:37 +00:00
Sven Neumann
244ad5e14e app/drawable_cmds.c app/image_cmds.c tools/pdbgen/pdb/drawable.pdb always
2001-10-03  Sven Neumann  <sven@gimp.org>

	* app/drawable_cmds.c
	* app/image_cmds.c
	* tools/pdbgen/pdb/drawable.pdb
	* tools/pdbgen/pdb/image.pdb: always return a thumbnail of at least
	1 pixel width and height so plug-ins don't have to check the return
	value. Seems to fix bug #50867, please test!
2001-10-03 17:22:15 +00:00
Chyla Zbigniew
3736b0c26d Updated Polish translation 2001-10-02 20:46:33 +00:00
Sven Neumann
1cbd70d973 corrected initial setting of toggle button. Thanks to
2001-10-02  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/sobel.c (sobel_dialog): corrected initial setting
	of toggle button. Thanks to floemker@TechFak.Uni-Bielefeld.DE for
	spotting this one (bug #61525).
2001-10-02 09:39:29 +00:00
Sven Neumann
edbbca77da don't crash on invalid brush files (fixes bug #61418).
2001-10-01  Sven Neumann  <sven@gimp.org>

	* app/gimpbrush.c (gimp_brush_load): don't crash on invalid brush
	files (fixes bug #61418).
2001-10-01 18:10:17 +00:00
Sven Neumann
684574ed4c fixed wrong error message.
2001-10-01  Sven Neumann  <sven@gimp.org>

	* plug-ins/script-fu/script-fu-server.c (script_fu_server_run):
	fixed wrong error message.
2001-10-01 10:47:22 +00:00
Almer S. Tigelaar
c43bdaa299 Updated Dutch translation from Branko Collin <collin@xs4all.nl>
2001-09-28  Almer S. Tigelaar  <almer@gnome.org>

	* nl.po: Updated Dutch translation from
	Branko Collin <collin@xs4all.nl>
2001-09-28 13:56:52 +00:00
Sven Neumann
94fc419c2e removed moved files from the 1.2 branch 2001-09-26 12:58:48 +00:00
Emese Kovacs
176a64553e Updated Hungarian translation
2001-09-22  Emese Kovacs <emese@gnome.hu>

        * hu.po: Updated Hungarian translation
2001-09-23 14:09:03 +00:00
Szabolcs Ban
70c8d33c3c Updated hu.po (hungarian) 2001-09-22 21:39:23 +00:00
Szabolcs Ban
17e246c40d Update Hungarian translation 2001-09-22 21:07:25 +00:00
Emese Kovacs
919f1ebb47 Some more update
2001-09-22  Emese Kovacs  <emese@gnome.hu>

        * hu.po: Some more update
2001-09-22 14:20:13 +00:00
Emese Kovacs
482933f7af Updated Hungarian translation
2001-09-22  Emese Kovacs  <emese@gnome.hu>

        * hu.po: Updated Hungarian translation
2001-09-22 13:31:30 +00:00
Christophe Merlet
caecdd0f78 Updated French translation. 2001-09-22 10:44:21 +00:00
Emese Kovacs
121112ab67 Updated Hungarian translation from Gbor Sveg <gsuveg@sgsystem.com>
2001-09-22  Emese Kovacs <emese@gnome.hu>

        * hu.po: Updated Hungarian translation from
          Gbor Sveg  <gsuveg@sgsystem.com>
2001-09-22 10:30:36 +00:00
Szabolcs Ban
0d1ddc7b05 fixed Hungarian translation 2001-09-17 07:57:02 +00:00
Carlos Perell Marn
87aec7fc61 Header fix.
2001-09-16  Carlos Perell Marn <carlos@gnome-db.org>

	* es.po: Header fix.
2001-09-16 20:12:04 +00:00
Pablo Saratxaga
348214025d updated Catalan file 2001-09-07 21:40:02 +00:00
Pablo Saratxaga
c5c921c51b updated Irish file 2001-09-06 18:03:03 +00:00
Kwok-Koon Cheung
9f6ff66576 Rename all zh_TW.Big5.po to zh_TW.po, to avoid encoding naming problem 2001-09-05 07:43:10 +00:00
Pablo Saratxaga
fd18dfecef fixed header of ga.po 2001-08-30 06:35:46 +00:00
jaycox
5915098f50 Fixed bug which would sometimes cause there to be a small gap between
* app/paint_core.c:
	Fixed bug which would sometimes cause there to be a small gap
	between lines drawn using the shift click feature of the
	painting tools.
2001-08-30 04:25:50 +00:00
Marc Lehmann
1dbb6174f8 *** empty log message *** 2001-08-30 01:50:35 +00:00
Christian Rose
51c1ec37ec Started on the Swedish translation. Changes to the Swedish translation.
2001-08-30  Christian Rose  <menthos@menthos.com>

	* plug-ins/perl/po/sv.po: Started on the Swedish translation.
	* po-libgimp/sv.po: Changes to the Swedish translation.
	* po-script-fu/sv.po: Translated some more.
2001-08-29 23:43:38 +00:00
Sven Neumann
68b17d6ecd fixed parameter description (bug #59760).
2001-08-30  Sven Neumann  <sven@gimp.org>

	* plug-ins/script-fu/scripts/trochoid.scm:
	fixed parameter description (bug #59760).
2001-08-29 23:04:26 +00:00
Sven Neumann
1b53a003d2 added a section that mentions the GNOME translation project that
2001-08-29  Sven Neumann  <sven@gimp.org>

	* README.i18n: added a section that mentions the GNOME translation
	project that coordinates translation efforts in the GNOME CVS tree.
2001-08-29 20:32:34 +00:00
Ole Laursen
8681817ba9 Partial update of Danish translation (due to request from Sven).
2001-08-29  Ole Laursen  <olau@hardworking.dk>

	* po/da.po, po-libgimp/da.po, po-plug-ins/da.po,
          po-script-fu/da.po: Partial update of Danish translation (due
	  to request from Sven).
2001-08-29 15:17:39 +00:00
Sven Neumann
49d970954b ca.po en_GB.po ga.po gl.po it.po ko.po nl.po nn.po sk.po put valid
2001-08-16  Sven Neumann  <sven@gimp.org>

	* ca.po
	* en_GB.po
	* ga.po
	* gl.po
	* it.po
	* ko.po
	* nl.po
	* nn.po
	* sk.po
	* sv.po: put valid encoding and charset into the headers even though
	these files are empty. The default values fooled my status script.
2001-08-16 19:19:44 +00:00
Andras Timar
814ac2462a Fixing typos.
2001-08-14  Andras Timar <timar@gnome.hu>

        * tips/gimp_tips.hu.txt: Fixing typos.
2001-08-14 15:27:33 +00:00
Andras Timar
b4ecc76460 Fixing typos.
2001-08-14  Andras Timar  <timar@gnome.hu>

	* gimp_tips.hu.txt: Fixing typos.
2001-08-14 15:25:11 +00:00
Kwok-Koon Cheung
51530becc9 Usual update, and fix an incorrect translated term. 2001-08-13 07:39:20 +00:00
Emese Kovacs
75db98155f Updated Hungarian translation.
2001-08-11  Emese Kovacs  <emese@gnome.hu>

        * hu.po: Updated Hungarian translation.
2001-08-11 19:08:07 +00:00
Emese Kovacs
6c947d9751 Updated Hungarian translation
2001-08-11  Emese Kovacs <emese@gnome.hu>

        * tips/gimp_tips.hu.txt: Updated Hungarian translation
2001-08-11 19:04:03 +00:00
Emese Kovacs
0814c2a5bf Added gimp_tips.hu.txt to the targets.
2001-08-07  Emese Kovacs <emese@gnome.hu>

        * tips/Makefile.am|makefile.mingw: Added gimp_tips.hu.txt to the
        targets.

        * tips/gimp_tips.hu.txt: Added Hungarian tips file.
2001-08-07 16:16:15 +00:00
Andras Timar
1ab1e6a112 Updated Hungarian translation.
2001-08-07  Andras Timar  <timar@gnome.hu>

        * hu.po: Updated Hungarian translation.
2001-08-07 16:07:08 +00:00
Szabolcs Ban
10d4878906 fixed typos 2001-08-07 16:05:04 +00:00
Andras Timar
b6d80843c9 Updated Hungarian translation.
2001-08-07  Andras Timar  <timar@gnome.hu>

        * hu.po: Updated Hungarian translation.
2001-08-07 15:48:40 +00:00
Marc Lehmann
9adec177f3 *** empty log message *** 2001-08-05 15:55:06 +00:00
Nick Lamb /GIMP
f53d5ced11 Fix for small TGA2 files 2001-08-01 16:44:12 +00:00
Andras Timar
2a87bfdd52 Updated Hungarian translation, thanks to Emese.
2001-08-01  Andras Timar  <timar@gnome.hu>

        * hu.po: Updated Hungarian translation, thanks to Emese.
2001-08-01 08:31:56 +00:00
Sven Neumann
d0de46951d HACKING we require gettext version 0.38.
2001-07-30  Sven Neumann  <sven@gimp.org>

	* HACKING
	* autogen.sh: we require gettext version 0.38.
2001-07-30 08:36:46 +00:00
Chyla Zbigniew
1a2405e9a2 Updated Polish translation 2001-07-29 11:14:12 +00:00
Sven Neumann
bc5e02385c Made a new tarball that should fix the problems Austin reported. 2001-07-27 13:42:36 +00:00
Sven Neumann
07e79c8677 Fixed the empty lt.po files that broke the 1.2.2 tarball for Austin. 2001-07-27 13:10:09 +00:00
Andras Timar
89fc0c00e8 Updated Hungarian translation.
2001-07-27  Andras Timar  <timar@gnome.hu>

        * hu.po: Updated Hungarian translation.
2001-07-27 06:46:00 +00:00
Sven Neumann
e37a4bc859 Made 1.2.2 release.
--Sven
2001-07-26 21:14:43 +00:00
Sven Neumann
fcea7ed1d1 fixed broken image link.
2001-07-26  Sven Neumann  <sven@gimp.org>

	* C/dialogs/paths/paths.html: fixed broken image link.
2001-07-26 21:00:38 +00:00
Sven Neumann
d80ca1793e fixed translations 2001-07-26 13:29:55 +00:00
Sven Neumann
0c50692d3b added traditional chinese translation provided by <maddog@linuxhall.org>
--Sven
2001-07-26 12:11:53 +00:00
Szabolcs Ban
879b50190b Updated Hungarian translation from Gbor Sveg <gsuveg@sgsystem.com>
2001-07-25  Szabolcs Ban <shooby@gnome.hu>

        * hu.po: Updated Hungarian translation from
          Gbor Sveg  <gsuveg@sgsystem.com>
2001-07-25 17:13:15 +00:00
SHIRASAKI Yasuhiro
3ee58d67ce file (kanji) encoding adjustment.
-- yasuhiro
2001-07-25 11:58:35 +00:00
Sven Neumann
7be749a6bf updated japanese translation by Iccii <iccii@hotmail.com>.
2001-07-24  Sven Neumann  <sven@gimp.org>

	* tips/gimp_tips.ja.txt:
	updated japanese translation by Iccii <iccii@hotmail.com>.
2001-07-24 09:13:03 +00:00
Ole Laursen
8d897f8770 Partial update of Danish translation (a lot more needs to be
2001-07-24  Ole Laursen  <olau@hardworking.dk>

	* da.po: Partial update of Danish translation (a lot more needs to
	be fixed/translated).
2001-07-23 23:26:36 +00:00
Sven Neumann
381589d09d plug-ins/common/winclipboard.c plug-ins/gap/gap_filter_foreach.c
2001-07-23  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/winclipboard.c
	* plug-ins/gap/gap_filter_foreach.c
	* plug-ins/imagemap/imap_cmd_guides.c
	* plug-ins/sel2path/pxl-outline.c: marked missing strings for
	translation (patch from "Iccii" <iccii@hotmail.com>).
2001-07-23 10:38:31 +00:00
Sven Neumann
d6fb2cc53d Removed new perl scripts. This is the stable branch, no new features here! 2001-07-23 10:18:21 +00:00
Stanislav Brabec
760dd43f96 czech translation update 2001-07-22 19:51:55 +00:00
Stanislav Brabec
4e84027a6c Reflect my fix from 2001-03-01 (range limits) in script-fu comments.
2001-07-22  Stanislav Brabec  <utx@penguin.cz>

    * plugins/common/despeckle.c: Reflect my fix from 2001-03-01
    (range limits) in script-fu comments.
2001-07-22 19:48:18 +00:00
Marc Lehmann
9381145786 *** empty log message *** 2001-07-21 21:21:26 +00:00
Sven Neumann
a63b3a3301 removed "Baseline JPEG" toggle button from the GUI because it allowed to
2001-07-20  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/jpeg.c: removed "Baseline JPEG" toggle button from
	the GUI because it allowed to trigger a bug in libjpeg that caused a
	crash (bug #57727). The non-interactive version still has the baseline
	option so scripts don't have to change.
2001-07-20 14:27:06 +00:00
Fatih Demir
2853e09b3a Update.. 2001-07-20 10:35:04 +00:00
Fatih Demir
66aed7e5e0 stable update.. 2001-07-20 10:29:55 +00:00
Sven Neumann
1c90a609c9 added lithuanian translation and fixed quite a few po files 2001-07-19 21:54:35 +00:00
Christian Rose
5452f2da9d Updated Swedish translation.
2001-07-19  Christian Rose  <menthos@menthos.com>

	* sv.po: Updated Swedish translation.
2001-07-19 19:54:46 +00:00
Sven Neumann
0e9e4c2869 reverted addition of ro translation since it was broken 2001-07-19 18:24:21 +00:00
Sven Neumann
176a8bf542 fixed header 2001-07-19 18:20:00 +00:00
Marius Andreiana
007c1a83a7 added
2001-07-19  Marius Andreiana  <mandreiana@yahoo.com>

        * ro.po: added
2001-07-19 15:45:45 +00:00
Marius Andreiana
335cc96623 Added ro (Romanian) to ALL_LINGUAS
2001-07-17  Marius Andreiana  <mandreiana@yahoo.com>

        * configure.in: Added ro (Romanian) to ALL_LINGUAS
2001-07-19 15:44:52 +00:00
Fatih Demir
c631872bff HEAD -> stable tr.po updates. 2001-07-18 11:19:09 +00:00
Fatih Demir
3a6947d285 HEAD -> stable. 2001-07-17 10:25:57 +00:00
Sven Neumann
c368a61709 libgimp-decl.txt tmpl/gimp.sgml tmpl/gimpchainbutton.sgml
2001-07-17  Sven Neumann  <sven@gimp.org>

	* libgimp-decl.txt
	* tmpl/gimp.sgml
	* tmpl/gimpchainbutton.sgml
	* tmpl/gimpcolordisplay.sgml
	* tmpl/gimpcolorselector.sgml
	* tmpl/gimpdrawable.sgml
	* tmpl/gimpenums.sgml
	* tmpl/gimpexport.sgml
	* tmpl/gimpmodule.sgml
	* tmpl/gimpparasite.sgml
	* tmpl/gimpparasite.sgml.sgml
	* tmpl/gimppixelrgn.sgml
	* tmpl/gimpprotocol.sgml
	* tmpl/gimpsizeentry.sgml
	* tmpl/gimptile.sgml
	* tmpl/gimpunit.sgml
	* tmpl/gimpvector.sgml
	* tmpl/gimpwire.sgml: recreated templates for gimp-1.2.2.
2001-07-16 23:46:39 +00:00
Kjartan Maraas
c1e0dfa851 Updated Norwegian (nynorsk) translation.
2001-07-14  Kjartan Maraas  <kmaraas@gnome.org>

	* nn.po: Updated Norwegian (nynorsk) translation.
2001-07-14 19:29:15 +00:00
Sven Neumann
e58ab70981 app/display_cmds.c removed unnecessary check for gimage->layers. Creating
2001-07-14  Sven Neumann  <sven@gimp.org>

	* app/display_cmds.c
	* tools/pdbgen/pdb/display.pdb (display_new_invoker): removed
	unnecessary check for gimage->layers. Creating a display for an empty
	image is a valid operation.
2001-07-14 17:49:08 +00:00
Fatih Demir
2fe6ddd2f7 Hmm 2001-07-14 11:23:58 +00:00
Fatih Demir
0f497ecb80 Added Turkish tips.. 2001-07-14 11:18:04 +00:00
Fatih Demir
6a8a60ef2e Updated tr.po 2001-07-14 11:15:51 +00:00
Sven Neumann
21e35e6b92 removing files added in HEAD from stable branch 2001-07-11 11:03:31 +00:00
Sven Neumann
cbb65d25ca plug-ins/common/bz2.c a fix for bug #57217 based on a patch from Raphael
2001-07-10  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/bz2.c
	* plug-ins/common/gz.c: a fix for bug #57217 based on a patch from
	Raphael Quinet.
2001-07-10 19:59:29 +00:00
Sven Neumann
d59b52f5b0 open files in binary mode. A patch from Wolfgang Hofer that possibly fixes
2001-07-10  Sven Neumann  <sven@gimp.org>

	* plug-ins/gap/gap_lib.c (p_file_copy): open files in binary mode.
	A patch from Wolfgang Hofer that possibly fixes bug #52890.
2001-07-10 19:18:01 +00:00
Michael Natterer
bdc3d90cbd Removed some RCS file copying crap. 2001-07-09 19:56:19 +00:00
Michael Natterer
d81231dcba Removed some RCS file copying artefacts. 2001-07-03 22:08:27 +00:00
Sven Neumann
1908e0965b added gimppath2svg.py to EXTRA_DIST 2001-07-03 10:40:40 +00:00
Sven Neumann
19b8758d61 added ChangeLog.pre-1-2 to EXTRA_DIST (makes a good read on long winter
2001-07-03  Sven Neumann  <sven@gimp.org>

	* Makefile.am: added ChangeLog.pre-1-2 to EXTRA_DIST (makes a good
	read on long winter evenings)
2001-07-02 23:33:01 +00:00
Sven Neumann
b12ba60bee applied patch from Peter Kirchgessner <peter@kirchgessner.net> that fixes
2001-07-03  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/xwd.c: applied patch from Peter Kirchgessner
	<peter@kirchgessner.net> that fixes bug #56830.
2001-07-02 23:02:17 +00:00
Nick Lamb /GIMP
a9c96daa51 Changelog for previous change, sorry. 2001-07-02 17:24:24 +00:00
Nick Lamb /GIMP
8a10d62050 Please forgive me 2001-07-02 17:23:54 +00:00
Sven Neumann
6f64cafbd6 forgot to commit ChangeLog for helpbrowser change 2001-07-02 12:12:55 +00:00
Sven Neumann
b5956d1f35 removed special handling of undocumented filters, added support for
2001-07-02  Sven Neumann  <sven@gimp.org>

	* plug-ins/helpbrowser/helpbrowser.c: removed special handling of
	undocumented filters, added support for anchors in URLs.
2001-07-02 12:12:24 +00:00
Sven Neumann
2ad60f5ac6 plug-ins/*/Makefile.am added -I$(top_srcdir)/intl to INCLUDES. This will
2001-07-02  Sven Neumann  <sven@gimp.org>

	* plug-ins/*/Makefile.am
	* plug-ins/common/mkgen.pl: added -I$(top_srcdir)/intl to INCLUDES.
	This will hopefully fix #51823 without breaking it for other platforms.
2001-07-02 00:55:11 +00:00
Sven Neumann
418f4a3496 updated the help files for the 1.2.2 release
I'll have to tweak the helpbrowser slightly to make anchors work, but
that has to wait till tomorrow...
2001-07-02 00:08:11 +00:00
Sven Neumann
3fb4cefc39 take glib_cflags and glib_libs from glib-config instead of using ugly sed
2001-07-01  Sven Neumann  <sven@gimp.org>

	* gimptool.in: take glib_cflags and glib_libs from glib-config instead
	of using ugly sed hacks to strip it out of gtk_cflags and gtk_libs.
	This should fix 'gimptool --cflags-noui'.
2001-07-01 12:28:54 +00:00
Sven Neumann
83e111b35d we forgot to add HAVE_FINITE and HAVE_ISFINITE here (bug #56918).
2001-07-01  Sven Neumann  <sven@gimp.org>

        * acconfig.h: we forgot to add HAVE_FINITE and HAVE_ISFINITE here
        (bug #56918).
2001-07-01 11:32:10 +00:00
Sven Neumann
3ac34ce1e6 attach default comment to image created by "Paste As New" (addresses bug
2001-06-30  Sven Neumann  <sven@gimp.org>

	* app/global_edit.c: attach default comment to image created by
	"Paste As New" (addresses bug #51164).
2001-06-30 18:03:59 +00:00
Adam D. Moss
8782bcdccf fix date 2001-06-29 23:49:57 +00:00
Adam D. Moss
86f8831ce0 More error recovery. Not perfect. Adequate.
2001-06-29  Adam D. Moss <adam@gimp.org>

	* app/convert.c: More error recovery.  Not perfect.  Adequate.
2001-06-29 23:49:06 +00:00
Adam D. Moss
525abfc24d Make it even harder to trigger those impossible-to-reach assertions, and
2001-06-29  Adam D. Moss <adam@gimp.org>

	* app/convert.c: Make it even harder to trigger those
	impossible-to-reach assertions, and handle things more gracefully
	when we do reach them.  :P  Also removed some redundant calculations
	and crufty structure elements.  Fixes bug #52264.
2001-06-29 22:59:14 +00:00
Daniel Egger
ad2aac44eb Corrected some typos and revised a sentence. Thanks to Branko Collin for
2001-06-27  Daniel Egger <egger@suse.de>

        * README.i18n: Corrected some typos and revised a sentence.
	Thanks to Branko Collin for noticing the glitches.
2001-06-27 12:40:44 +00:00
Sven Neumann
b507519722 subtle dialog layout tweaks.
2001-06-26  Sven Neumann  <sven@gimp.org>

	* plug-ins/dbbrowser/dbbrowser_utils.c: subtle dialog layout tweaks.
2001-06-26 16:05:27 +00:00
Valek Frob
0b11638ba6 Updated russian translation. 2001-06-26 15:41:31 +00:00
Sven Neumann
cbae695d74 applied fix for #56625 from HEAD branch 2001-06-26 13:07:42 +00:00
Sven Neumann
5474267023 fixed wrong header in brasilian translation 2001-06-26 10:02:26 +00:00
Christophe Merlet
1d690d8818 Updated French translation. 2001-06-26 10:00:30 +00:00
Sven Neumann
136a1b2dad fixed gimptool manpage which was still refering to directories we used to
2001-06-26  Sven Neumann  <sven@gimp.org>

	* gimptool.1.in: fixed gimptool manpage which was still refering to
	directories we used to use with GIMP version 1.0.

	* app/image_cmds.c
	* tools/pdbgen/pdb/image.pdb: always allocate a full colormap for
	indexed images, even if someone sets the number of colors to zero.
	Fixes bug #56561.
2001-06-26 09:47:39 +00:00
Chyla Zbigniew
87f2dfc92e Updated Polish translation 2001-06-25 21:01:45 +00:00
Sven Neumann
f957388938 updates to the dutch translation 2001-06-25 09:35:53 +00:00
Sven Neumann
f5987a5c89 updated german translations 2001-06-22 12:58:22 +00:00
Sven Neumann
5af94be62d do not include math.h conditionally since this change broke a lot of
2001-06-21  Sven Neumann  <sven@gimp.org>

	* libgimp/gimpmath.h: do not include math.h conditionally since this
	change broke a lot of plug-ins that do not include config.h before
	including gimp.h and it won't work for third-party plug-ins either.

	* plug-ins/Lighting/lighting_ui.c
	* plug-ins/MapObject/mapobject_ui.c: use gimp_ui_init() which sets
	the default colormap and visual in an attempt to fix bug #50715.
2001-06-21 17:30:41 +00:00
Sven Neumann
917ee67db8 plug-ins/gdyntext/ChangeLog merged changes done by plug-in author into our
2001-06-21  Sven Neumann  <sven@gimp.org>

	* plug-ins/gdyntext/ChangeLog
	* plug-ins/gdyntext/gdyntext.[ch]: merged changes done by plug-in
	author into our source, thus upgrading GDynText to version 1.5.4.
	This should fix bug #55341 (dynamic text layer renames itself).
2001-06-21 14:37:20 +00:00
Michael Natterer
7ba7ba2720 Oops, mentioned the wrong functions in ChangeLog. 2001-06-21 13:15:35 +00:00
Sven Neumann
8e8344e91f plug-ins/Lighting/lighting_apply.c plug-ins/common/colortoalpha.c
2001-06-21  Sven Neumann  <sven@gimp.org>

	* plug-ins/Lighting/lighting_apply.c
	* plug-ins/common/colortoalpha.c
	* plug-ins/common/papertile.c
	* plug-ins/common/vinvert.c
	* plug-ins/script-fu/scripts/textured-logo.scm: applied a patch from
	"Iccii" <iccii@hotmail.com> that marks a bunch of leftover strings
	for translation (bug #56490).
2001-06-21 13:00:41 +00:00
Michael Natterer
2820b59a3f fixed a longstanding display update bug by applying the same fix to
2001-06-20  Michael Natterer  <mitch@gimp.org>

	* app/gdisplay.c: fixed a longstanding display update bug by
	applying the same fix to gdisplays_update_full() that has been
	applied to gdisplays_update_area() ages ago.

	* app/layers_dialog.c: no need to gdisplays_update_now() when
	deleting the layer, gdisplays_update() works fine now.
2001-06-20 20:20:21 +00:00
Sven Neumann
7a5cc05003 use GINT_TO_POINTER and GPOINTER_TO_INT macros for the gimp_option_menu's
2001-06-20  Sven Neumann  <sven@gimp.org>

	* app/histogram_tool.c: use GINT_TO_POINTER and GPOINTER_TO_INT
	macros for the gimp_option_menu's user_data.
2001-06-20 13:25:27 +00:00
David Neary
44e51d0146 configure.in Added a fix which tests for ieee NaN functions and includes
2001-06-20  David Neary  <dneary@eircom.net>

	* configure.in
	* libgimp/gimpmath.h: Added a fix which tests for ieee NaN
	functions and includes them as the correct name if they
	exist. This closes bug #51822. This fix is courtesy of
	<bugzilla-gnome@thewrittenword.com>.
2001-06-20 10:57:22 +00:00
Sven Neumann
e7f697707e bumped version number to 1.2.2, removed some unneeded sed hacks and added
2001-06-20  Sven Neumann  <sven@gimp.org>

        * configure.in: bumped version number to 1.2.2, removed some
        unneeded sed hacks and added a new one to fix generation of
        plug-ins/perl/po/Makefile.

        * plug-ins/common/ps.c: applied gimp-kirchgessner-010619-0, a patch
        from Peter Kirchgessner that should fix bug #51403.
2001-06-19 23:44:23 +00:00
Rodrigo Sancho Senosiain
8a023f30ca es.po updated 2001-06-19 22:06:53 +00:00
Michael Natterer
ce4de36e2c plug-ins/print/escputil.c one more gimp-print update. (relocated the tag
2001-06-19  Michael Natterer  <mitch@gimp.org>

	* plug-ins/print/escputil.c
	* plug-ins/print/print-escp2.c: one more gimp-print update.
	(relocated the tag in the gimp-print CVS).
2001-06-19 16:36:48 +00:00
Sven Neumann
205b40f589 do not use a drawable_ID from the last run since this drawable might have
2001-06-19  Sven Neumann  <sven@gimp.org>

	* plug-ins/flame/flame.c: do not use a drawable_ID from the last run
	since this drawable might have changed or even vanished. The latter
	case caused a crash (bug #37761).
2001-06-19 16:15:34 +00:00
Sven Neumann
476279ef28 removed translation of <Image> menu path, fixes bug #51631.
2001-06-19  Sven Neumann  <sven@gimp.org>

        * da.po: removed translation of <Image> menu path, fixes bug #51631.
2001-06-19 14:40:52 +00:00
Sven Neumann
f2e47976bf do not use the global variable load_procs used by the file open dialog to
2001-06-19  Sven Neumann  <sven@gimp.org>

	* app/fileops.c (file_open): do not use the global variable
	load_procs used by the file open dialog to store the user setting for
	the filetype. This setting is now only used if files are opened thru
	the file open dialog and not when opened using DND or other methods.
	Fixes bug #51722.
2001-06-18 23:16:34 +00:00
Sven Neumann
9e5951b788 specify encoding for char cell font and use gdk_fontset_load() instead of
2001-06-18  Sven Neumann  <sven@gimp.org>

	* plug-ins/script-fu/script-fu-console.c: specify encoding for char
	cell font and use gdk_fontset_load() instead of gfk_font_load().
	Fixes bug #50522 for me and hopefully does not break things for you.
	Please test the Script-Fu console.
2001-06-18 21:42:57 +00:00
Sven Neumann
06fbe859d8 applied patch found in bug-report #52981 that fixes wrong handling of
2001-06-18  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/newsprint.c: applied patch found in bug-report
	#52981 that fixes wrong handling of GRAYA drawables in the
	Newsprint GUI.

	* app/crop.c: do not update info_window on redraw but only on motion.
	This is a very lame but simple fix for bug #38737. A correct fix
	would be to change the Crop tool not to abuse the info_window, but
	I consider this too much change for 1.2.
2001-06-18 15:55:33 +00:00
Michael Natterer
2066dcddee Selection->timer must be a guint, not a gint.
2001-06-18  Michael Natterer  <mitch@gimp.org>

	* app/selection.h: Selection->timer must be a guint, not a gint.

	May address #10498 "Marching Ants die untimely deaths" but I
	cannot verify that since #10498 never happened here. Chances are
	however good that this is #10498 related, as it usually occurs
	after several hours of usage and may well be a signed<->unsigned
	overflow problem.
2001-06-18 13:49:04 +00:00
Sven Neumann
8f90533acf updated german translations 2001-06-18 12:17:56 +00:00
Sven Neumann
b16210b02f marked missing string for translation.
2001-06-18  Sven Neumann  <sven@gimp.org>

	* plug-ins/gfig/gfig.c: marked missing string for translation.

	* plug-ins/script-fu/scripts/land.scm: corrected wrong parameter
	description.

	Thanks to "Iccii" <iccii@hotmail.com> for his patch.
2001-06-18 12:11:14 +00:00
SHIRASAKI Yasuhiro
8666a1c5df updated japanese translation.
-- yasuhiro
2001-06-17 09:08:19 +00:00
Michael Natterer
7a287c7284 Forgot to update gimp-print's release date and version. 2001-06-15 19:31:40 +00:00
Michael Natterer
21abaeaec3 plug-ins/print/README plug-ins/print/RELNOTES
2001-06-15  Michael Natterer  <mitch@gimp.org>

	* plug-ins/print/README
	* plug-ins/print/RELNOTES
	* plug-ins/print/gimp_main_window.c
	* plug-ins/print/print-dither.c
	* plug-ins/print/print-escp2.c
	* plug-ins/print/print-printers.c
	* plug-ins/print/print-util.c: updated to the latest CVS version
	of the gimp-print stable branch (4.0.5).
2001-06-15 18:54:31 +00:00
Austin Donnelly
3064431069 initialise gdisp->cursor_x and gdisp->cursor_y to 0 in gdisplay_new() so
2001-06-15  Austin Donnelly  <austin@gimp.org>

	* app/gdisplay.c: initialise gdisp->cursor_x and gdisp->cursor_y
	    to 0 in gdisplay_new() so that we don't get floating point
	    exceptions when attempting to translate to screen co-ords in
	    gdisplay_update_cursor().  Fixes critical Bug #56237.
2001-06-15 11:08:07 +00:00
Sven Neumann
493b03b44c unref layers and channels instead of sinking them when destroying an
2001-06-12  Sven Neumann  <sven@gimp.org>

	* app/gimpimage.c: unref layers and channels instead of sinking them
	when destroying an image.
2001-06-12 12:02:20 +00:00
Michael Natterer
0728c46afc Removed some RCS file copying artefacts. 2001-06-04 23:40:03 +00:00
Garry R. Osgood
0addd75b34 English language typo at line 50: it -> is. app/crop.c Fix for bugs #9350
2001-06-02  Garry R. Osgood <grosgood@rcn.com>

* tips/gimp_tips.txt: English language typo at line 50: it -> is.
* app/crop.c Fix for bugs #9350 and #54838 which prevents Gimp
crash on floating selections; issue of bad cropping raised by
#9350 reporter dyfa@addict.de still extant.
2001-06-03 00:31:34 +00:00
Sven Neumann
c00b80e6e0 tips/gimp_conseils.fr.txt tips/gimp_tips.de.txt fixed an error pointed out
2001-06-02  Sven Neumann  <sven@gimp.org>

	* tips/gimp_conseils.fr.txt
	* tips/gimp_tips.de.txt
	* tips/gimp_tips.txt: fixed an error pointed out by Branko Collin:
	Bucket Fill tool uses BG color when pressing Ctrl, not Shift
2001-06-02 15:08:04 +00:00
Kjartan Maraas
008904523e Fill in "charset" field in header. Fill in "charset" field in header.
2001-05-29  Kjartan Maraas  <kmaraas@gnome.org>

	* sk.po: Fill in "charset" field in header.
	* nl.po: Fill in "charset" field in header.
2001-05-29 11:44:40 +00:00
Kjartan Maraas
bf9ecd72de Correct "charset" field in header. Correct "charset" field in header.
2001-05-29  Kjartan Maraas  <kmaraas@gnome.org>

	* sk.po: Correct "charset" field in header.
	* hr.po: Correct "charset" field in header.
2001-05-29 11:43:51 +00:00
Kjartan Maraas
0a201bdb14 Fill in "charset" field in header.
2001-05-29  Kjartan Maraas  <kmaraas@gnome.org>

	* nl.po: Fill in "charset" field in header.
2001-05-29 11:34:57 +00:00
Kjartan Maraas
58b6eafe4c Correct "charset" field in header.
2001-05-29  Kjartan Maraas  <kmaraas@gnome.org>

	* hr.po: Correct "charset" field in header.
2001-05-29 11:08:58 +00:00
Sven Neumann
9912b8094b removed moved files from stable branch 2001-05-28 11:52:02 +00:00
Stanislav Brabec
b33d76c4dd czech translation update 2001-05-24 22:06:40 +00:00
Stanislav Brabec
8149f23a51 czech translation update 2001-05-22 13:11:39 +00:00
Sven Neumann
cf03b5dc21 allow for automake 1.4-p1 and similar version numbers. (fix ported from
2001-05-22  Sven Neumann  <sven@gimp.org>

	* autogen.sh: allow for automake 1.4-p1 and similar version numbers.
	(fix ported from HEAD branch)

	* app/module_db.c: applied a patch from Austin Donnelly that fixes
	bug #55050 (button without label in Module Browser).
2001-05-22 12:51:01 +00:00
Kjartan Maraas
78c2b5565e Updated Norwegian (bokml) translation. Updated Norwegian (nynorsk)
2001-05-22  Kjartan Maraas  <kmaraas@gnome.org>

	* no.po: Updated Norwegian (bokml) translation.
	* nn.po: Updated Norwegian (nynorsk) translation.
2001-05-22 11:17:43 +00:00
Christophe Merlet
62c811c1ea updated French translation.
2001-04-27  Christophe Merlet  <redfox@eikonex.org>

	* fr.po: updated French translation.
2001-05-22 11:06:11 +00:00
Kjartan Maraas
b6548212ad Updated Norwegian (nynorsk) translation. Go wild vidar? :). Updated
2001-05-22  Kjartan Maraas  <kmaraas@gnome.org>

	* nn.po: Updated Norwegian (nynorsk) translation. Go wild vidar? :).
	* no.po: Updated Norwegian (bokml) translation.
2001-05-22 11:01:19 +00:00
Szabolcs Ban
2590efec3c Updated Hungarian translation from Gbor Sveg <gsuveg@sgsystem.com>
2001-05-15  Szabolcs Ban <shooby@gnome.hu>

	* hu.po: Updated Hungarian translation from
	  Gbor Sveg  <gsuveg@sgsystem.com>
2001-05-22 10:59:53 +00:00
Sven Neumann
53841282cd removed moved file from stable branch 2001-05-22 01:35:59 +00:00
Michael Natterer
68ef05ab92 Removed RCS file copying crap. 2001-05-21 21:08:59 +00:00
Sven Neumann
52c3eed847 remove moved file from stabl branch 2001-05-16 17:52:36 +00:00
Szabolcs Ban
1fd5dffc58 Updated Hungarian translation (andras) 2001-05-15 11:13:28 +00:00
Sven Neumann
dad22b5534 removed moved files from the stable branch 2001-05-15 01:55:03 +00:00
Sven Neumann
109c2571ce files moved in HEAD removed from the stable branch 2001-05-13 18:57:04 +00:00
Sven Neumann
0b8b5b6c75 removed files moved for gimp-1.3 from gimp-1.2 branch 2001-05-09 13:58:16 +00:00
Yuri Syrota
3354337efb Updated Ukrainian transaltion 2001-05-08 08:52:45 +00:00
Yuri Syrota
bda194fddb Updated Ukrainian transaltion 2001-05-08 08:36:17 +00:00
Yuri Syrota
082bb21df6 Updated Ukrainian transaltion 2001-05-08 08:28:06 +00:00
Yuri Syrota
cb0ad2c653 Updated Ukrainian transaltion 2001-05-08 08:21:16 +00:00
Garry R. Osgood
3f75975354 app/histogram_tool.c histogram_tool_initialize() now aligns its option
* app/histogram_tool.c
histogram_tool_initialize() now aligns its option menu
and internal state to GIMP_HISTOGRAM_VALUE when it is
given a channel. Prior, only hid option menu, causing
crash reported in #54131 when internals attempted to
generate histogram on non-existent drawable component.
Closes #54131.

Remark: As an enhancement, the tool should listen to
LC&P signals and automatically correlate its state
upon changes in the currently active drawable. Not
implemented with this fix.
2001-05-06 21:15:05 +00:00
Christophe Merlet
41c9ff977c Updated French translations. 2001-04-27 10:28:35 +00:00
Christophe Merlet
e0953c65b9 Updated French translations. 2001-04-26 11:30:38 +00:00
Michael Natterer
e1a46fcb1a Plugged some memleaks:
2001-04-24  Michael Natterer  <mitch@gimp.org>

	Plugged some memleaks:

	* app/gimpbrush.c: don't leak all pixmaps.

	* app/gimpbrushpipe.c: free all the pipe's brushes here.
2001-04-24 21:24:01 +00:00
Sven Neumann
fdd98b6be7 fixed syngin's fix
2001-04-23  Sven Neumann  <sven@gimp.org>

        * plug-ins/perl/examples/terral_text: fixed syngin's fix

        * plug-ins/perl/examples/image_tile
        * plug-ins/perl/examples/yinyang:
        applied gimp-kirchgessner-010422-0.patch which fixes problems with
        invalid number of parameters passed to some functions.

        * plug-ins/script-fu/interp_sliba.c: fixed problems with strbreakup
        reported by Mike Kelly <mike@csuchico.edu> (bugs #52383 and #52385)
2001-04-23 14:41:22 +00:00
Mel Boyce
8b3dde3f51 Fixed typo in plug-ins/perl/terral_text. 2001-04-23 00:44:27 +00:00
Manish Singh
6f81fbeef0 Change the log
-Yosh
2001-04-22 00:22:59 +00:00
Manish Singh
7700d82225 updated libtool stuff
* acinclude.m4: updated libtool stuff

* configure.in: more #undefs so jpeglib.h test works

* plug-ins/common/bumpmap.c: speedup patch from Ernst Lippe
<ernstl@planet.nl> (tile cache size optimization)

-Yosh
2001-04-22 00:08:21 +00:00
Michael Natterer
506da117e6 More RCS file copying... 2001-04-19 02:23:52 +00:00
Michael Natterer
470f814681 Removed RCS file copying crap. 2001-04-18 18:34:01 +00:00
Michael Natterer
01390561f9 Removed stuff that popped out here due to RCS file copying. 2001-04-18 16:59:46 +00:00
Yuri Syrota
12d8a1bbf6 Updated Ukrainian transaltion 2001-04-18 12:16:55 +00:00
Yuri Syrota
49ee8f432c Updated Ukrainian transaltion 2001-04-18 12:04:23 +00:00
Michael Natterer
b9aaba113e Removed RCS file copying uglyness. 2001-04-17 22:11:55 +00:00
Sven Neumann
f1d099c5f3 removed files that were moved in the HEAD branch from gimp-1-2 2001-04-12 14:55:16 +00:00
Stanislav Brabec
8a14090522 On request of Martin Weber <martweb@gmx.net>: GIMP couldn't read bmp files
2001-04-11  Stanislav Brabec  <utx@penguin.cz>

        On request of Martin Weber <martweb@gmx.net>:
        * plug-ins/bmp/bmpread.c:
        GIMP couldn't read bmp files with a ba chunk. This kind of files
        can be found in OS/2 1.x.

Last entry has noted bmp.c. :-(
2001-04-11 19:14:15 +00:00
Stanislav Brabec
bc824a7633 On request of Martin Weber <martweb@gmx.net>: GIMP couldn't read bmp files
2001-04-11  Stanislav Brabec  <utx@penguin.cz>

        On request of Martin Weber <martweb@gmx.net>:
        * plug-ins/bmp/bmp.c:
        GIMP couldn't read bmp files with a ba chunk. This kind of files
        can be found in OS/2 1.x.
2001-04-11 19:10:57 +00:00
Sven Neumann
84094980d8 app/posterize.c plug-ins/common/fractaltrace.c plug-ins/common/illusion.c
2001-04-10  Sven Neumann  <sven@gimp.org>

	* app/posterize.c
	* plug-ins/common/fractaltrace.c
	* plug-ins/common/illusion.c
	* plug-ins/flame/flame.c
	* plug-ins/gfig/gfig.c
	* plug-ins/gimpressionist/general.c
	* plug-ins/imagemap/imap_cmd_guides.c
	* plug-ins/mosaic/mosaic.c
	* plug-ins/winsnap/winsnap.c: applied a patch from Iccii that marks a
	few leftover strings for translation. People, update your translations!
2001-04-10 18:33:16 +00:00
Stanislav Brabec
99098e64c6 czech translation update 2001-04-09 21:57:04 +00:00
Sven Neumann
8c8f9f9ad0 plug-ins/bmp/bmp.c plug-ins/common/jpeg.c plug-ins/common/mpeg.c
2001-04-08  Sven Neumann  <sven@gimp.org>

	* plug-ins/bmp/bmp.c
	* plug-ins/common/jpeg.c
	* plug-ins/common/mpeg.c
	* plug-ins/common/png.c
	* plug-ins/common/tiff.c
	* plug-ins/common/xpm.c
	* plug-ins/script-fu/script-fu.c
	* plug-ins/twain/twain.c
	* plug-ins/winsnap/winsnap.c: s/INIT_I18N/INIT_I18N_UI/. Should
	fix problems with font encodings for russian users (and probably
	others).
2001-04-08 15:52:39 +00:00
Manish Singh
39ba049f22 stray files (only supposed to be in HEAD)
-Yosh
2001-04-08 11:10:46 +00:00
Simon Budig
58478bbff0 added feltpen.gih
2001-04-06  Simon Budig  <simon@gimp.org>

        * brushes/Makefile.am: added feltpen.gih
2001-04-06 19:38:44 +00:00
Stanislav Brabec
9c3f6da262 On request of Martin Weber <martweb@gmx.net>: Fixed bug #52728 - problem
2001-04-06  Stanislav Brabec  <utx@penguin.cz>

        On request of Martin Weber <martweb@gmx.net>:
        * plugins/common/tga.c: Fixed bug #52728 - problem in loading
        compressed and uncompressed 15 bit tga, compressed 16 bit tga
        files and removed a false warning for 32 bit tga files.
2001-04-05 22:26:50 +00:00
Matt Wilson
ecd7f0c849 _always_ set up the other locale categories, otherwise many C libraries
2001-04-03  Matt Wilson  <msw@redhat.com>

	* libgimp/gimp.c (gimp_main): _always_ set up the other locale
	categories, otherwise many C libraries will blow away characters
	outside of the POSIX charset.  Still use the C locale for
	LC_NUMERIC, though. r: yosh@gimp.org
2001-04-04 00:47:37 +00:00
Sven Neumann
bb22b8f8dc updates and corrections to the dutch translation kindly provided by Branko
2001-04-02  Sven Neumann  <sven@gimp.org>

	* nl.po: updates and corrections to the dutch translation kindly
	provided by Branko Collin <collin@xs4all.nl>
2001-04-02 00:53:37 +00:00
SHIRASAKI Yasuhiro
9d8a4ac5cf Updated japanese translation.
-- yasuhiro
2001-04-01 14:06:01 +00:00
Fatih Demir
10350a7f90 Added tr.po 2001-03-25 14:42:47 +00:00
Stanislav Brabec
6fea058234 Bucket fill threshold=0 must be allowed.
2001-03-22  Stanislav Brabec  <utx@penguin.cz>

        * app/bucket_fill.c: Bucket fill threshold=0 must be allowed.
2001-03-21 23:31:44 +00:00
Jesus Bravo Alvarez
2c9ababaf4 Added Galician translation 2001-03-20 19:30:21 +00:00
Marc Lehmann
66c9b544cb *** empty log message *** 2001-03-16 18:20:45 +00:00
Fatih Demir
09f60780b0 Update 2001-03-15 23:01:50 +00:00
Fatih Demir
3175e8a06b Update 2001-03-15 15:24:28 +00:00
Fatih Demir
9aa0155d46 Added tr.po 2001-03-15 15:14:01 +00:00
Fatih Demir
3945286814 Foosh tr.po 2001-03-15 15:11:08 +00:00
Fatih Demir
41e613643b Added foo'sh tr.po 2001-03-15 15:07:14 +00:00
Sven Neumann
6f081ecd84 applied patch from Tom Holroyd <tomh@po.crl.go.jp> which fixes wrong array
2001-03-15  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/screenshot.c: applied patch from
        Tom Holroyd <tomh@po.crl.go.jp> which fixes wrong array size.
2001-03-15 09:59:01 +00:00
Fatih Demir
e3e5696140 Turkish GIMP --part IIa 2001-03-13 19:04:58 +00:00
Fatih Demir
5cb312a7c9 Yippe, turkish GIMP -- more or less 2001-03-13 18:57:13 +00:00
Jesus Bravo Alvarez
1fde92ab29 Updated Galician translation 2001-03-12 21:55:28 +00:00
Tor Lillqvist
a94a07e899 Add missing object files. The import library for the intl library is now
2001-03-12  Tor Lillqvist  <tml@iki.fi>

	* libgimp/makefile.msc: Add missing object files. The import
	library for the intl library is now called just intl.

	* libgimp/makefile.msc (gimpi_OBJECTS): Typo.

	* app/makefile.msc (gimp_OBJECTS): Remove objects corresponding to
	removed source files. Update name of import library for the intl
	library. Add missing objects.

	* app/gimpbrush.c
	* app/gimpbrushpipe.c
	* app/patterns.c: Include <glib.h> early for G_OS_WIN32.
2001-03-12 19:27:17 +00:00
Tor Lillqvist
7777db4637 Change the #ifdef logic: Declare dialog_register and dialog_unregister
2001-03-12  Tor Lillqvist  <tml@iki.fi>

	* app/dialog_handler.h: Change the #ifdef logic: Declare
	dialog_register and dialog_unregister always, but mark for export
	only when compiling dialog_handler.c. That way MSVC won't complain
	when dialog_handler.c calls dialog_unregister without it
	being defined, and also the declarations and definitions will
	have identical attributes (both marked for export). Whew. Gcc
	is a bit less picky, it accepts a declaration that isn't marked
	for export even if the definition is.

	* app/dialog_handler.c: Change comment correspondingly.
2001-03-12 19:02:38 +00:00
Daniel Egger
aeb14e9c69 Applied patch from Austin Donnelly to fix rendering of the topmost
2001-03-11  Daniel Egger  <egger@suse.de>

	* plug-ins/common/sobel.c: Applied patch from
	Austin Donnelly to fix rendering of the topmost
	scanline.
2001-03-11 16:23:01 +00:00
Tor Lillqvist
8069f82e08 Enhance to also be able to paste BI_BITFIELDS images, 16- or 32-bit.
2001-03-11  Tor Lillqvist  <tml@iki.fi>

	* plug-ins/common/winclipboard.c: Enhance to also be able to paste
	BI_BITFIELDS images, 16- or 32-bit. Global indentation and spacing
	fix (use cvs diff -bu2 to see the real differences).
2001-03-10 23:28:32 +00:00
Tor Lillqvist
f67eb3621b Add some missing standard plug-ins, and some new unofficial ones. Don't
2001-03-10  Tor Lillqvist  <tml@iki.fi>

	* plug-ins/makefile.mingw.in: Add some missing standard plug-ins,
	and some new unofficial ones. Don't define -Drandom=g_random_int,
	the RAND_FUNC in config.h.win32 takes care of this. Define GIMP
	for mathmap.

	* user_install.bat: Copy the default palettes to the user's
	palette directory.

	* app/dialog_handler.c: Define __DIALOG_HANDLER_C_, not
	__DIALOG_HANDLER_C__, to match the #ifndef in
	dialog_handler.h. Add comment why __DIALOG_HANDLER_C_ is needed.
2001-03-10 11:39:34 +00:00
Daniel Egger
1c503a7c41 Fixed duplicate translation.
2001-03-09  Daniel Egger  <egger@suse.de>

	* it.po: Fixed duplicate translation.
2001-03-09 15:28:53 +00:00
Stanislav Brabec
59be9a10f4 czech translation update 2001-03-07 20:21:28 +00:00
Chyla Zbigniew
6ecef467ab Move variable assignments out of assertions to allow compilation with
* app/commands.c (image_scale_callback),
libgimp/gimpchainbutton.c (gimp_chain_button_destroy),
libgimp/gimpcolorbutton.c (gimp_color_button_destroy):
Move variable assignments out of assertions to allow compilation
with "G_DISABLE_ASSERT" and/or "G_DISABLE_CHECKS" defined.
2001-03-04 15:33:07 +00:00
Sven Neumann
adcfce79ef applied a patch from David Odin <David.Odin@bigfoot.com> that fixes a typo
2001-03-04  Sven Neumann  <sven@gimp.org>

	* app/preferences_dialog.c (prefs_save_callback): applied a patch
	from David Odin <David.Odin@bigfoot.com> that fixes a typo in the code.
2001-03-04 11:05:09 +00:00
Daniel Egger
95783bddfe Move the pre-1.2 changes out to their own new file.
2001-03-01  Daniel Egger  <egger@suse.de>

	* ChangeLog:
	* ChangeLog.pre-1-2: Move the pre-1.2 changes out
	to their own new file.
2001-03-01 21:05:39 +00:00
Daniel Egger
f30a29c804 Applied fix from Dave Neary to fix bug #37633 "File->Revert doesn't resize
2001-03-01  Daniel Egger  <egger@suse.de>

	* app/fileops.c: Applied fix from Dave Neary to fix
	bug #37633 "File->Revert doesn't resize canvas". Not
	the best fix but quite effective.
2001-03-01 21:00:14 +00:00
Stanislav Brabec
199e2aaf31 Fixed black_level range. Valid range should be -1..255, not 0..256,
2001-03-01  Stanislav Brabec  <utx@penguin.cz>

        * plugins/common/despeckle.c: Fixed black_level range.
        Valid range should be -1..255, not 0..256, because comaparison
        is > and <=. Bug became visible after last Martin Weber's fix.
	There must be for both black and white levels one extra value
        to cover all numbers 0..255.
2001-03-01 18:42:24 +00:00
Sven Neumann
e55aba4a85 applied patch from Chuck Mason <chuckjr@unbounded.com> that fixes wrong
2001-02-27  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/header.c: applied patch from Chuck Mason
	<chuckjr@unbounded.com> that fixes wrong output of header plug-in.
2001-02-27 15:57:46 +00:00
Stanislav Brabec
cdec482132 czech translation update 2001-02-17 20:28:48 +00:00
Stanislav Brabec
f52138cc3b Changed my last changelog entry to be more descriptive. No code change. 2001-02-12 21:38:21 +00:00
Daniel Egger
d63f52c77f Fixed wrong phrase. Mentioned by Manuel Ignacio Monge Garca in bug
2001-02-12  Daniel Egger  <egger@suse.de>

        * es.po: Fixed wrong phrase. Mentioned by Manuel Ignacio
	Monge Garca in bug #34595.
2001-02-12 12:37:53 +00:00
Richard Hult
6ae79c46e7 No cracker for stric. Fix spelling. 2001-02-12 09:06:30 +00:00
Michael Natterer
bb26ef6b56 Removed stuff which appeared because of RCS file copying. 2001-02-10 19:41:39 +00:00
Stanislav Brabec
0c5384a138 Fixed comparison *sort_ptr > black_level. Patch from Martin Weber
2001-02-10  Stanislav Brabec  <utx@penguin.cz>

        * plugins/common/despeckle.c: Fixed comparison *sort_ptr > black_level.
        Patch from Martin Weber <martweb@gmx.net>.
2001-02-10 18:30:46 +00:00
Christophe Merlet
f391c7af02 Minors updates of the French translation. 2001-02-09 11:45:14 +00:00
Manish Singh
0808e84384 filler file
-Yosh
2001-02-08 19:17:50 +00:00
Daniel Egger
c66a704fe9 Applied fix for #37716 from Domenico Rotiroti.
2001-02-08  Daniel Egger <egger@suse.de>

        * it.po: Applied fix for #37716 from Domenico Rotiroti.
2001-02-08 14:35:38 +00:00
Daniel Egger
860cd82ce0 Changed link order in gtkxmhtml check to fix bug #12653.
2001-02-07  Daniel Egger  <egger@suse.de>

        * configure.in: Changed link order in gtkxmhtml check
	to fix bug #12653.
2001-02-07 15:48:33 +00:00
Sven Neumann
5a50f59aa3 converted these brushes to the new brush format 2001-02-06 15:44:14 +00:00
jaycox
2c2c5a963f Applied patches by Roel Schroeven <rschroev@yahoo.com> that fix histogram
* app/gimphistogram.c: Applied patches by Roel Schroeven
	<rschroev@yahoo.com> that fix histogram with mask calculation bug and
	median calculation bug.
2001-02-06 07:13:26 +00:00
Christophe Merlet
55313aac0b Updated French translations. 2001-02-03 17:08:20 +00:00
Sven Neumann
8b610eee11 removed files that were moved for the HEAD tree 2001-02-02 09:25:01 +00:00
Szabolcs Ban
c0bb8cf14a Terminology fixes 2001-01-31 16:42:11 +00:00
Kjartan Maraas
5ec71eb2b5 Added Norwegian (nynorsk) translation.
2001-01-30  Kjartan Maraas  <kmaraas@gnome.org>

	* nn.po: Added Norwegian (nynorsk) translation.
2001-01-30 14:14:54 +00:00
Kjartan Maraas
c9a1e41c08 Added Norwegian (nynorsk) translation.
2001-01-30  Kjartan Maraas  <kmaraas@gnome.org>

	* nn.po: Added Norwegian (nynorsk) translation.
2001-01-30 11:55:30 +00:00
Kjartan Maraas
6e9863aafd Added Norwegian (nynorsk) translation.
2001-01-30  Kjartan Maraas  <kmaraas@gnome.org>

	* nn.po: Added Norwegian (nynorsk) translation.
2001-01-30 10:29:36 +00:00
Kjartan Maraas
7b6a816df6 Added "nn" to ALL_LINGUAS.
2001-01-30  Kjartan Maraas  <kmaraas@gnome.org>

	* configure.in: Added "nn" to ALL_LINGUAS.
2001-01-30 10:22:45 +00:00
Kjartan Maraas
28feedb0aa Added Norwegian (nynorsk) translation. Go wild vidar. Updated Norwegian
2001-01-30  Kjartan Maraas  <kmaraas@gnome.org>

	* nn.po: Added Norwegian (nynorsk) translation. Go wild vidar.
	* no.po: Updated Norwegian (bokml) translation.
2001-01-30 10:20:49 +00:00
Ben Gertzfield
47a1797b56 Update debian/ directory for GIMP 1.2 2001-01-29 22:57:07 +00:00
Szabolcs Ban
c6e457c32d Updated Hungarian translation 2001-01-29 14:43:57 +00:00
Szabolcs Ban
3f24d778a0 Fixed Hungarian translation 2001-01-29 12:49:41 +00:00
Szabolcs Ban
327b989f90 Updated Hungarian translation 2001-01-29 12:47:13 +00:00
Asbjørn Pettersen
3f3bac47ba os2 patches g1.2 2001-01-28 15:42:35 +00:00
Sven Neumann
d1420a74e0 forgot to commit this one... 2001-01-24 21:22:14 +00:00
Sven Neumann
3d2af79d1d fixed wrong for-loop boundary that caused the gimp_mem_size_entry not to
2001-01-24  Sven Neumann  <sven@gimp.org>

	* libgimp/gimpwidgets.c: fixed wrong for-loop boundary that caused
	the gimp_mem_size_entry not to accept values larger than 1023 MB.
2001-01-24 21:17:44 +00:00
Manish Singh
6f374639d8 bye bye silly files than don't belong in this branch
-Yosh
2001-01-24 21:15:47 +00:00
Manish Singh
7c315d0504 these files don't belong in this branch
-Yosh
2001-01-23 01:07:27 +00:00
Szabolcs Ban
ac99bd54bd Header fix 2001-01-22 14:57:18 +00:00
Manish Singh
ba7570135f 1.2.1 stuff
-Yosh
2001-01-22 06:23:40 +00:00
Manish Singh
5a93b61f6a doesn't belong in this branch
-Yosh
2001-01-22 03:48:30 +00:00
Manish Singh
13f0fd0a44 these don't belong in this tag
-Yosh
2001-01-22 02:29:12 +00:00
Michael Natterer
cce8826c5f disabled debugging output.
2001-01-22  Michael Natterer  <mitch@gimp.org>

	* app/gimphelp.c: disabled debugging output.
2001-01-22 00:41:12 +00:00
Michael Natterer
251a847c57 C/bug_submission.html new files.
2001-01-22  Michael Natterer  <mitch@gimp.org>

	* C/bug_submission.html
	* C/filters/mblur.html: new files.

	* C/*: updated.
2001-01-22 00:30:44 +00:00
Szabolcs Ban
e4deab6a83 Updated hu.po from Emese 2001-01-21 17:17:44 +00:00
Szabolcs Ban
1b5179da97 updated hu.po by <emese@gnome.hu> 2001-01-21 14:32:07 +00:00
Szabolcs Ban
cbfc6bd583 updated hu.po from emese@gnome.hu 2001-01-21 14:23:31 +00:00
Michael Natterer
f6032b0009 plugged memory leaks.
2001-01-20  Michael Natterer  <mitch@gimp.org>

	* app/palette.c: plugged memory leaks.
2001-01-20 16:57:22 +00:00
Stanislav Brabec
4a1de1829c czech translation update 2001-01-17 22:18:22 +00:00
Sven Neumann
63276a0bdf some more fixes to INSTALL 2001-01-17 14:10:35 +00:00
Sven Neumann
58db1a78e4 INSTALL changed .gimp to .gimp-1.2
2001-01-17  Sven Neumann  <sven@gimp.org>

	* INSTALL
	* configure.in: changed .gimp to .gimp-1.2
2001-01-17 09:01:27 +00:00
Manish Singh
1e3d05a98b correct spelling of "lose" in revert dialog
-Yosh
2001-01-16 01:21:39 +00:00
Chyla Zbigniew
e76e005030 Updated Polish translation 2001-01-15 16:36:52 +00:00
Sven Neumann
6900ad641c corrected FTP location of gimp
2001-01-15  Sven Neumann  <sven@gimp.org>

	* gimp.spec.in: corrected FTP location of gimp
2001-01-15 01:27:44 +00:00
Sven Neumann
5ab9fc9dbc added note about autogenerated files (merged from HEAD)
2001-01-14  Sven Neumann  <sven@gimp.org>

	* HACKING: added note about autogenerated files (merged from HEAD)
2001-01-14 20:34:24 +00:00
Sven Neumann
ae881a0fd0 app/menus.c added some sanity checks for passed string pointers to various
2001-01-14  Sven Neumann  <sven@gimp.org>

	* app/menus.c
	* app/plug-in.c: added some sanity checks for passed string pointers
	to various public functions in an attempt to fix bug #37622. I'm not
	sure if this fixes the bug since I can not reproduce it.
2001-01-14 15:14:28 +00:00
Szabolcs Ban
998378962e Updated Hungarian translation 2001-01-12 14:51:52 +00:00
Sven Neumann
574134aeeb applied a patch from Jerome Zago <jzago@ifhamy.insa-lyon.fr> that fixes a
2001-01-12  Sven Neumann  <sven@gimp.org>

	* plug-ins/common/sharpen.c: applied a patch from Jerome Zago
	<jzago@ifhamy.insa-lyon.fr> that fixes a longstanding bug in the
	sharpen filter which sometimes got the last line wrong.
	Fixes bug #34155
2001-01-12 13:15:10 +00:00
Sven Neumann
6a67e14488 removed .html from the list of file extensions registered for aa
--Sven
2001-01-11 16:51:43 +00:00
Szabolcs Ban
acfa58d27f Updated hu.po by Emese Kovacs <emese@gnome.hu> 2001-01-11 01:08:42 +00:00
Szabolcs Ban
9c96e31ab2 Typo fix 2001-01-11 00:21:08 +00:00
Sven Neumann
ae1f5d1209 blue is (0,0,1), not (0,0,2)
2001-01-10  Sven Neumann  <sven@gimp.org>

	* plug-ins/ifscompose/ifscompose.c: blue is (0,0,1), not (0,0,2)
2001-01-10 22:38:10 +00:00
Szabolcs Ban
f15ba55baf Fixed typo in MapObject plugin 2001-01-10 19:37:03 +00:00
Sven Neumann
680a5166d4 app/gimpbrushlist.c app/gradient.c app/palette.c check for NULL pointers
2001-01-09  Sven Neumann  <sven@gimp.org>

	* app/gimpbrushlist.c
	* app/gradient.c
	* app/palette.c
	* app/patterns.c: check for NULL pointers before doing strcmp on
	default names. The default names for brushes, patterns, ... can
	be NULL if they were not set in a readable gimprc file.

	* app/gimprc.c: warn the user if the systemwide gimprc couldn't be
	read.
2001-01-09 22:24:21 +00:00
Christophe Merlet
42ad892888 Updated French translation. 2001-01-09 16:25:34 +00:00
Szabolcs Ban
f3ad657a06 Updated Hungarian translation 2001-01-09 10:02:39 +00:00
Christophe Merlet
04cb1501ef Updated French translations. 2001-01-04 15:02:18 +00:00
Tor Lillqvist
20230e4cf8 Correct args to gimp-color-picker. Thanks to Piet van Oostrum.
2001-01-04  Tor Lillqvist  <tml@iki.fi>

	* plug-ins/script-fu/scripts/title-header.scm (script-fu-title-header):
	Correct args to gimp-color-picker. Thanks to Piet van Oostrum.
2001-01-03 22:17:04 +00:00
Michael Natterer
d1b5a82f61 reverted the behaviour of the "Reset" button back to resetting the current
2001-01-03  Michael Natterer  <mitch@gimp.org>

	* app/levels.c: reverted the behaviour of the "Reset" button back
	to resetting the current channel only. Resetting all channels was
	broken and IMHO cannot work the way it was implemented.
2001-01-03 02:51:49 +00:00
Michael Natterer
13a2a6fa89 Removed files which appeard due to code reorg (RCS voodoo) in HEAD. 2001-01-02 21:06:41 +00:00
Simon Budig
d0c7d9f862 use floor() before casting to gint when calculating the current brush
2001-01-02  Simon Budig  <simon@gimp.org>

	* app/paint_core.c: use floor() before casting to gint when
	calculating the current brush coordinates. Fixes the jagged brush
	stroke when stroking a path that leaves the image at the top or left
	edge (bug #6043).

Merged fix from HEAD.
2001-01-02 20:28:42 +00:00
Christophe Merlet
01c5c3c35e Updated French translations. 2001-01-02 16:02:23 +00:00
Szabolcs Ban
92b9c4d1a5 Updated Hungarian translation 2001-01-02 14:10:29 +00:00
Kjartan Maraas
92f8046495 Updated Norwegian translation.
2001-01-02  Kjartan Maraas  <kmaraas@gnome.org>

	* no.po: Updated Norwegian translation.
2001-01-02 12:58:53 +00:00
Kjartan Maraas
d208dd4e28 Forgot this 2001-01-02 12:09:39 +00:00
Kjartan Maraas
196cf86077 Updated Norwegian translation.
2001-01-02  Kjartan Maraas  <kmaraas@gnome.org>

	* no.po: Updated Norwegian translation.
2001-01-02 11:58:03 +00:00
Stanislav Brabec
d324c09db2 Updated translation.
2000-12-31  Stanislav Brabec  <utx@penguin.cz>

	* cs.po: Updated translation.
2001-01-02 11:11:07 +00:00
Michael Natterer
9c557d6c38 s/welcome.html/introduction.html/ Fixes #36456.
2001-01-02  Michael Natterer  <mitch@gimp.org>

	* app/gimphelp.c (gimp_idle_help): s/welcome.html/introduction.html/
	Fixes #36456.
2001-01-02 03:23:10 +00:00
Michael Natterer
a38c46c985 Fixed an <Image> entry which was translated. Closes #36455.
2001-01-02  Michael Natterer  <mitch@gimp.org>

	* hu.po: Fixed an <Image> entry which was translated. Closes #36455.
2001-01-02 03:14:37 +00:00
Michael Natterer
f67003898a also check for GIMP's minor version when deciding if to add a missing PDB
2001-01-01  Michael Natterer  <mitch@gimp.org>

	* plug-ins/gdyntext/gdyntextcompat.h: also check for GIMP's minor
	version when deciding if to add a missing PDB wrapper.
2001-01-01 19:19:22 +00:00
Michael Natterer
b03320ec69 removed the display filters help and the links to them. DocBook insists on
2001-01-01  Michael Natterer  <mitch@gimp.org>

	* C/[some files]: removed the display filters help and the links
	to them. DocBook insists on canging lots of files, though :(
2001-01-01 19:05:12 +00:00
Stanislav Brabec
529f28e6bd czech translation update 2000-12-31 21:02:46 +00:00
Sven Neumann
4b445a15dc Simon Budig <simon@gimp.org>
2000-12-31  Sven Neumann  <sven@gimp.org>
            Simon Budig <simon@gimp.org>

	* app/gimpbrush.c
	* plug-ins/common/gih.c: explicitely cast offset to (off_t) when
	seeking back. Should fix the problems reading grayscale BrushPipes
	on IRIX.
2000-12-31 13:03:04 +00:00
Tor Lillqvist
a76b992023 RAND_FUNC must not return negative values. Can't use g_random_int as is,
2000-12-29  Tor Lillqvist  <tml@iki.fi>

	* config.h.win32: RAND_FUNC must not return negative values. Can't
	use g_random_int as is, must use g_random_int_range (0, G_MAXINT).

	* plug-ins/flame/cmap.c: Include glib.h for G_MAXINT.
2000-12-29 21:02:57 +00:00
Sven Neumann
b5a63f6c6c added confetti.gih and hsparks.gih
2000-12-29  Sven Neumann  <sven@gimp.org>

	* brushes/Makefile.am: added confetti.gih and hsparks.gih
2000-12-29 18:38:20 +00:00
Rodrigo Sancho Senosiain
7d2ad5703a updated 2000-12-29 17:38:59 +00:00
CET 2000 Simon Budig
d84a8c3b62 New brushpipe: basically the components of confetti.gbr. Works great with
Fri Dec 29 18:14:46 CET 2000  Simon Budig  <simon@gimp.org>

        * data/brushes/confetti.gih:  New brushpipe: basically the
        components of confetti.gbr. Works great with the "size"-pressure
        option.
2000-12-29 17:19:23 +00:00
Simon Budig
9da943f172 modules/colorsel_triangle.c Argh - converting 16bit colors (from
2000-12-29  Simon Budig   <simon@gimp.org>

        * modules/colorsel_triangle.c  Argh - converting 16bit colors
        (from DnD-Source) to 8 bit must not be done by dividing by 0xff (255)!
        divide by 256 instead...
2000-12-29 08:01:45 +00:00
Tor Lillqvist
b285ab1fbc Build as a windowing application (-mwindows).
2000-12-29  Tor Lillqvist  <tml@iki.fi>

	* app/makefile.mingw.in: Build as a windowing application (-mwindows).

	* app/gimp.sym: Remove the color display functions that are gone.

	* plug-ins/makefile.mingw.in: Build two versions of the tiff
	plug-in: tiff (with TIFF_LZW_LIBS), and tiff_nolzw (with
	TIFF_NOLZW_LIBS).
2000-12-28 22:29:19 +00:00
Christophe Merlet
67dd3e425a Updated French translation. 2000-12-28 20:00:10 +00:00
Sven Neumann
cb0285b1f9 app/channel.c use gtk_object_sink() instead of gtk_object_unref() when
2000-12-28  Sven Neumann  <sven@gimp.org>

	* app/channel.c
	* app/layer.c: use gtk_object_sink() instead of gtk_object_unref()
	when deleting a layer or channel since only floating objects should
	be destroyed this way. A layer or channel that has been attached
	to an image shall never be deleted.

	* app/layer_cmds.c
	* libgimp/gimplayer_pdb.c
	* tools/pdbgen/pdb/layer.pdb: reenabled the gimp_layer_delete() PDB
	function since it might be useful under rare circumstances.
2000-12-28 19:16:12 +00:00
Manish Singh
7cabed1099 erp wrong tree
-Yosh
2000-12-28 02:16:28 +00:00
Manish Singh
55ff3e95e8 bump up to version 1.3.0
-Yosh
2000-12-28 02:16:04 +00:00
Sven Neumann
420c1ba7a9 app/channel_cmds.c app/layer_cmds.c libgimp/gimpchannel_pdb.c
2000-12-28  Sven Neumann  <sven@gimp.org>

	* app/channel_cmds.c
	* app/layer_cmds.c
	* libgimp/gimpchannel_pdb.c
	* libgimp/gimplayer_pdb.c
	* plug-ins/common/warp.c
	* plug-ins/gap/gap_exchange_image.c
	* plug-ins/gap/gap_range_ops.c
	* plug-ins/perl/examples/bricks
	* plug-ins/perl/examples/glowing_steel
	* tools/pdbgen/pdb/channel.pdb
	* tools/pdbgen/pdb/layer.pdb

	Two of the gimp-perl scripts used to call gimp_layer_delete() after
	gimp_image_remove_layer(). This will fail since the layer is already
	scheduled for destruction by removing it from the associated image or
	by deleting that image. It is thus dangerous and superfluous to export
	this feature through the PDB. The gimp_layer_delete() is hereby
	obsolete and does nothing any longer. I have removed the code calling
	it from all over the place (it was commented out in almost all places).

	The PDB help for gimp_channel_delete() now explicetly tells the user
	about the proper usage of the procedure.
2000-12-27 23:47:53 +00:00
Michael Natterer
1e9f2ccbaa the size of the string holding the image data was one byte too short (we
2000-12-27  Michael Natterer  <mitch@gimp.org>

	* plug-ins/common/csource.c: the size of the string holding the
	image data was one byte too short (we forgot the trailing '\0').
	Reported by <goswin.brederlow@student.uni-tuebingen.de>
2000-12-27 20:44:37 +00:00
Michael Natterer
bca4438610 gimp_image_merge_layers(): apply the layer mask only if layer->apply_mask
2000-12-27  Michael Natterer  <mitch@gimp.org>

	* app/gimpimage.c: gimp_image_merge_layers(): apply the layer mask
	only if layer->apply_mask is TRUE.
2000-12-27 17:55:19 +00:00
Michael Natterer
df231e4fb6 layers_dialog_scroll_index(): don't fiddle around with magic numbers when
2000-12-27  Michael Natterer  <mitch@gimp.org>

	* app/layers_dialog.c: layers_dialog_scroll_index(): don't fiddle
	around with magic numbers when calculating the layer widget's
	height but simply ask one of them for it's allocation.  Fixes
	positioning when the preview is smaller than the layer widget list
	item.
2000-12-27 14:56:10 +00:00
Tomas Ogren
623770d603 Remove the last comma in an enum, xlc barfs
2000-12-27  Tomas Ogren  <stric@ing.umu.se>

* plug-ins/ifscompose/ifscompose_storage.c: Remove the last comma in
  an enum, xlc barfs
2000-12-27 02:46:48 +00:00
Manish Singh
f71fde4cd6 fix fd leak on pattern loading
-Yosh
2000-12-26 19:13:31 +00:00
SHIRASAKI Yasuhiro
0ea31429db updated japanese translation. 2000-12-25 11:46:10 +00:00
2047 changed files with 428551 additions and 569782 deletions

View File

@@ -1,23 +1,30 @@
Makefile.in .xvpics
ABOUT-NLS
Makefile Makefile
configure Makefile.in
config.log aclocal.m4
config.h autom4te.cache
config.cache config.cache
stamp-h config.guess
gimp.1 config.h
config.h.in
config.log
config.status
config.sub
configure
gimp-1.2.1
gimp-remote-1.2.1
gimp-zip
gimp.spec gimp.spec
gimprc gimprc
gimprc.5 gimprc-1.2.5
gimptool.1
gimp-remote.1
config.status
libtool
aclocal.m4
gimprc_user gimprc_user
gimptool gimptool-1.2
gimptool-1.2.1
gimptool-win32.c
intl intl
config.h.in libtool
ltmain.sh
stamp-h
stamp-h.in stamp-h.in
ABOUT-NLS stamp-h1
.xvpics

View File

@@ -36,6 +36,7 @@ Seth Burgess
Brent Burton Brent Burton
Francisco Bustamante Francisco Bustamante
Albert Cahalan Albert Cahalan
George J. Carrette
Sean Cier Sean Cier
Winston Chang Winston Chang
Kenneth Christiansen Kenneth Christiansen

30517
ChangeLog

File diff suppressed because it is too large Load Diff

28791
ChangeLog.pre-1-2 Normal file

File diff suppressed because it is too large Load Diff

16
HACKING
View File

@@ -4,7 +4,7 @@ to have the following packages installed:
- GNU autoconf 2.13 - GNU autoconf 2.13
- GNU automake 1.4 - GNU automake 1.4
- GNU libtool 1.2d - GNU libtool 1.2d
- GNU gettext 10.35 - GNU gettext 10.38
Available in ftp://alpha.gnu.org/gnu Available in ftp://alpha.gnu.org/gnu
@@ -33,17 +33,13 @@ Note that autogen.sh runs configure for you. If you wish to pass
options like --prefix=/usr to configure you can give those options options like --prefix=/usr to configure you can give those options
to autogen.sh and they will be passed on to configure. to autogen.sh and they will be passed on to configure.
If at all possible, please use CVS to get the latest development version of
gimp, as well as the CVS version of gtk+. You can do the following to get
gimp and gtk+ from cvs:
$ export CVSROOT=':pserver:anonymous@anoncvs.gimp.org:/cvs/gnome'
$ cvs login
(there is no password, just hit return)
$ cvs -z3 checkout gtk+ gimp
Please submit patches to the gimp-developer@scam.xcf.berkeley.edu mailing Please submit patches to the gimp-developer@scam.xcf.berkeley.edu mailing
list. All kinds of contributions are accepted. Patches that you wish to go list. All kinds of contributions are accepted. Patches that you wish to go
into the distribution should also be uploaded to ftp://ftp.gimp.org/incoming. into the distribution should also be uploaded to ftp://ftp.gimp.org/incoming.
Follow the rules there for naming your patches. Follow the rules there for naming your patches.
Please notice that some files in the source are generated from other sources.
Among these are the files ending in _pdb.[ch] in the libgimp directory
and the files ending in _cmds.c in the app subdirectory. Those are generated
from the respective .pdb files in tools/pdbgen/pdb. All those files have a
short notice about being autogenerated somewhere at the top.

49
INSTALL
View File

@@ -24,8 +24,8 @@ packages are included below. Here is an illustration of commands that
might be used to build and install the GIMP. The actual configuration, might be used to build and install the GIMP. The actual configuration,
compilation and installation output is not shown. compilation and installation output is not shown.
% tar xvfz gimp-1.2.0.tar.gz # unpack the sources % tar xvfz gimp-1.2.x.tar.gz # unpack the sources
% cd gimp-1.2.0 # change to the toplevel directory % cd gimp-1.2.x # change to the toplevel directory
% ./configure # run the `configure' script % ./configure # run the `configure' script
% make # build the GIMP % make # build the GIMP
% make install # install the GIMP % make install # install the GIMP
@@ -56,10 +56,15 @@ recognizes. These are:
is intended primarily as a convenience for developers. is intended primarily as a convenience for developers.
4. --enable-gimpdir=DIR. This option changes the default directory 4. --enable-gimpdir=DIR. This option changes the default directory
the gimp uses to search for its configuration files from ~/.gimp (the the gimp uses to search for its configuration files from ~/.gimp-1.2
directory .gimp in the users home directory) to DIR. (the directory .gimp-1.2 in the users home directory) to DIR.
5. --enable-perl and --disable-perl. The perl extension does not build 5. --disable-print. The print plug-in requires a recent version of
libgimpprint. If you don't have it already installed, download
it from http://gimp-print.sourceforge.net/. If you want to compile
GIMP without support for printing, use the --disable-print option.
6. --enable-perl and --disable-perl. The perl extension does not build
on all systems. If you experience problems use --disable-perl on all systems. If you experience problems use --disable-perl
and gimp will not even try to built it. The perl extension does and gimp will not even try to built it. The perl extension does
not usually respect the normal configure prefix but uses perl's not usually respect the normal configure prefix but uses perl's
@@ -70,29 +75,24 @@ recognizes. These are:
get many errors on startup. See README.perl for even finer grained get many errors on startup. See README.perl for even finer grained
control about installation paths (and distribution making). control about installation paths (and distribution making).
6. --enable-nls and --disable-nls. This option changes whether to build 7. --enable-nls and --disable-nls. This option changes whether to build
GIMP with or without localisation support. This option is enabled by GIMP with or without localisation support. This option is enabled by
default. If you'd like to enjoy GIMP in your native language, assuming default. If you'd like to enjoy GIMP in your native language, assuming
the necessary catalogs are available, then leave this option on. If the necessary catalogs are available, then leave this option on. If
you'd like to have an English GIMP in every case then turn this option you'd like to have an English GIMP in every case then turn this option
off; this will also decrease the binary size by a few bits. off; this will also decrease the binary size by a few bits.
7. --with-threads and --with-mp. This options control whether to build 8. --with-mp. This options control whether to build GIMP with or without
GIMP with or without support for multiple processors. This options are support for multiple processors. This option is off by default. If you
off by default. If you do have multiply processors and run GIMP with do have multiply processors and run GIMP with an OS supporting them
an OS supporting them you will like to enable this features to use you will like to enable this features to use all of your horsepower.
all of your horsepower. Enabling it on singleprocessor systems won't Enabling it on singleprocessor systems won't harm but cause a bit
harm but cause a bit processing overhead. processing overhead.
8. --with-sendmail=[], --with-lp=[], --with-lpc=[], --with-lpr=[] and 9. --with-sendmail=[]. This option is used to tell GIMP where to find
--with-lpstat=[]. This options are used to tell GIMP where to find this command. Normally this options don't have to be used because
this commands. Normally this options don't have to be used because configure tries to find it in the usual places.
configure tries to find them in the usual places.
9. --enable-python and --disable-python. This options control whether to
build the python scripting language plygin or not. This options
defaults to off.
The `make' command builds several things: The `make' command builds several things:
- The libraries `libgimp/libgimp.la', `libgimp/libgimpi.la' and - The libraries `libgimp/libgimp.la', `libgimp/libgimpi.la' and
`libgimp/libgimpui.la'. The `.la' suffix is used by libtool, the `libgimp/libgimpui.la'. The `.la' suffix is used by libtool, the
@@ -101,11 +101,10 @@ The `make' command builds several things:
- The plug-in programs in the `plug-ins' subdirectory. - The plug-in programs in the `plug-ins' subdirectory.
- The main GIMP program in `app/gimp'. - The main GIMP program in `app/gimp'.
The `make install' commands installs the glib, gdk and gtk header The `make install' commands installs the gimp header files associated
files and libraries, the gimp header files associated with libgimp and with libgimp and the libgimp library, the plug-ins, some data files and
the libgimp library, the plug-ins, and the GIMP executable. After the GIMP executable. After running `make install' and assuming the build
running `make install' and assuming the build process was successful process was successful you should be able to run `gimp'.
you should be able to run `gimp'.
Using `make install-strip' will remove unneeded debugging cruft and Using `make install-strip' will remove unneeded debugging cruft and
unused functions from the binaries which will reduce the size of the unused functions from the binaries which will reduce the size of the

View File

@@ -171,11 +171,11 @@ current work:
commit access: yes commit access: yes
Name: Garry R. Osgood Name: Garry R. Osgood
Email: gosgood@idt.net Email: grosgood@rcn.com
url: http://idt.net/~gosgood/ url: http://users.rcn.com/grosgood/
ircnick: ircnick: garo
expertise: Bug fixing. expertise: Bug fixing.
current work: I fell into this rabbit hole by writing highly verbose patch documentation, current work: I fell into this rabbit hole by writing highly verbose patch documentation,
which just goes to show that succinctness is its own reward. My patch documentation which just goes to show that succinctness is its own reward.
archive is http://idt.net/~gosgood/gimp-patch/
commit access: yes commit access: yes
should be committed: Probably ;)

View File

@@ -19,9 +19,9 @@ SUBDIRS = \
devel-docs \ devel-docs \
build build
bin_SCRIPTS = gimptool @GIMPINSTALL@ bin_SCRIPTS = gimptool-1.2 @GIMPINSTALL@
EXTRA_SCRIPTS = gimpinstall EXTRA_SCRIPTS = gimptool-1.2 gimpinstall-1.2
EXTRA_DIST = \ EXTRA_DIST = \
cursors/mouse.xbm \ cursors/mouse.xbm \
@@ -173,6 +173,7 @@ EXTRA_DIST = \
README.win32 \ README.win32 \
README.perl \ README.perl \
ChangeLog.pre-1-0 \ ChangeLog.pre-1-0 \
ChangeLog.pre-1-2 \
PLUGIN_MAINTAINERS \ PLUGIN_MAINTAINERS \
MAINTAINERS \ MAINTAINERS \
TODO \ TODO \
@@ -183,11 +184,16 @@ EXTRA_DIST = \
gimp_splash.ppm \ gimp_splash.ppm \
rmshm \ rmshm \
user_install \ user_install \
user_install.bat \
ps-menurc \ ps-menurc \
gimp.m4 \ gimp.m4 \
gimprc.win32 \ gimp-zip.in \
config.h.win32 gimptool-win32.c.in \
config.h.win32 \
po/makefile.mingw \
po-libgimp/makefile.mingw \
po-plug-ins/makefile.mingw \
po-script-fu/makefile.mingw
gimpdata_DATA = \ gimpdata_DATA = \
gimp_logo.ppm \ gimp_logo.ppm \
@@ -203,23 +209,57 @@ gimpsysconf_DATA = \
gimpdata_SCRIPTS = user_install gimpdata_SCRIPTS = user_install
man_MANS = gimp.1 gimptool.1 gimp-remote.1 gimprc.5 man_MANS = gimp-1.2.1 gimptool-1.2.1 gimp-remote-1.2.1 gimprc-1.2.5
m4datadir = $(datadir)/aclocal m4datadir = $(datadir)/aclocal
m4data_DATA = gimp.m4 m4data_DATA = gimp.m4
scriptdata = scriptdata =
gimpinstall: gimpinstall-1.2:
$(LN_S) $(srcdir)/install-sh $(srcdir)/gimpinstall $(LN_S) $(srcdir)/install-sh $(srcdir)/gimpinstall-1.2
install-exec-local: install-exec-hook:
cd $(DESTDIR)$(bindir) \ cd $(DESTDIR)$(bindir) \
&& rm -f gimp-config \ && rm -f gimp-config \
&& $(LN_S) gimptool gimp-config && $(LN_S) gimptool-1.2 gimp-config
if DEFAULT_BINARY
cd $(DESTDIR)$(bindir) \
&& rm -f gimptool \
&& $(LN_S) gimptool-1.2 gimptool
endif
install-data-hook:
if DEFAULT_BINARY
@list='$(man_MANS)'; \
for i in $$list; do \
s=`echo $$i | sed -e 's/.*\\(.\\)$$/\1/'`; \
n=`echo $$i | sed -e 's/-[^-]*$$//'`; \
f="$$n.$$s"; \
echo "cd $(DESTDIR)$(mandir)/man$$s"; \
cd $(DESTDIR)$(mandir)/man$$s; \
echo "rm -f $$f"; \
rm -f $$f; \
echo "ln -s $$i $$f"; \
ln -s $$i $$f; \
done
endif
uninstall-local: uninstall-local:
@echo " rm -f $(DESTDIR)$(bindir)/gimp-config"; \
rm -f $(DESTDIR)$(bindir)/gimp-config rm -f $(DESTDIR)$(bindir)/gimp-config
if DEFAULT_BINARY
@echo " rm -f $(DESTDIR)$(bindir)/gimptool"; \
rm -f $(DESTDIR)$(bindir)/gimptool
@list='$(man_MANS)'; \
for i in $$list; do \
s=`echo $$i | sed -e 's/.*\\(.\\)$$/\1/'`; \
n=`echo $$i | sed -e 's/-[^-]*$$//'`; \
f="$$n.$$s"; \
echo " rm -f $(DESTDIR)$(mandir)/man$$s/$$f"; \
rm -f $(DESTDIR)$(mandir)/man$$s/$$f; \
done
endif
.PHONY: files populate checkin release .PHONY: files populate checkin release

42
README
View File

@@ -32,28 +32,25 @@ The latest version of The GIMP can be found at:
================ ================
We have several mailing lists dedicated to GIMP user and development We have several mailing lists dedicated to GIMP user and development
discussion. To subscribe, send an empty message to discussion. There is more info at
<listname>-subscribe@xcf.berkeley.edu https://lists.xcf.berkeley.edu/mailman/listinfo/<listname>
substituting <listname> for "gimp-user", "gimp-announce" or substituting <listname> for "gimp-announce", "gimp-user", "gimp-win-user",
"gimp-developer" (without the quotes, of course) depending on the list you or "gimp-developer" (without the quotes, of course) depending on the list
want to subscribe to. The mailing list archives can be found at: you want to subscribe to. Links to the mailing list archives can be found
at the same addresses as given above.
http://www.egroups.com/messages/gimp-developer/ Gimp-announce is a low-traffic list with announcements about new releases
http://www.egroups.com/messages/gimp-user/ of GIMP and plug-ins. Gimp-user is a mailing list dedicated to user problems,
hints and tips, discussion of cool effects, etc. Gimp-developer is
Gimp-user is a mailing list dedicated to user problems, hints and oriented to GIMP core and plug-in developers. Most people will only want
tips, discussion of cool effects, etc. Gimp-announce is a low-traffic list to be subscribed to gimp-user. If you want to help develop The GIMP, the
with announcements about new releases of GIMP and plug-ins. Gimp-developer is
oriented to GIMP core and plug-in developers. Most people will only want to
be subscribed to gimp-user. If you want to help develop The GIMP, the
gimp-developer mailing list is a good starting point. gimp-developer mailing list is a good starting point.
There are two mailing lists dedicated to the Win32 port, There are two mailing lists dedicated to the Win32 port, "gimpwin-users"
"gimpwin-users" and "gimpwin-dev". Especially the latter also carries and "gimpwin-dev". Especially the latter also carries traffic about the
traffic about the GTk+ port to Win32 in general. To subscribe, send an GTk+ port to Win32 in general. To subscribe, send an empty message to
empty message to
gimpwin-users-subscribe@egroups.com gimpwin-users-subscribe@egroups.com
or or
@@ -93,9 +90,11 @@ your choice by editing ~/.gimp-1.2/menurc.
5. Bugs 5. Bugs
======= =======
We sincerely hope you enjoy the program. Please report problems to We sincerely hope you enjoy the program. Please report problems using
bugs@gimp.org. Before reporting a problem, you may want to see if someone Bugzilla (http://bugzilla.gnome.org/) or send email to bugs@gimp.org.
else did already - check http://bugs.gnome.org/db/pa/lgimp.html for this. Before reporting a problem, you may want to see if someone else did
already - check http://bugzilla.gnome.org/buglist.cgi?product=GIMP
Have fun, Have fun,
@@ -103,4 +102,5 @@ Have fun,
Peter Mattis Peter Mattis
Federico Mena Federico Mena
Manish Singh Manish Singh
Sven Neumann
Michael Natterer

View File

@@ -19,7 +19,7 @@ Actually this one is maintained by me, that is Daniel Egger
GNU provides a very nice package called gettext. This one offers GNU provides a very nice package called gettext. This one offers
the possibility to translate chosen messages from the native language the possibility to translate chosen messages from the native language
of the program into that one of the users if a necessary catalog is of the program into that one of the users if a necessary catalog is
provided. Gettext therefor provides some easy tools to create and maintain provided. Gettext therefore provides some easy tools to create and maintain
such catalogs and a few functions which can be called by the program to such catalogs and a few functions which can be called by the program to
enable automatic translation at runtime. The program gets linked to the enable automatic translation at runtime. The program gets linked to the
gettext library or glibc2 which already provides that functionality gettext library or glibc2 which already provides that functionality
@@ -34,7 +34,7 @@ Actually this one is maintained by me, that is Daniel Egger
libgimp directory which check whether gettext is available on the system libgimp directory which check whether gettext is available on the system
which GIMP is compiled on and will deactivate language support if it's not. which GIMP is compiled on and will deactivate language support if it's not.
You CAN use such a compiled GIMP even without the catalogs or on a system You CAN use such a compiled GIMP even without the catalogs or on a system
which dosen't have language support. which doesen't have language support.
If the gettext system is there it will declare 3 functions which will be If the gettext system is there it will declare 3 functions which will be
described below. described below.
@@ -85,7 +85,7 @@ Actually this one is maintained by me, that is Daniel Egger
3.3 gettext() 3.3 gettext()
This function is the same as that mcaro in 3.1. But there is one big This function is the same as that macro in 3.1. But there is one big
difference: The _()'s and N_()'s are the only expressions which get parsed difference: The _()'s and N_()'s are the only expressions which get parsed
by the template generator. by the template generator.
If you have strings that should be translated but are unfortunately in a If you have strings that should be translated but are unfortunately in a
@@ -130,7 +130,7 @@ Actually this one is maintained by me, that is Daniel Egger
5. Tools and how to use them... 5. Tools and how to use them...
As mentioned the to get translated string are extracted directly from the As mentioned the to be translated strings are extracted directly from the
source and written to the template. source and written to the template.
I guess many of you will now ask if it is necessary to add new strings I guess many of you will now ask if it is necessary to add new strings
directly to the template or if there's a tool to achieve that. directly to the template or if there's a tool to achieve that.
@@ -139,7 +139,7 @@ Actually this one is maintained by me, that is Daniel Egger
add all strings that are in the template but not in the uncompiled catalog add all strings that are in the template but not in the uncompiled catalog
to it. Msgmerge does this job very nicely and also tries to use some kind to it. Msgmerge does this job very nicely and also tries to use some kind
of fuzzy logic method for already translated strings for possible reduction of fuzzy logic method for already translated strings for possible reduction
of translators work: If a original string seems similar to a new one of translators work: If an original string seems similar to a new one
and it already has a translation, it will be taken over to the new catalog and it already has a translation, it will be taken over to the new catalog
together with a remark that this one may not necessarily fit. together with a remark that this one may not necessarily fit.
@@ -186,7 +186,14 @@ Actually this one is maintained by me, that is Daniel Egger
msgid "gimp_tips.txt" msgid "gimp_tips.txt"
msgstr "gimp_tips.<lang>.txt" msgstr "gimp_tips.<lang>.txt"
9. And more? 9. How to contribute
Any help with translations is appreciated. If you want to help, please get
in contact with the people from the GNOME Translation Project who coordinate
all translation efforts in the GNOME CVS tree. They have a nice web-page at
http://developer.gnome.org/projects/gtp/.
10. And more?
I hope I mentioned everything that is worth it and hope that this document I hope I mentioned everything that is worth it and hope that this document
will clarify some things. If it doesn't please write me a mail and tell me will clarify some things. If it doesn't please write me a mail and tell me
@@ -199,5 +206,5 @@ Happy Gimping. Yours,
Sections (6) and (7) were added by Sven Neumann <sven@gimp.org>. He is the one Sections (6), (7) and (9) were added by Sven Neumann <sven@gimp.org>.
to blame for errors in there... He is the one to blame for errors in there...

View File

@@ -1,44 +1,26 @@
For more information about the port or GLib, GTk+ and the GIMP to For pre-built binary packages, see
native Windows, and pre-built binary packages, see http://www.gimp.org/win32/downloads.html .
http://www.gimp.org/win32/ or http://www.iki.fi/tml/gimp/win32/ .
To build the GIMP on Win32, you can use either gcc or Microsoft Visual Building GIMP on Win32
C++. The gcc to use should be for a mingw configuration (producing ======================
executables that don't use the cygwin dll). For more information about
the preparation necessary for building with gcc, what version you want
and where to get it, etc, read README.win32 in GLib 1.3 (or
later). (GLib 1.3 is the developer version and thus isn't distributed
per se, but available from CVS, and especially for Windows in zipfiles
from the web pages mentioned above.)
Unfortunately the makefiles for MSVC aren't quite up-to-date. You will There are two (or three) ways to build GIMP for Win32:
have to modify them a bit if you want to use MSVC. But quite possibly
by the time you read this somebody might have contributes new
makefiles, or even project files.
The GIMP wants to be built with the GNU "intl" library for 1) Use the autoconf-generated configure script, and the resulting
internationalisation (i18n). Get the version ported to Win32 from the Makefiles (which use libtool and gcc to do the compilation). I use
web site mentioned above. We build the "intl" library to a DLL called this myself, but it might be hell to setup correctly. Doesn't work
gnu-intl.dll to reduce name clash risks. If you don't want any i18n correctly in all directories, for instance in the po* directories it
stuff, undefine ENABLE_NLS in the config.h.win32 file, and remove is much easier to use the makefile.mingw files.
references to the gnu-intl library from the makefiles.
Note that while the GNU gettext package is under the GPL (GNU General You most probably will want to use a bleeding efge libtool, and thus
Public License), the "intl" library part as distributed with GNU libc want to rerun libtoolize --force.
is under the LGPL (GNU Lesser General Public License, a.k.a. GNU
Library General Public License). We want the LGPL-licensed version of
the intl library, even if they are the same source code, more or
less. It doesn't matter for the GIMP which itself is licensed under
the GPL, but it does matter for GTk+, which is licensed under the
LGPL.
First, build in the libgimp directory, then in app, plug-ins, and 2) Use the Microsoft compiler, cl and Make, nmake. Say nmake -f
finally in modules. Check the makefile.mingw files in said makefile.msc in various directories. These makefiles are
directories. out-of-date. They certainly will not generate the same name DLLs and
import libraries as the autoconfiscated libtool build does.
The current build setup for Windows is a mess, with complex 3) Use gcc, and the makefile.mingw makefiles. These are probably not
hand-maintained makefiles. I know. On the other hand, I don't think up-to-date, as I have switched to autoconfiscation.
using the Unix style configuration mechanism to generate mingw EXEs
and DLLs is quite feasible, either. I would love to be proved wrong.
--Tor Lillqvist <tml@iki.fi> --Tor Lillqvist <tml@iki.fi>

View File

@@ -16,11 +16,14 @@
#undef ENABLE_MP #undef ENABLE_MP
#undef ENABLE_NLS #undef ENABLE_NLS
#undef HAVE_BIND_TEXTDOMAIN_CODESET
#undef HAVE_CATGETS #undef HAVE_CATGETS
#undef HAVE_DIRENT_H #undef HAVE_DIRENT_H
#undef HAVE_DOPRNT #undef HAVE_DOPRNT
#undef HAVE_FINITE
#undef HAVE_GETTEXT #undef HAVE_GETTEXT
#undef HAVE_IPC_H #undef HAVE_IPC_H
#undef HAVE_ISFINITE
#undef HAVE_LC_MESSAGES #undef HAVE_LC_MESSAGES
#undef HAVE_MMAP #undef HAVE_MMAP
#undef HAVE_NDIR_H #undef HAVE_NDIR_H
@@ -36,6 +39,7 @@
#undef HAVE_SYS_TIME_H #undef HAVE_SYS_TIME_H
#undef HAVE_SYS_TIMES_H #undef HAVE_SYS_TIMES_H
#undef HAVE_UNISTD_H #undef HAVE_UNISTD_H
#undef HAVE_WINSOCK_H
#undef HAVE_VPRINTF #undef HAVE_VPRINTF
#undef HAVE_VSNPRINTF #undef HAVE_VSNPRINTF

View File

@@ -1,562 +1,284 @@
## libtool.m4 - Configure libtool for the target system. -*-Shell-script-*- ## Local versions of glib-gettext.m4 and pkg.m4 which are needed to
## Copyright (C) 1996-1999 Free Software Foundation, Inc. ## run aclocal+autoconf. We don't want to depend on glib-2.0 and
## Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 ## pkg-config and thus include the macros here.
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
##
## As a special exception to the GNU General Public License, if you
## distribute this file as part of a program that contains a
## configuration script generated by Autoconf, you may include it under
## the same distribution terms that you use for the rest of that program.
# serial 40 AC_PROG_LIBTOOL
AC_DEFUN(AC_PROG_LIBTOOL,
[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
# Save cache, so that ltconfig can load it dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not)
AC_CACHE_SAVE dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page
dnl also defines GSTUFF_PKG_ERRORS on error
AC_DEFUN(PKG_CHECK_MODULES, [
succeeded=no
# Actually configure libtool. ac_aux_dir is where install-sh is found. if test -z "$PKG_CONFIG"; then
CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \
LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \
DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \
${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \
|| AC_MSG_ERROR([libtool configure failed])
# Reload cache, that may have been modified by ltconfig
AC_CACHE_LOAD
# This can be used to rebuild libtool when needed
LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh"
# Always use our own libtool.
LIBTOOL='$(SHELL) $(top_builddir)/libtool'
AC_SUBST(LIBTOOL)dnl
# Redirect the config.log output again, so that the ltconfig log is not
# clobbered by the next message.
exec 5>>./config.log
])
AC_DEFUN(AC_LIBTOOL_SETUP,
[AC_PREREQ(2.13)dnl
AC_REQUIRE([AC_ENABLE_SHARED])dnl
AC_REQUIRE([AC_ENABLE_STATIC])dnl
AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
AC_REQUIRE([AC_CANONICAL_HOST])dnl
AC_REQUIRE([AC_CANONICAL_BUILD])dnl
AC_REQUIRE([AC_PROG_RANLIB])dnl
AC_REQUIRE([AC_PROG_CC])dnl
AC_REQUIRE([AC_PROG_LD])dnl
AC_REQUIRE([AC_PROG_NM])dnl
AC_REQUIRE([AC_PROG_LN_S])dnl
dnl
case "$target" in
NONE) lt_target="$host" ;;
*) lt_target="$target" ;;
esac
# Check for any special flags to pass to ltconfig.
libtool_flags="--cache-file=$cache_file"
test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install"
test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN],
[libtool_flags="$libtool_flags --enable-dlopen"])
ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
[libtool_flags="$libtool_flags --enable-win32-dll"])
AC_ARG_ENABLE(libtool-lock,
[ --disable-libtool-lock avoid locking (might break parallel builds)])
test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock"
test x"$silent" = xyes && libtool_flags="$libtool_flags --silent"
# Some flags need to be propagated to the compiler or linker for good
# libtool support.
case "$lt_target" in
*-*-irix6*)
# Find out which ABI we are using.
echo '[#]line __oline__ "configure"' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
case "`/usr/bin/file conftest.o`" in
*32-bit*)
LD="${LD-ld} -32"
;;
*N32*)
LD="${LD-ld} -n32"
;;
*64-bit*)
LD="${LD-ld} -64"
;;
esac
fi fi
rm -rf conftest*
;;
*-*-sco3.2v5*) if test "$PKG_CONFIG" = "no" ; then
# On SCO OpenServer 5, we need -belf to get full-featured binaries. echo "*** The pkg-config script could not be found. Make sure it is"
SAVE_CFLAGS="$CFLAGS" echo "*** in your path, or set the PKG_CONFIG environment variable"
CFLAGS="$CFLAGS -belf" echo "*** to the full path to pkg-config."
AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config."
[AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])]) else
if test x"$lt_cv_cc_needs_belf" != x"yes"; then if ! $PKG_CONFIG --atleast-pkgconfig-version 0.7.0; then
# this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf echo "*** Your version of pkg-config is too old. You need version 0.7.0 or newer."
CFLAGS="$SAVE_CFLAGS" echo "*** See http://www.freedesktop.org/software/pkgconfig"
else
AC_MSG_CHECKING(for $2)
if $PKG_CONFIG --exists "$2" ; then
AC_MSG_RESULT(yes)
succeeded=yes
AC_MSG_CHECKING($1_CFLAGS)
$1_CFLAGS=`$PKG_CONFIG --cflags "$2"`
AC_MSG_RESULT($$1_CFLAGS)
AC_MSG_CHECKING($1_LIBS)
$1_LIBS=`$PKG_CONFIG --libs "$2"`
AC_MSG_RESULT($$1_LIBS)
else
$1_CFLAGS=""
$1_LIBS=""
## If we have a custom action on failure, don't print errors, but
## do set a variable so people can do so.
$1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
ifelse([$4], ,echo $$1_PKG_ERRORS,)
fi
AC_SUBST($1_CFLAGS)
AC_SUBST($1_LIBS)
fi
fi fi
;;
ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], if test $succeeded = yes; then
[*-*-cygwin* | *-*-mingw*) ifelse([$3], , :, [$3])
AC_CHECK_TOOL(DLLTOOL, dlltool, false) else
AC_CHECK_TOOL(AS, as, false) ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4])
AC_CHECK_TOOL(OBJDUMP, objdump, false) fi
;;
])
esac
]) ])
# AC_LIBTOOL_DLOPEN - enable checks for dlopen support
AC_DEFUN(AC_LIBTOOL_DLOPEN, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])])
# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's # Macro to add for using GNU gettext.
AC_DEFUN(AC_LIBTOOL_WIN32_DLL, [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) # Ulrich Drepper <drepper@cygnus.com>, 1995.
#
# Modified to never use included libintl.
# Owen Taylor <otaylor@redhat.com>, 12/15/1998
#
#
# This file can be copied and used freely without restrictions. It can
# be used in projects which are not available under the GNU Public License
# but which still want to provide support for the GNU gettext functionality.
# Please note that the actual code is *not* freely available.
#
#
# If you make changes to this file, you MUST update the copy in
# acinclude.m4. [ aclocal dies on duplicate macros, so if
# we run 'aclocal -I macros/' then we'll run into problems
# once we've installed glib-gettext.m4 ]
#
# AC_ENABLE_SHARED - implement the --enable-shared flag # serial 5
# Usage: AC_ENABLE_SHARED[(DEFAULT)]
# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
# `yes'.
AC_DEFUN(AC_ENABLE_SHARED, [dnl
define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
AC_ARG_ENABLE(shared,
changequote(<<, >>)dnl
<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT],
changequote([, ])dnl
[p=${PACKAGE-default}
case "$enableval" in
yes) enable_shared=yes ;;
no) enable_shared=no ;;
*)
enable_shared=no
# Look at the argument we got. We use all the common list separators.
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
for pkg in $enableval; do
if test "X$pkg" = "X$p"; then
enable_shared=yes
fi
done
IFS="$ac_save_ifs"
;;
esac],
enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl
])
# AC_DISABLE_SHARED - set the default shared flag to --disable-shared AC_DEFUN(AM_GLIB_WITH_NLS,
AC_DEFUN(AC_DISABLE_SHARED, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl dnl NLS is obligatory
AC_ENABLE_SHARED(no)]) [USE_NLS=yes
AC_SUBST(USE_NLS)
# AC_ENABLE_STATIC - implement the --enable-static flag dnl Figure out what method
# Usage: AC_ENABLE_STATIC[(DEFAULT)] nls_cv_force_use_gnu_gettext="no"
# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
# `yes'.
AC_DEFUN(AC_ENABLE_STATIC, [dnl
define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
AC_ARG_ENABLE(static,
changequote(<<, >>)dnl
<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT],
changequote([, ])dnl
[p=${PACKAGE-default}
case "$enableval" in
yes) enable_static=yes ;;
no) enable_static=no ;;
*)
enable_static=no
# Look at the argument we got. We use all the common list separators.
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
for pkg in $enableval; do
if test "X$pkg" = "X$p"; then
enable_static=yes
fi
done
IFS="$ac_save_ifs"
;;
esac],
enable_static=AC_ENABLE_STATIC_DEFAULT)dnl
])
# AC_DISABLE_STATIC - set the default static flag to --disable-static nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
AC_DEFUN(AC_DISABLE_STATIC, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
AC_ENABLE_STATIC(no)]) dnl User does not insist on using GNU NLS library. Figure out what
dnl to use. If gettext or catgets are available (in this order) we
dnl use this. Else we have to fall back to GNU NLS library.
dnl catgets is only used if permitted by option --with-catgets.
nls_cv_header_intl=
nls_cv_header_libgt=
CATOBJEXT=NONE
AC_CHECK_HEADER(libintl.h,
[AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc,
[AC_TRY_LINK([#include <libintl.h>], [return (int) dgettext ("","")],
gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no)])
# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag if test "$gt_cv_func_dgettext_libc" != "yes"; then
# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] AC_CHECK_LIB(intl, bindtextdomain,
# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to [AC_CACHE_CHECK([for dgettext in libintl],
# `yes'. gt_cv_func_dgettext_libintl,
AC_DEFUN(AC_ENABLE_FAST_INSTALL, [dnl [AC_CHECK_LIB(intl, dgettext,
define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl gt_cv_func_dgettext_libintl=yes,
AC_ARG_ENABLE(fast-install, gt_cv_func_dgettext_libintl=no)],
changequote(<<, >>)dnl gt_cv_func_dgettext_libintl=no)])
<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], fi
changequote([, ])dnl
[p=${PACKAGE-default}
case "$enableval" in
yes) enable_fast_install=yes ;;
no) enable_fast_install=no ;;
*)
enable_fast_install=no
# Look at the argument we got. We use all the common list separators.
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
for pkg in $enableval; do
if test "X$pkg" = "X$p"; then
enable_fast_install=yes
fi
done
IFS="$ac_save_ifs"
;;
esac],
enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl
])
# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install if test "$gt_cv_func_dgettext_libintl" = "yes"; then
AC_DEFUN(AC_DISABLE_FAST_INSTALL, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl LIBS="$LIBS -lintl";
AC_ENABLE_FAST_INSTALL(no)]) fi
# AC_PROG_LD - find the path to the GNU or non-GNU linker if test "$gt_cv_func_dgettext_libc" = "yes" \
AC_DEFUN(AC_PROG_LD, || test "$gt_cv_func_dgettext_libintl" = "yes"; then
[AC_ARG_WITH(gnu-ld, AC_DEFINE(HAVE_GETTEXT)
[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
AC_REQUIRE([AC_PROG_CC])dnl if test "$MSGFMT" != "no"; then
AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_CHECK_FUNCS(dcgettext)
AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
ac_prog=ld AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
if test "$ac_cv_prog_gcc" = yes; then [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
# Check if gcc -print-prog-name=ld gives a path. AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
AC_MSG_CHECKING([for ld used by GCC]) return _nl_msg_cat_cntr],
ac_prog=`($CC -print-prog-name=ld) 2>&5` [CATOBJEXT=.gmo
case "$ac_prog" in DATADIRNAME=share],
# Accept absolute paths. [CATOBJEXT=.mo
changequote(,)dnl DATADIRNAME=lib])
[\\/]* | [A-Za-z]:[\\/]*) INSTOBJEXT=.mo
re_direlt='/[^/][^/]*/\.\./' fi
changequote([,])dnl fi
# Canonicalize the path of ld
ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` # Added by Martin Baulig 12/15/98 for libc5 systems
while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do if test "$gt_cv_func_dgettext_libc" != "yes" \
ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` && test "$gt_cv_func_dgettext_libintl" = "yes"; then
done INTLLIBS=-lintl
test -z "$LD" && LD="$ac_prog" LIBS=`echo $LIBS | sed -e 's/-lintl//'`
;; fi
"") ])
# If it fails, then pretend we aren't using GCC.
ac_prog=ld if test "$CATOBJEXT" = "NONE"; then
;; dnl Neither gettext nor catgets in included in the C library.
*) dnl Fall back on GNU gettext library.
# If it is relative, then search for the first ld in PATH. nls_cv_use_gnu_gettext=yes
with_gnu_ld=unknown
;;
esac
elif test "$with_gnu_ld" = yes; then
AC_MSG_CHECKING([for GNU ld])
else
AC_MSG_CHECKING([for non-GNU ld])
fi
AC_CACHE_VAL(ac_cv_path_LD,
[if test -z "$LD"; then
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
ac_cv_path_LD="$ac_dir/$ac_prog"
# Check to see if the program is GNU ld. I'd rather use --version,
# but apparently some GNU ld's only accept -v.
# Break only if it was the GNU/non-GNU ld that we prefer.
if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
test "$with_gnu_ld" != no && break
else
test "$with_gnu_ld" != yes && break
fi fi
fi fi
done
IFS="$ac_save_ifs"
else
ac_cv_path_LD="$LD" # Let the user override the test with a path.
fi])
LD="$ac_cv_path_LD"
if test -n "$LD"; then
AC_MSG_RESULT($LD)
else
AC_MSG_RESULT(no)
fi
test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
AC_PROG_LD_GNU
])
AC_DEFUN(AC_PROG_LD_GNU, if test "$nls_cv_use_gnu_gettext" != "yes"; then
[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, AC_DEFINE(ENABLE_NLS)
[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
ac_cv_prog_gnu_ld=yes
else
ac_cv_prog_gnu_ld=no
fi])
])
# AC_PROG_NM - find the path to a BSD-compatible name lister
AC_DEFUN(AC_PROG_NM,
[AC_MSG_CHECKING([for BSD-compatible nm])
AC_CACHE_VAL(ac_cv_path_NM,
[if test -n "$NM"; then
# Let the user override the test.
ac_cv_path_NM="$NM"
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then
# Check to see if the nm accepts a BSD-compat flag.
# Adding the `sed 1q' prevents false positives on HP-UX, which says:
# nm: unknown option "B" ignored
if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
ac_cv_path_NM="$ac_dir/nm -B"
break
elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
ac_cv_path_NM="$ac_dir/nm -p"
break
else
ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but
continue # so that we can try to find one that supports BSD flags
fi
fi
done
IFS="$ac_save_ifs"
test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
fi])
NM="$ac_cv_path_NM"
AC_MSG_RESULT([$NM])
])
# AC_CHECK_LIBM - check for math library
AC_DEFUN(AC_CHECK_LIBM,
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
LIBM=
case "$lt_target" in
*-*-beos* | *-*-cygwin*)
# These system don't have libm
;;
*-ncr-sysv4.3*)
AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
AC_CHECK_LIB(m, main, LIBM="$LIBM -lm")
;;
*)
AC_CHECK_LIB(m, main, LIBM="-lm")
;;
esac
])
# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for
# the libltdl convenience library, adds --enable-ltdl-convenience to
# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor
# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed
# to be `${top_builddir}/libltdl'. Make sure you start DIR with
# '${top_builddir}/' (note the single quotes!) if your package is not
# flat, and, if you're not using automake, define top_builddir as
# appropriate in the Makefiles.
AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
case "$enable_ltdl_convenience" in
no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
"") enable_ltdl_convenience=yes
ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
esac
LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la
INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl'])
])
# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for
# the libltdl installable library, and adds --enable-ltdl-install to
# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor
# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed
# to be `${top_builddir}/libltdl'. Make sure you start DIR with
# '${top_builddir}/' (note the single quotes!) if your package is not
# flat, and, if you're not using automake, define top_builddir as
# appropriate in the Makefiles.
# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
AC_CHECK_LIB(ltdl, main,
[test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
[if test x"$enable_ltdl_install" = xno; then
AC_MSG_WARN([libltdl not installed, but installation disabled])
else
enable_ltdl_install=yes
fi
])
if test x"$enable_ltdl_install" = x"yes"; then
ac_configure_args="$ac_configure_args --enable-ltdl-install"
LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la
INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl'])
else
ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
LIBLTDL="-lltdl"
INCLTDL=
fi
])
dnl old names
AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl
AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl
AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl
AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl
AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl
AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl
AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl
dnl This is just to silence aclocal about the macro not being used
ifelse([AC_DISABLE_FAST_INSTALL])dnl
## Find the install dirs for the python installation.
## By James Henstridge
# serial 1
AC_DEFUN(AM_PATH_PYTHON,
[AC_CHECK_PROGS(PYTHON, python python1.5 python1.4 python1.3,no)
if test "$PYTHON" != no; then
AC_MSG_CHECKING([where .py files should go])
changequote(, )dnl
pythondir=`$PYTHON -c '
import sys
if sys.version[0] > "1" or sys.version[2] > "4":
print "%s/lib/python%s/site-packages" % (sys.prefix, sys.version[:3])
else:
print "%s/lib/python%s" % (sys.prefix, sys.version[:3])'`
changequote([, ])dnl
AC_MSG_RESULT($pythondir)
AC_MSG_CHECKING([where python extensions should go])
changequote(, )dnl
pyexecdir=`$PYTHON -c '
import sys
if sys.version[0] > "1" or sys.version[2] > "4":
print "%s/lib/python%s/site-packages" % (sys.exec_prefix, sys.version[:3])
else:
print "%s/lib/python%s/sharedmodules" % (sys.exec_prefix, sys.version[:3])'`
changequote([, ])dnl
AC_MSG_RESULT($pyexecdir)
else
# these defaults are version independent ...
AC_MSG_CHECKING([where .py files should go])
pythondir='$(prefix)/lib/site-python'
AC_MSG_RESULT($pythondir)
AC_MSG_CHECKING([where python extensions should go])
pyexecdir='$(exec_prefix)/lib/site-python'
AC_MSG_RESULT($pyexecdir)
fi
AC_SUBST(pythondir)
AC_SUBST(pyexecdir)])
## this one is commonly used with AM_PATH_PYTHONDIR ...
dnl AM_CHECK_PYMOD(MODNAME [,SYMBOL [,ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]]])
dnl Check if a module containing a given symbol is visible to python.
AC_DEFUN(AM_CHECK_PYMOD,
[AC_REQUIRE([AM_PATH_PYTHON])
py_mod_var=`echo $1['_']$2 | sed 'y%./+-%__p_%'`
AC_MSG_CHECKING(for ifelse([$2],[],,[$2 in ])python module $1)
AC_CACHE_VAL(py_cv_mod_$py_mod_var, [
ifelse([$2],[], [prog="
import sys
try:
import $1
except ImportError:
sys.exit(1)
except:
sys.exit(0)
sys.exit(0)"], [prog="
import $1
$1.$2"])
if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC
then
eval "py_cv_mod_$py_mod_var=yes"
else
eval "py_cv_mod_$py_mod_var=no"
fi
])
py_val=`eval "echo \`echo '$py_cv_mod_'$py_mod_var\`"`
if test "x$py_val" != xno; then
AC_MSG_RESULT(yes)
ifelse([$3], [],, [$3
])dnl
else
AC_MSG_RESULT(no)
ifelse([$4], [],, [$4
])dnl
fi
])
# serial 1
dnl finds information needed for compilation of shared library style python
dnl extensions. AM_PATH_PYTHON should be called before hand.
AC_DEFUN(AM_INIT_PYEXEC_MOD,
[AC_REQUIRE([AM_PATH_PYTHON])
AC_MSG_CHECKING([for python headers])
AC_CACHE_VAL(am_cv_python_includes,
[changequote(,)dnl
am_cv_python_includes="`$PYTHON -c '
import sys
includepy = \"%s/include/python%s\" % (sys.prefix, sys.version[:3])
if sys.version[0] > \"1\" or sys.version[2] > \"4\":
libpl = \"%s/include/python%s\" % (sys.exec_prefix, sys.version[:3])
else:
libpl = \"%s/lib/python%s/config\" % (sys.exec_prefix, sys.version[:3])
print \"-I%s -I%s\" % (includepy, libpl)'`"
changequote([, ])])
PYTHON_INCLUDES="$am_cv_python_includes"
AC_MSG_RESULT(found)
AC_SUBST(PYTHON_INCLUDES)
AC_MSG_CHECKING([definitions from Python makefile])
AC_CACHE_VAL(am_cv_python_makefile,
[changequote(,)dnl
py_makefile="`$PYTHON -c '
import sys
print \"%s/lib/python%s/config/Makefile\"%(sys.exec_prefix, sys.version[:3])'`"
if test ! -f "$py_makefile"; then
AC_MSG_WARN([*** Couldn't find the python config makefile. Maybe you are
*** missing the development portion of the python installation])
am_cv_python_makefile=no
else else
eval `sed -n \ dnl Unset this variable since we use the non-zero value as a flag.
-e "s/^CCSHARED=[ ]*\(.*\)/am_cv_python_CCSHARED='\1'/p" \ CATOBJEXT=
-e "s/^LDSHARED=[ ]*\(.*\)/am_cv_python_LDSHARED='\1'/p" \
-e "s/^SO=[ ]*\(.*\)/am_cv_python_SO='\1'/p" \
$py_makefile`
am_cv_python_makefile=found
fi fi
changequote([, ])])
AC_MSG_RESULT(done)
SO="$am_cv_python_SO"
PYTHON_CFLAGS="$am_cv_python_CCSHARED"
PYTHON_LINK="$am_cv_python_LDSHARED -o \[$]@"
AC_SUBST(SO)dnl dnl Test whether we really found GNU xgettext.
AC_SUBST(PYTHON_CFLAGS)dnl if test "$XGETTEXT" != ":"; then
AC_SUBST(PYTHON_LINK)]) dnl If it is no GNU xgettext we define it as : so that the
dnl Makefiles still can work.
if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
: ;
else
AC_MSG_RESULT(
[found xgettext program is not GNU xgettext; ignore it])
XGETTEXT=":"
fi
fi
# We need to process the po/ directory.
POSUB=po
AC_OUTPUT_COMMANDS(
[case "$CONFIG_FILES" in *po/Makefile.in*)
sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
esac])
dnl These rules are solely for the distribution goal. While doing this
dnl we only have to keep exactly one list of the available catalogs
dnl in configure.in.
for lang in $ALL_LINGUAS; do
GMOFILES="$GMOFILES $lang.gmo"
POFILES="$POFILES $lang.po"
done
dnl Make all variables we use known to autoconf.
AC_SUBST(CATALOGS)
AC_SUBST(CATOBJEXT)
AC_SUBST(DATADIRNAME)
AC_SUBST(GMOFILES)
AC_SUBST(INSTOBJEXT)
AC_SUBST(INTLDEPS)
AC_SUBST(INTLLIBS)
AC_SUBST(INTLOBJS)
AC_SUBST(POFILES)
AC_SUBST(POSUB)
])
AC_DEFUN(AM_GLIB_GNU_GETTEXT,
[AC_REQUIRE([AC_PROG_MAKE_SET])dnl
AC_REQUIRE([AC_PROG_CC])dnl
AC_REQUIRE([AC_PROG_RANLIB])dnl
AC_REQUIRE([AC_HEADER_STDC])dnl
AC_REQUIRE([AC_C_CONST])dnl
AC_REQUIRE([AC_C_INLINE])dnl
AC_REQUIRE([AC_TYPE_OFF_T])dnl
AC_REQUIRE([AC_TYPE_SIZE_T])dnl
AC_REQUIRE([AC_FUNC_ALLOCA])dnl
AC_REQUIRE([AC_FUNC_MMAP])dnl
AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h string.h \
unistd.h sys/param.h])
AC_CHECK_FUNCS([getcwd munmap putenv setenv setlocale strchr strcasecmp \
strdup __argz_count __argz_stringify __argz_next])
AM_LC_MESSAGES
AM_GLIB_WITH_NLS
if test "x$CATOBJEXT" != "x"; then
if test "x$ALL_LINGUAS" = "x"; then
LINGUAS=
else
AC_MSG_CHECKING(for catalogs to be installed)
NEW_LINGUAS=
for lang in ${LINGUAS=$ALL_LINGUAS}; do
case "$ALL_LINGUAS" in
*$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;;
esac
done
LINGUAS=$NEW_LINGUAS
AC_MSG_RESULT($LINGUAS)
fi
dnl Construct list of names of catalog files to be constructed.
if test -n "$LINGUAS"; then
for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
fi
fi
dnl Determine which catalog format we have (if any is needed)
dnl For now we know about two different formats:
dnl Linux libc-5 and the normal X/Open format
test -d po || mkdir po
if test "$CATOBJEXT" = ".cat"; then
AC_CHECK_HEADER(linux/version.h, msgformat=linux, msgformat=xopen)
dnl Transform the SED scripts while copying because some dumb SEDs
dnl cannot handle comments.
sed -e '/^#/d' $srcdir/po/$msgformat-msg.sed > po/po2msg.sed
fi
dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
dnl find the mkinstalldirs script in another subdir but ($top_srcdir).
dnl Try to locate is.
MKINSTALLDIRS=
if test -n "$ac_aux_dir"; then
MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
fi
if test -z "$MKINSTALLDIRS"; then
MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
fi
AC_SUBST(MKINSTALLDIRS)
dnl Generate list of files to be processed by xgettext which will
dnl be included in po/Makefile.
test -d po || mkdir po
if test "x$srcdir" != "x."; then
if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
posrcprefix="$srcdir/"
else
posrcprefix="../$srcdir/"
fi
else
posrcprefix="../"
fi
rm -f po/POTFILES
sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
< $srcdir/po/POTFILES.in > po/POTFILES
])

View File

@@ -3,4 +3,5 @@ Makefile.in
makefile.mingw makefile.mingw
.deps .deps
.libs .libs
gimp gimp-1.2
gimp.rc

View File

@@ -1,8 +1,31 @@
## Process this file with automake to produce Makefile.in ## Process this file with automake to produce Makefile.in
if OS_WIN32
gimp_exp = gimp.exp
gimp.exp : gimp.def
dlltool --output-exp $@ --input-def gimp.def
gimp.def: gimp.sym
echo EXPORTS >$@
cat $< >>$@
mwindows = -mwindows
gimp_win32_resource = gimp-win32res.o
noinst_DATA = libgimpapp.a
gimp.exe : gimp-1.2
mv gimp-1.2 $@
libgimpapp.a: gimp.exe
dlltool --output-lib $@ --input-def gimp.def --dllname gimp.exe
endif
scriptdata = scriptdata =
bin_PROGRAMS = gimp bin_PROGRAMS = gimp-1.2
noinst_LIBRARIES = libgimpim.a noinst_LIBRARIES = libgimpim.a
libgimpim_a_SOURCES = \ libgimpim_a_SOURCES = \
@@ -22,7 +45,7 @@ libgimpim_a_SOURCES = \
gimpsignal.c \ gimpsignal.c \
gimpsignal.h gimpsignal.h
gimp_SOURCES = \ gimp_1_2_SOURCES = \
about_dialog.c \ about_dialog.c \
about_dialog.h \ about_dialog.h \
airbrush.c \ airbrush.c \
@@ -427,7 +450,7 @@ EXTRA_DIST = \
wilber.ico wilber.ico
gimp_LDFLAGS = -export-dynamic -export-symbols $(srcdir)/gimp.sym gimp_1_2_LDFLAGS = -export-dynamic -export-symbols $(srcdir)/gimp.sym $(mwindows)
AM_CPPFLAGS = \ AM_CPPFLAGS = \
-DLIBDIR=\""$(gimpplugindir)"\" \ -DLIBDIR=\""$(gimpplugindir)"\" \
@@ -443,14 +466,39 @@ INCLUDES = \
$(GTK_CFLAGS) \ $(GTK_CFLAGS) \
-I$(includedir) -I$(includedir)
gimp_LDADD = \ gimp_1_2_LDADD = \
libgimpim.a \ $(gimp_exp) \
$(gimp_win32_resource) \
libgimpim.a \
$(top_builddir)/libgimp/libgimpi.a \ $(top_builddir)/libgimp/libgimpi.a \
$(GTK_LIBS) \ $(GTK_LIBS) \
$(GIMP_THREAD_LIBS) \ $(GIMP_THREAD_LIBS) \
$(GIMP_MP_LIBS) \ $(GIMP_MP_LIBS) \
$(INTLLIBS) $(INTLLIBS)
gimp-win32res.o : gimp.rc
$(top_srcdir)/build/win32/compile-resource gimp.rc gimp-win32res.o
install-exec-hook:
if DEFAULT_BINARY
if OS_WIN32
cd $(DESTDIR)$(bindir) \
&& mv gimp-1.2 gimp.exe
else
cd $(DESTDIR)$(bindir) \
&& rm -f gimp \
&& $(LN_S) gimp-1.2 gimp
endif
endif
uninstall-local:
if DEFAULT_BINARY
if OS_WIN32
else
rm -f $(DESTDIR)$(bindir)/gimp
endif
endif
.PHONY: files .PHONY: files
files: files:
@@ -458,9 +506,6 @@ files:
echo $$p; \ echo $$p; \
done done
makefile.mingw: $(top_builddir)/config.status $(top_srcdir)/app/makefile.mingw.in
cd $(top_builddir) && CONFIG_FILES=app/$@ CONFIG_HEADERS= $(SHELL) ./config.status
# GCG stuff # GCG stuff
# #
# SUFFIXES = .gc .gh # SUFFIXES = .gc .gh

View File

@@ -359,7 +359,7 @@ about_dialog_load_logo (GtkWidget *window)
count = fread (pixelrow, sizeof (guchar), logo_width * 3, fp); count = fread (pixelrow, sizeof (guchar), logo_width * 3, fp);
if (count != (logo_width * 3)) if (count != (logo_width * 3))
{ {
gtk_widget_destroy (preview); gtk_object_sink (GTK_OBJECT (preview));
g_free (pixelrow); g_free (pixelrow);
fclose (fp); fclose (fp);
return FALSE; return FALSE;
@@ -377,7 +377,7 @@ about_dialog_load_logo (GtkWidget *window)
0, 0, 0, 0, logo_width, logo_height); 0, 0, 0, 0, logo_width, logo_height);
gdk_gc_destroy (gc); gdk_gc_destroy (gc);
gtk_widget_unref (preview); gtk_object_sink (GTK_OBJECT (preview));
g_free (pixelrow); g_free (pixelrow);
fclose (fp); fclose (fp);

File diff suppressed because it is too large Load Diff

View File

@@ -1,140 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __COMMANDS_H__
#define __COMMANDS_H__
void file_new_cmd_callback (GtkWidget *, gpointer, guint);
void file_open_cmd_callback (GtkWidget *, gpointer);
void file_save_cmd_callback (GtkWidget *, gpointer);
void file_save_as_cmd_callback (GtkWidget *, gpointer);
void file_revert_cmd_callback (GtkWidget *, gpointer);
void file_pref_cmd_callback (GtkWidget *, gpointer);
void file_close_cmd_callback (GtkWidget *, gpointer);
void file_quit_cmd_callback (GtkWidget *, gpointer);
void edit_undo_cmd_callback (GtkWidget *, gpointer);
void edit_redo_cmd_callback (GtkWidget *, gpointer);
void edit_cut_cmd_callback (GtkWidget *, gpointer);
void edit_copy_cmd_callback (GtkWidget *, gpointer);
void edit_paste_cmd_callback (GtkWidget *, gpointer);
void edit_paste_into_cmd_callback (GtkWidget *, gpointer);
void edit_paste_as_new_cmd_callback (GtkWidget *, gpointer);
void edit_named_cut_cmd_callback (GtkWidget *, gpointer);
void edit_named_copy_cmd_callback (GtkWidget *, gpointer);
void edit_named_paste_cmd_callback (GtkWidget *, gpointer);
void edit_clear_cmd_callback (GtkWidget *, gpointer);
void edit_fill_cmd_callback (GtkWidget *widget,
gpointer callback_data,
guint callback_action);
void edit_stroke_cmd_callback (GtkWidget *, gpointer);
void select_invert_cmd_callback (GtkWidget *, gpointer);
void select_all_cmd_callback (GtkWidget *, gpointer);
void select_none_cmd_callback (GtkWidget *, gpointer);
void select_float_cmd_callback (GtkWidget *, gpointer);
void select_feather_cmd_callback (GtkWidget *, gpointer);
void select_sharpen_cmd_callback (GtkWidget *, gpointer);
void select_shrink_cmd_callback (GtkWidget *, gpointer);
void select_border_cmd_callback (GtkWidget *, gpointer);
void select_grow_cmd_callback (GtkWidget *, gpointer);
void select_save_cmd_callback (GtkWidget *, gpointer);
void view_zoomin_cmd_callback (GtkWidget *, gpointer);
void view_zoomout_cmd_callback (GtkWidget *, gpointer);
void view_zoom_16_1_cmd_callback (GtkWidget *, gpointer);
void view_zoom_8_1_cmd_callback (GtkWidget *, gpointer);
void view_zoom_4_1_cmd_callback (GtkWidget *, gpointer);
void view_zoom_2_1_cmd_callback (GtkWidget *, gpointer);
void view_zoom_1_1_cmd_callback (GtkWidget *, gpointer);
void view_zoom_1_2_cmd_callback (GtkWidget *, gpointer);
void view_zoom_1_4_cmd_callback (GtkWidget *, gpointer);
void view_zoom_1_8_cmd_callback (GtkWidget *, gpointer);
void view_zoom_1_16_cmd_callback (GtkWidget *, gpointer);
void view_dot_for_dot_cmd_callback (GtkWidget *, gpointer);
void view_info_window_cmd_callback (GtkWidget *, gpointer);
void view_nav_window_cmd_callback (GtkWidget *, gpointer);
void view_toggle_selection_cmd_callback (GtkWidget *, gpointer);
void view_toggle_rulers_cmd_callback (GtkWidget *, gpointer);
void view_toggle_statusbar_cmd_callback (GtkWidget *, gpointer);
void view_toggle_guides_cmd_callback (GtkWidget *, gpointer);
void view_snap_to_guides_cmd_callback (GtkWidget *, gpointer);
void view_new_view_cmd_callback (GtkWidget *, gpointer);
void view_shrink_wrap_cmd_callback (GtkWidget *, gpointer);
void image_convert_rgb_cmd_callback (GtkWidget *, gpointer);
void image_convert_grayscale_cmd_callback (GtkWidget *, gpointer);
void image_convert_indexed_cmd_callback (GtkWidget *, gpointer);
void image_desaturate_cmd_callback (GtkWidget *, gpointer);
void image_invert_cmd_callback (GtkWidget *, gpointer);
void image_equalize_cmd_callback (GtkWidget *, gpointer);
void image_offset_cmd_callback (GtkWidget *, gpointer);
void image_resize_cmd_callback (GtkWidget *, gpointer);
void image_scale_cmd_callback (GtkWidget *, gpointer);
void image_duplicate_cmd_callback (GtkWidget *, gpointer);
void layers_previous_cmd_callback (GtkWidget *, gpointer);
void layers_next_cmd_callback (GtkWidget *, gpointer);
void layers_raise_cmd_callback (GtkWidget *, gpointer);
void layers_lower_cmd_callback (GtkWidget *, gpointer);
void layers_raise_to_top_cmd_callback (GtkWidget *, gpointer);
void layers_lower_to_bottom_cmd_callback (GtkWidget *, gpointer);
void layers_anchor_cmd_callback (GtkWidget *, gpointer);
void layers_merge_cmd_callback (GtkWidget *, gpointer);
void layers_flatten_cmd_callback (GtkWidget *, gpointer);
void layers_mask_select_cmd_callback (GtkWidget *, gpointer);
void layers_add_alpha_channel_cmd_callback (GtkWidget *, gpointer);
void layers_alpha_select_cmd_callback (GtkWidget *, gpointer);
void layers_resize_to_image_cmd_callback (GtkWidget *, gpointer);
void tools_default_colors_cmd_callback (GtkWidget *, gpointer);
void tools_swap_colors_cmd_callback (GtkWidget *, gpointer);
void tools_select_cmd_callback (GtkWidget *widget,
gpointer callback_data,
guint callback_action);
void filters_repeat_cmd_callback (GtkWidget *widget,
gpointer callback_data,
guint callback_action);
void dialogs_lc_cmd_callback (GtkWidget *, gpointer);
void dialogs_tool_options_cmd_callback (GtkWidget *, gpointer);
void dialogs_brushes_cmd_callback (GtkWidget *, gpointer);
void dialogs_patterns_cmd_callback (GtkWidget *, gpointer);
void dialogs_gradients_cmd_callback (GtkWidget *, gpointer);
void dialogs_palette_cmd_callback (GtkWidget *, gpointer);
void dialogs_indexed_palette_cmd_callback (GtkWidget *, gpointer);
void dialogs_input_devices_cmd_callback (GtkWidget *, gpointer);
void dialogs_device_status_cmd_callback (GtkWidget *, gpointer);
void dialogs_document_index_cmd_callback (GtkWidget *, gpointer);
void dialogs_error_console_cmd_callback (GtkWidget *, gpointer);
void dialogs_undo_history_cmd_callback (GtkWidget *, gpointer);
void dialogs_module_browser_cmd_callback (GtkWidget *, gpointer);
void help_help_cmd_callback (GtkWidget *, gpointer);
void help_context_help_cmd_callback (GtkWidget *, gpointer);
void help_tips_cmd_callback (GtkWidget *, gpointer);
void help_about_cmd_callback (GtkWidget *, gpointer);
#ifdef DISPLAY_FILTERS
void dialogs_display_filters_cmd_callback (GtkWidget *, gpointer);
#endif /* DISPLAY_FILTERS */
#endif /* __COMMANDS_H__ */

File diff suppressed because it is too large Load Diff

View File

@@ -1,395 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <gtk/gtk.h>
#include "apptypes.h"
#include "appenv.h"
#include "channel.h"
#include "color_panel.h"
#include "floating_sel.h"
#include "gdisplayF.h"
#include "gimpcontext.h"
#include "gimage_mask.h"
#include "gimpimage.h"
#include "gimpui.h"
#include "global_edit.h"
#include "qmask.h"
#include "undo.h"
#include "libgimp/gimpintl.h"
struct _EditQmaskOptions
{
GtkWidget *query_box;
GtkWidget *name_entry;
GimpImage *gimage;
ColorPanel *color_panel;
gdouble opacity;
};
typedef struct _EditQmaskOptions EditQmaskOptions;
/* Global variables */
/* Static variables */
/* Prototypes */
static void edit_qmask_channel_query (GDisplay *gdisp);
static void edit_qmask_query_ok_callback (GtkWidget *widget,
gpointer client_data);
static void edit_qmask_query_cancel_callback (GtkWidget *widget,
gpointer client_data);
static void qmask_query_scale_update (GtkAdjustment *adjustment,
gdouble *scale_val);
static void qmask_removed_callback (GtkObject *qmask,
gpointer data);
/* Actual code */
static void
qmask_query_scale_update (GtkAdjustment *adjustment,
gdouble *scale_val)
{
*scale_val = adjustment->value;
}
static void
qmask_removed_callback (GtkObject *qmask,
gpointer data)
{
GDisplay *gdisp = (GDisplay*) data;
if (!gdisp->gimage)
return;
gdisp->gimage->qmask_state = FALSE;
qmask_buttons_update (gdisp);
}
void
qmask_buttons_update (GDisplay *gdisp)
{
g_assert (gdisp);
g_assert (gdisp->gimage);
if (gdisp->gimage->qmask_state != GTK_TOGGLE_BUTTON (gdisp->qmaskon)->active)
{
/* Disable toggle from doing anything */
gtk_signal_handler_block_by_func(GTK_OBJECT(gdisp->qmaskoff),
(GtkSignalFunc) qmask_deactivate,
gdisp);
gtk_signal_handler_block_by_func(GTK_OBJECT(gdisp->qmaskon),
(GtkSignalFunc) qmask_activate,
gdisp);
/* Change the state of the buttons */
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gdisp->qmaskon),
gdisp->gimage->qmask_state);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gdisp->qmaskoff),
!gdisp->gimage->qmask_state);
/* Enable toggle again */
gtk_signal_handler_unblock_by_func(GTK_OBJECT(gdisp->qmaskoff),
(GtkSignalFunc) qmask_deactivate,
gdisp);
gtk_signal_handler_unblock_by_func(GTK_OBJECT(gdisp->qmaskon),
(GtkSignalFunc) qmask_activate,
gdisp);
}
}
void
qmask_click_handler (GtkWidget *widget,
GdkEventButton *event,
gpointer data)
{
GDisplay *gdisp;
gdisp = (GDisplay *)data;
if ((event->type == GDK_2BUTTON_PRESS) &&
(event->button == 1))
{
edit_qmask_channel_query(gdisp);
}
}
void
qmask_deactivate (GtkWidget *widget,
GDisplay *gdisp)
{
GimpImage *gimg;
GimpChannel *gmask;
if (gdisp)
{
gimg = gdisp->gimage;
if (!gimg)
return;
if (!gdisp->gimage->qmask_state)
return; /* if already set do nothing */
if ( (gmask = gimp_image_get_channel_by_name (gimg, "Qmask")) )
{
undo_push_group_start (gimg, QMASK_UNDO);
/* push the undo here since removing the mask will
call the qmask_removed_callback() which will set
the qmask_state to FALSE */
undo_push_qmask (gimg);
gimage_mask_load (gimg, gmask);
gimage_remove_channel (gimg, gmask);
undo_push_group_end (gimg);
}
gdisp->gimage->qmask_state = FALSE;
if (gmask)
gdisplays_flush ();
}
}
void
qmask_activate (GtkWidget *widget,
GDisplay *gdisp)
{
GimpImage *gimg;
GimpChannel *gmask;
GimpLayer *layer;
gdouble opacity;
guchar *color;
if (gdisp)
{
gimg = gdisp->gimage;
if (!gimg)
return;
if (gdisp->gimage->qmask_state)
return; /* If already set, do nothing */
/* Set the defaults */
opacity = (gdouble) gimg->qmask_opacity;
color = gimg->qmask_color;
if ( (gmask = gimp_image_get_channel_by_name (gimg, "Qmask")) )
{
gimg->qmask_state = TRUE;
/* if the user was clever and created his own */
return;
}
undo_push_group_start (gimg, QMASK_UNDO);
if (gimage_mask_is_empty(gimg))
{
if ((layer = gimage_floating_sel (gimg)))
{
floating_sel_to_layer (layer);
}
/* if no selection */
gmask = channel_new (gimg,
gimg->width,
gimg->height,
"Qmask",
(gint)(255*opacity)/100,
color);
gimp_image_add_channel (gimg, gmask, 0);
gimp_drawable_fill (GIMP_DRAWABLE (gmask), 0, 0, 0, 0);
}
else
{ /* if selection */
gmask = channel_copy (gimage_get_mask (gimg));
gimp_image_add_channel (gimg, gmask, 0);
channel_set_color (gmask, color);
channel_set_name (gmask, "Qmask");
channel_set_opacity (gmask, opacity);
gimage_mask_none (gimg); /* Clear the selection */
}
undo_push_qmask (gimg);
undo_push_group_end (gimg);
gdisp->gimage->qmask_state = TRUE;
gdisplays_flush ();
/* connect to the removed signal, so the buttons get updated */
gtk_signal_connect (GTK_OBJECT (gmask), "removed",
GTK_SIGNAL_FUNC (qmask_removed_callback), gdisp);
}
}
static void
edit_qmask_channel_query (GDisplay * gdisp)
{
EditQmaskOptions *options;
GtkWidget *hbox;
GtkWidget *vbox;
GtkWidget *table;
GtkWidget *label;
GtkWidget *opacity_scale;
GtkObject *opacity_scale_data;
gint i;
guchar channel_color[3] = { 0, 0, 0 };
/* channel = gimp_image_get_channel_by_name (gdisp->gimage, "Qmask"); */
/* the new options structure */
options = g_new (EditQmaskOptions, 1);
options->gimage = gdisp->gimage;
options->opacity = (gdouble) options->gimage->qmask_opacity;
for (i = 0; i < 3; i++)
channel_color[i] = options->gimage->qmask_color[i];
options->color_panel = color_panel_new (channel_color, 48, 64);
/* The dialog */
options->query_box =
gimp_dialog_new (_("Edit Qmask Attributes"), "edit_qmask_attributes",
gimp_standard_help_func,
"dialogs/edit_qmask_attributes.html",
GTK_WIN_POS_MOUSE,
FALSE, TRUE, FALSE,
_("OK"), edit_qmask_query_ok_callback,
options, NULL, NULL, TRUE, FALSE,
_("Cancel"), edit_qmask_query_cancel_callback,
options, NULL, NULL, FALSE, TRUE,
NULL);
/* The main hbox */
hbox = gtk_hbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (options->query_box)->vbox),
hbox);
/* The vbox */
vbox = gtk_vbox_new (FALSE, 2);
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
/* The table */
table = gtk_table_new (2, 3, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
/* The opacity scale */
label = gtk_label_new (_("Mask Opacity:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_widget_show (label);
opacity_scale_data =
gtk_adjustment_new (options->opacity, 0.0, 100.0, 1.0, 1.0, 0.0);
opacity_scale = gtk_hscale_new (GTK_ADJUSTMENT (opacity_scale_data));
gtk_table_attach_defaults (GTK_TABLE (table), opacity_scale, 1, 2, 1, 2);
gtk_scale_set_value_pos (GTK_SCALE (opacity_scale), GTK_POS_TOP);
gtk_signal_connect (GTK_OBJECT (opacity_scale_data), "value_changed",
(GtkSignalFunc) qmask_query_scale_update,
&options->opacity);
gtk_widget_show (opacity_scale);
/* The color panel */
gtk_box_pack_start (GTK_BOX (hbox), options->color_panel->color_panel_widget,
TRUE, TRUE, 0);
gtk_widget_show (options->color_panel->color_panel_widget);
gtk_widget_show (table);
gtk_widget_show (vbox);
gtk_widget_show (hbox);
gtk_widget_show (options->query_box);
}
static void
edit_qmask_query_ok_callback (GtkWidget *widget,
gpointer client_data)
{
EditQmaskOptions *options;
Channel *channel;
guchar *tmpcolp;
guchar tmpcol[3];
gboolean update = FALSE;
gint opacity;
gint i;
options = (EditQmaskOptions *) client_data;
channel = gimp_image_get_channel_by_name (options->gimage, "Qmask");
opacity = (gint) (255 * options->opacity/100);
if (options->gimage && channel)
{ /* don't update if opacity hasn't changed */
if (channel_get_opacity(channel) != opacity)
{
update = TRUE;
}
tmpcolp = channel_get_color(channel);
for (i = 0; i < 3; i++)
{ /* don't update if color hasn't changed */
tmpcol[i] = tmpcolp[i]; /* initialize to same values */
if (options->color_panel->color[i] != tmpcolp[i])
{
tmpcol[i] = options->color_panel->color[i];
update = TRUE;
}
}
if (update)
{
channel_set_opacity(channel, 100*opacity/255);
channel_set_color(channel,tmpcol);
channel_update (channel);
}
}
/* update the qmask color no matter what */
for (i = 0; i < 3; i++)
{ /* TODO: should really have accessor functions for gimage private stuff */
options->gimage->qmask_color[i] = options->color_panel->color[i];
options->gimage->qmask_opacity = (gint) 100*opacity/255;
}
gtk_widget_destroy (options->query_box);
g_free (options);
}
static void
edit_qmask_query_cancel_callback (GtkWidget *widget,
gpointer client_data)
{
EditQmaskOptions *options;
options = (EditQmaskOptions *) client_data;
gtk_widget_destroy (options->query_box);
g_free (options);
}

View File

@@ -1,395 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <gtk/gtk.h>
#include "apptypes.h"
#include "appenv.h"
#include "channel.h"
#include "color_panel.h"
#include "floating_sel.h"
#include "gdisplayF.h"
#include "gimpcontext.h"
#include "gimage_mask.h"
#include "gimpimage.h"
#include "gimpui.h"
#include "global_edit.h"
#include "qmask.h"
#include "undo.h"
#include "libgimp/gimpintl.h"
struct _EditQmaskOptions
{
GtkWidget *query_box;
GtkWidget *name_entry;
GimpImage *gimage;
ColorPanel *color_panel;
gdouble opacity;
};
typedef struct _EditQmaskOptions EditQmaskOptions;
/* Global variables */
/* Static variables */
/* Prototypes */
static void edit_qmask_channel_query (GDisplay *gdisp);
static void edit_qmask_query_ok_callback (GtkWidget *widget,
gpointer client_data);
static void edit_qmask_query_cancel_callback (GtkWidget *widget,
gpointer client_data);
static void qmask_query_scale_update (GtkAdjustment *adjustment,
gdouble *scale_val);
static void qmask_removed_callback (GtkObject *qmask,
gpointer data);
/* Actual code */
static void
qmask_query_scale_update (GtkAdjustment *adjustment,
gdouble *scale_val)
{
*scale_val = adjustment->value;
}
static void
qmask_removed_callback (GtkObject *qmask,
gpointer data)
{
GDisplay *gdisp = (GDisplay*) data;
if (!gdisp->gimage)
return;
gdisp->gimage->qmask_state = FALSE;
qmask_buttons_update (gdisp);
}
void
qmask_buttons_update (GDisplay *gdisp)
{
g_assert (gdisp);
g_assert (gdisp->gimage);
if (gdisp->gimage->qmask_state != GTK_TOGGLE_BUTTON (gdisp->qmaskon)->active)
{
/* Disable toggle from doing anything */
gtk_signal_handler_block_by_func(GTK_OBJECT(gdisp->qmaskoff),
(GtkSignalFunc) qmask_deactivate,
gdisp);
gtk_signal_handler_block_by_func(GTK_OBJECT(gdisp->qmaskon),
(GtkSignalFunc) qmask_activate,
gdisp);
/* Change the state of the buttons */
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gdisp->qmaskon),
gdisp->gimage->qmask_state);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gdisp->qmaskoff),
!gdisp->gimage->qmask_state);
/* Enable toggle again */
gtk_signal_handler_unblock_by_func(GTK_OBJECT(gdisp->qmaskoff),
(GtkSignalFunc) qmask_deactivate,
gdisp);
gtk_signal_handler_unblock_by_func(GTK_OBJECT(gdisp->qmaskon),
(GtkSignalFunc) qmask_activate,
gdisp);
}
}
void
qmask_click_handler (GtkWidget *widget,
GdkEventButton *event,
gpointer data)
{
GDisplay *gdisp;
gdisp = (GDisplay *)data;
if ((event->type == GDK_2BUTTON_PRESS) &&
(event->button == 1))
{
edit_qmask_channel_query(gdisp);
}
}
void
qmask_deactivate (GtkWidget *widget,
GDisplay *gdisp)
{
GimpImage *gimg;
GimpChannel *gmask;
if (gdisp)
{
gimg = gdisp->gimage;
if (!gimg)
return;
if (!gdisp->gimage->qmask_state)
return; /* if already set do nothing */
if ( (gmask = gimp_image_get_channel_by_name (gimg, "Qmask")) )
{
undo_push_group_start (gimg, QMASK_UNDO);
/* push the undo here since removing the mask will
call the qmask_removed_callback() which will set
the qmask_state to FALSE */
undo_push_qmask (gimg);
gimage_mask_load (gimg, gmask);
gimage_remove_channel (gimg, gmask);
undo_push_group_end (gimg);
}
gdisp->gimage->qmask_state = FALSE;
if (gmask)
gdisplays_flush ();
}
}
void
qmask_activate (GtkWidget *widget,
GDisplay *gdisp)
{
GimpImage *gimg;
GimpChannel *gmask;
GimpLayer *layer;
gdouble opacity;
guchar *color;
if (gdisp)
{
gimg = gdisp->gimage;
if (!gimg)
return;
if (gdisp->gimage->qmask_state)
return; /* If already set, do nothing */
/* Set the defaults */
opacity = (gdouble) gimg->qmask_opacity;
color = gimg->qmask_color;
if ( (gmask = gimp_image_get_channel_by_name (gimg, "Qmask")) )
{
gimg->qmask_state = TRUE;
/* if the user was clever and created his own */
return;
}
undo_push_group_start (gimg, QMASK_UNDO);
if (gimage_mask_is_empty(gimg))
{
if ((layer = gimage_floating_sel (gimg)))
{
floating_sel_to_layer (layer);
}
/* if no selection */
gmask = channel_new (gimg,
gimg->width,
gimg->height,
"Qmask",
(gint)(255*opacity)/100,
color);
gimp_image_add_channel (gimg, gmask, 0);
gimp_drawable_fill (GIMP_DRAWABLE (gmask), 0, 0, 0, 0);
}
else
{ /* if selection */
gmask = channel_copy (gimage_get_mask (gimg));
gimp_image_add_channel (gimg, gmask, 0);
channel_set_color (gmask, color);
channel_set_name (gmask, "Qmask");
channel_set_opacity (gmask, opacity);
gimage_mask_none (gimg); /* Clear the selection */
}
undo_push_qmask (gimg);
undo_push_group_end (gimg);
gdisp->gimage->qmask_state = TRUE;
gdisplays_flush ();
/* connect to the removed signal, so the buttons get updated */
gtk_signal_connect (GTK_OBJECT (gmask), "removed",
GTK_SIGNAL_FUNC (qmask_removed_callback), gdisp);
}
}
static void
edit_qmask_channel_query (GDisplay * gdisp)
{
EditQmaskOptions *options;
GtkWidget *hbox;
GtkWidget *vbox;
GtkWidget *table;
GtkWidget *label;
GtkWidget *opacity_scale;
GtkObject *opacity_scale_data;
gint i;
guchar channel_color[3] = { 0, 0, 0 };
/* channel = gimp_image_get_channel_by_name (gdisp->gimage, "Qmask"); */
/* the new options structure */
options = g_new (EditQmaskOptions, 1);
options->gimage = gdisp->gimage;
options->opacity = (gdouble) options->gimage->qmask_opacity;
for (i = 0; i < 3; i++)
channel_color[i] = options->gimage->qmask_color[i];
options->color_panel = color_panel_new (channel_color, 48, 64);
/* The dialog */
options->query_box =
gimp_dialog_new (_("Edit Qmask Attributes"), "edit_qmask_attributes",
gimp_standard_help_func,
"dialogs/edit_qmask_attributes.html",
GTK_WIN_POS_MOUSE,
FALSE, TRUE, FALSE,
_("OK"), edit_qmask_query_ok_callback,
options, NULL, NULL, TRUE, FALSE,
_("Cancel"), edit_qmask_query_cancel_callback,
options, NULL, NULL, FALSE, TRUE,
NULL);
/* The main hbox */
hbox = gtk_hbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (options->query_box)->vbox),
hbox);
/* The vbox */
vbox = gtk_vbox_new (FALSE, 2);
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
/* The table */
table = gtk_table_new (2, 3, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
/* The opacity scale */
label = gtk_label_new (_("Mask Opacity:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_widget_show (label);
opacity_scale_data =
gtk_adjustment_new (options->opacity, 0.0, 100.0, 1.0, 1.0, 0.0);
opacity_scale = gtk_hscale_new (GTK_ADJUSTMENT (opacity_scale_data));
gtk_table_attach_defaults (GTK_TABLE (table), opacity_scale, 1, 2, 1, 2);
gtk_scale_set_value_pos (GTK_SCALE (opacity_scale), GTK_POS_TOP);
gtk_signal_connect (GTK_OBJECT (opacity_scale_data), "value_changed",
(GtkSignalFunc) qmask_query_scale_update,
&options->opacity);
gtk_widget_show (opacity_scale);
/* The color panel */
gtk_box_pack_start (GTK_BOX (hbox), options->color_panel->color_panel_widget,
TRUE, TRUE, 0);
gtk_widget_show (options->color_panel->color_panel_widget);
gtk_widget_show (table);
gtk_widget_show (vbox);
gtk_widget_show (hbox);
gtk_widget_show (options->query_box);
}
static void
edit_qmask_query_ok_callback (GtkWidget *widget,
gpointer client_data)
{
EditQmaskOptions *options;
Channel *channel;
guchar *tmpcolp;
guchar tmpcol[3];
gboolean update = FALSE;
gint opacity;
gint i;
options = (EditQmaskOptions *) client_data;
channel = gimp_image_get_channel_by_name (options->gimage, "Qmask");
opacity = (gint) (255 * options->opacity/100);
if (options->gimage && channel)
{ /* don't update if opacity hasn't changed */
if (channel_get_opacity(channel) != opacity)
{
update = TRUE;
}
tmpcolp = channel_get_color(channel);
for (i = 0; i < 3; i++)
{ /* don't update if color hasn't changed */
tmpcol[i] = tmpcolp[i]; /* initialize to same values */
if (options->color_panel->color[i] != tmpcolp[i])
{
tmpcol[i] = options->color_panel->color[i];
update = TRUE;
}
}
if (update)
{
channel_set_opacity(channel, 100*opacity/255);
channel_set_color(channel,tmpcol);
channel_update (channel);
}
}
/* update the qmask color no matter what */
for (i = 0; i < 3; i++)
{ /* TODO: should really have accessor functions for gimage private stuff */
options->gimage->qmask_color[i] = options->color_panel->color[i];
options->gimage->qmask_opacity = (gint) 100*opacity/255;
}
gtk_widget_destroy (options->query_box);
g_free (options);
}
static void
edit_qmask_query_cancel_callback (GtkWidget *widget,
gpointer client_data)
{
EditQmaskOptions *options;
options = (EditQmaskOptions *) client_data;
gtk_widget_destroy (options->query_box);
g_free (options);
}

View File

@@ -78,7 +78,7 @@ struct _AirbrushOptions
static AirbrushOptions *airbrush_options = NULL; static AirbrushOptions *airbrush_options = NULL;
/* local variables */ /* local variables */
static gint timer; /* timer for successive paint applications */ static guint timer; /* timer for successive paint applications */
static gint timer_state = OFF; /* state of airbrush tool */ static gint timer_state = OFF; /* state of airbrush tool */
static AirbrushTimeout airbrush_timeout; static AirbrushTimeout airbrush_timeout;
@@ -201,12 +201,8 @@ airbrush_paint_func (PaintCore *paint_core,
switch (state) switch (state)
{ {
case INIT_PAINT : case INIT_PAINT :
/* timer_state = OFF; */
if (timer_state == ON) if (timer_state == ON)
{ gtk_timeout_remove (timer);
g_warning ("killing stray timer, please report to lewing@gimp.org");
gtk_timeout_remove (timer);
}
timer_state = OFF; timer_state = OFF;
break; break;

View File

@@ -132,7 +132,7 @@ static gint logo_height = 0;
static gint logo_area_width = 0; static gint logo_area_width = 0;
static gint logo_area_height = 0; static gint logo_area_height = 0;
static gint show_logo = SHOW_NEVER; static gint show_logo = SHOW_NEVER;
static gint max_label_length = MAXPATHLEN; static gint max_label_length = 64;
void void
@@ -238,7 +238,7 @@ splash_logo_load (GtkWidget *window)
count = fread (pixelrow, sizeof (unsigned char), logo_width * 3, fp); count = fread (pixelrow, sizeof (unsigned char), logo_width * 3, fp);
if (count != (logo_width * 3)) if (count != (logo_width * 3))
{ {
gtk_widget_destroy (preview); gtk_object_sink (GTK_OBJECT (preview));
g_free (pixelrow); g_free (pixelrow);
fclose (fp); fclose (fp);
return FALSE; return FALSE;
@@ -255,7 +255,7 @@ splash_logo_load (GtkWidget *window)
0, 0, 0, 0, logo_width, logo_height); 0, 0, 0, 0, logo_width, logo_height);
gdk_gc_destroy (gc); gdk_gc_destroy (gc);
gtk_widget_unref (preview); gtk_object_sink (GTK_OBJECT (preview));
g_free (pixelrow); g_free (pixelrow);
fclose (fp); fclose (fp);
@@ -355,11 +355,12 @@ destroy_initialization_status_window (void)
if (win_initstatus) if (win_initstatus)
{ {
gtk_widget_destroy (win_initstatus); gtk_widget_destroy (win_initstatus);
if (logo_pixmap != NULL) if (logo_pixmap != NULL)
gdk_pixmap_unref (logo_pixmap); gdk_pixmap_unref (logo_pixmap);
win_initstatus = label1 = label2 = pbar = logo_area = NULL;
logo_pixmap = NULL; logo_pixmap = NULL;
win_initstatus = label1 = label2 = pbar = logo_area = NULL;
} }
} }
@@ -380,6 +381,10 @@ make_initialization_status_window (void)
gtk_window_set_position (GTK_WINDOW (win_initstatus), GTK_WIN_POS_CENTER); gtk_window_set_position (GTK_WINDOW (win_initstatus), GTK_WIN_POS_CENTER);
gtk_window_set_policy (GTK_WINDOW (win_initstatus), FALSE, FALSE, FALSE); gtk_window_set_policy (GTK_WINDOW (win_initstatus), FALSE, FALSE, FALSE);
gtk_signal_connect (GTK_OBJECT (win_initstatus), "delete_event",
GTK_SIGNAL_FUNC (gtk_true),
NULL);
gimp_dialog_set_icon (GTK_WINDOW (win_initstatus)); gimp_dialog_set_icon (GTK_WINDOW (win_initstatus));
if (no_splash_image == FALSE && if (no_splash_image == FALSE &&
@@ -561,6 +566,16 @@ app_init (void)
} }
} }
#ifdef G_OS_WIN32
/* Do this already here on Win32 */
if (no_interface == FALSE)
{
/* FIXME: This needs to go in preferences */
message_handler = MESSAGE_BOX;
}
#endif
RESET_BAR(); RESET_BAR();
file_ops_pre_init (); /* pre-initialize the file types */ file_ops_pre_init (); /* pre-initialize the file types */
RESET_BAR(); RESET_BAR();
@@ -644,9 +659,18 @@ app_init (void)
{ {
gimp_context_set_tool (gimp_context_get_user (), RECT_SELECT); gimp_context_set_tool (gimp_context_get_user (), RECT_SELECT);
} }
#ifndef G_OS_WIN32
/* FIXME: This needs to go in preferences */ /* FIXME: This needs to go in preferences */
message_handler = MESSAGE_BOX; message_handler = MESSAGE_BOX;
#endif
}
/* check if a swap file can be created */
if (tile_swap_test () == FALSE)
{
g_message (_("Unable to open a test swap file. Please check the\n"
"location and permissions of the swap directory defined\n"
"in your Preferences (currently '%s')."), swap_path);
} }
color_transfer_init (); color_transfer_init ();
@@ -800,8 +824,8 @@ toast_old_temp_files (void)
* we'll probably get it the next time around * we'll probably get it the next time around
*/ */
gint pid = atoi (entry->d_name + 9);
#ifndef G_OS_WIN32 #ifndef G_OS_WIN32
gint pid = atoi (entry->d_name + 9);
if (kill (pid, 0)) if (kill (pid, 0))
#endif #endif
{ {

View File

@@ -40,11 +40,6 @@ extern gboolean we_are_exiting; /* this is used in session_get_window_info(
extern GimpSet *image_context; extern GimpSet *image_context;
extern MessageHandlerType message_handler; extern MessageHandlerType message_handler;
#ifdef G_OS_WIN32
gchar * quote_spaces (gchar *string);
#endif
#endif /* __APPENV_H__ */ #endif /* __APPENV_H__ */

View File

@@ -27,6 +27,7 @@ static gchar *authors[] =
"Brent Burton", "Brent Burton",
"Francisco Bustamante", "Francisco Bustamante",
"Albert Cahalan", "Albert Cahalan",
"George J. Carrette",
"Sean Cier", "Sean Cier",
"Winston Chang", "Winston Chang",
"Kenneth Christiansen", "Kenneth Christiansen",

View File

@@ -1,522 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <string.h>
#include <glib.h>
#include "apptypes.h"
#include "appenv.h"
#include "errors.h"
#include "boundary.h"
#include "tile.h"
/* half intensity for mask */
#define HALF_WAY 127
/* BoundSeg array growth parameter */
#define MAX_SEGS_INC 2048
/* The array of vertical segments */
static int * vert_segs = NULL;
/* The array of segments */
static BoundSeg * tmp_segs = NULL;
static int num_segs = 0;
static int max_segs = 0;
/* static empty segment arrays */
static int * empty_segs_n = NULL;
static int num_empty_n = 0;
static int * empty_segs_c = NULL;
static int num_empty_c = 0;
static int * empty_segs_l = NULL;
static int num_empty_l = 0;
static int max_empty_segs = 0;
/* global state variables--improve parameter efficiency */
static PixelRegion * cur_PR;
/* local function prototypes */
static void find_empty_segs (PixelRegion *, int, int *, int, int *,
BoundaryType, int, int, int, int);
static void make_seg (int, int, int, int, int);
static void allocate_vert_segs (void);
static void allocate_empty_segs (void);
static void process_horiz_seg (int, int, int, int, int);
static void make_horiz_segs (int, int, int, int *, int, int);
static void generate_boundary (BoundaryType, int, int, int, int);
/* Function definitions */
static void
find_empty_segs (PixelRegion *maskPR,
int scanline,
int empty_segs[],
int max_empty,
int *num_empty,
BoundaryType type,
int x1,
int y1,
int x2,
int y2)
{
unsigned char *data;
int x;
int start, end;
int val, last;
int tilex;
Tile *tile = NULL;
int endx, l_num_empty, dstep = 0;
data = NULL;
start = 0;
end = 0;
*num_empty = 0;
if (scanline < maskPR->y || scanline >= (maskPR->y + maskPR->h))
{
empty_segs[(*num_empty)++] = 0;
empty_segs[(*num_empty)++] = G_MAXINT;
return;
}
if (type == WithinBounds)
{
if (scanline < y1 || scanline >= y2)
{
empty_segs[(*num_empty)++] = 0;
empty_segs[(*num_empty)++] = G_MAXINT;
return;
}
start = x1;
end = x2;
}
else if (type == IgnoreBounds)
{
start = maskPR->x;
end = maskPR->x + maskPR->w;
if (scanline < y1 || scanline >= y2)
x2 = -1;
}
tilex = -1;
empty_segs[(*num_empty)++] = 0;
last = -1;
l_num_empty = *num_empty;
for (x = start; x < end;)
{
/* Check to see if we must advance to next tile */
if ((x / TILE_WIDTH) != tilex)
{
if (tile)
tile_release (tile, FALSE);
tile = tile_manager_get_tile (maskPR->tiles, x, scanline, TRUE, FALSE);
data = (unsigned char*)tile_data_pointer (tile, x % TILE_WIDTH, scanline % TILE_HEIGHT) + (tile_bpp(tile) - 1);
tilex = x / TILE_WIDTH;
dstep = tile_bpp(tile);
}
endx = x + (TILE_WIDTH - (x%TILE_WIDTH));
endx = MIN (end, endx);
if (type == IgnoreBounds && (endx > x1 || x < x2))
for (; x < endx; x++)
{
if (*data > HALF_WAY)
if (x >= x1 && x < x2)
val = -1;
else
val = 1;
else
val = -1;
data += dstep;
if (last != val)
empty_segs[l_num_empty++] = x;
last = val;
}
else
for (; x < endx; x++)
{
if (*data > HALF_WAY)
val = 1;
else
val = -1;
data += dstep;
if (last != val)
empty_segs[l_num_empty++] = x;
last = val;
}
}
*num_empty = l_num_empty;
if (last > 0)
empty_segs[(*num_empty)++] = x;
empty_segs[(*num_empty)++] = G_MAXINT;
if (tile)
tile_release (tile, FALSE);
}
static void
make_seg (int x1,
int y1,
int x2,
int y2,
int open)
{
if (num_segs >= max_segs)
{
max_segs += MAX_SEGS_INC;
tmp_segs = (BoundSeg *) g_realloc ((void *) tmp_segs,
sizeof (BoundSeg) * max_segs);
if (!tmp_segs)
gimp_fatal_error ("make_seg(): Unable to reallocate segments array for mask boundary.");
}
tmp_segs[num_segs].x1 = x1;
tmp_segs[num_segs].y1 = y1;
tmp_segs[num_segs].x2 = x2;
tmp_segs[num_segs].y2 = y2;
tmp_segs[num_segs].open = open;
num_segs ++;
}
static void
allocate_vert_segs (void)
{
int i;
/* allocate and initialize the vert_segs array */
vert_segs = (int *) g_realloc ((void *) vert_segs, (cur_PR->w + cur_PR->x + 1) * sizeof (int));
for (i = 0; i <= (cur_PR->w + cur_PR->x); i++)
vert_segs[i] = -1;
}
static void
allocate_empty_segs (void)
{
int need_num_segs;
/* find the maximum possible number of empty segments given the current mask */
need_num_segs = cur_PR->w + 3;
if (need_num_segs > max_empty_segs)
{
max_empty_segs = need_num_segs;
empty_segs_n = (int *) g_realloc (empty_segs_n, sizeof (int) * max_empty_segs);
empty_segs_c = (int *) g_realloc (empty_segs_c, sizeof (int) * max_empty_segs);
empty_segs_l = (int *) g_realloc (empty_segs_l, sizeof (int) * max_empty_segs);
if (!empty_segs_n || !empty_segs_l || !empty_segs_c)
gimp_fatal_error ("allocate_empty_segs(): Unable to reallocate empty segments array for mask boundary.");
}
}
static void
process_horiz_seg (int x1,
int y1,
int x2,
int y2,
int open)
{
/* This procedure accounts for any vertical segments that must be
drawn to close in the horizontal segments. */
if (vert_segs[x1] >= 0)
{
make_seg (x1, vert_segs[x1], x1, y1, !open);
vert_segs[x1] = -1;
}
else
vert_segs[x1] = y1;
if (vert_segs[x2] >= 0)
{
make_seg (x2, vert_segs[x2], x2, y2, open);
vert_segs[x2] = -1;
}
else
vert_segs[x2] = y2;
make_seg (x1, y1, x2, y2, open);
}
static void
make_horiz_segs (int start,
int end,
int scanline,
int empty[],
int num_empty,
int top)
{
int empty_index;
int e_s, e_e; /* empty segment start and end values */
for (empty_index = 0; empty_index < num_empty; empty_index += 2)
{
e_s = *empty++;
e_e = *empty++;
if (e_s <= start && e_e >= end)
process_horiz_seg (start, scanline, end, scanline, top);
else if ((e_s > start && e_s < end) ||
(e_e < end && e_e > start))
process_horiz_seg (MAX (e_s, start), scanline,
MIN (e_e, end), scanline, top);
}
}
static void
generate_boundary (BoundaryType type,
int x1,
int y1,
int x2,
int y2)
{
int scanline;
int i;
int start, end;
int * tmp_segs;
start = 0;
end = 0;
/* array for determining the vertical line segments which must be drawn */
allocate_vert_segs ();
/* make sure there is enough space for the empty segment array */
allocate_empty_segs ();
num_segs = 0;
if (type == WithinBounds)
{
start = y1;
end = y2;
}
else if (type == IgnoreBounds)
{
start = cur_PR->y;
end = cur_PR->y + cur_PR->h;
}
/* Find the empty segments for the previous and current scanlines */
find_empty_segs (cur_PR, start - 1, empty_segs_l,
max_empty_segs, &num_empty_l,
type, x1, y1, x2, y2);
find_empty_segs (cur_PR, start, empty_segs_c,
max_empty_segs, &num_empty_c,
type, x1, y1, x2, y2);
for (scanline = start; scanline < end; scanline++)
{
/* find the empty segment list for the next scanline */
find_empty_segs (cur_PR, scanline + 1, empty_segs_n,
max_empty_segs, &num_empty_n,
type, x1, y1, x2, y2);
/* process the segments on the current scanline */
for (i = 1; i < num_empty_c - 1; i += 2)
{
make_horiz_segs (empty_segs_c [i], empty_segs_c [i+1],
scanline, empty_segs_l, num_empty_l, 1);
make_horiz_segs (empty_segs_c [i], empty_segs_c [i+1],
scanline+1, empty_segs_n, num_empty_n, 0);
}
/* get the next scanline of empty segments, swap others */
tmp_segs = empty_segs_l;
empty_segs_l = empty_segs_c;
num_empty_l = num_empty_c;
empty_segs_c = empty_segs_n;
num_empty_c = num_empty_n;
empty_segs_n = tmp_segs;
}
}
BoundSeg *
find_mask_boundary (PixelRegion *maskPR,
int *num_elems,
BoundaryType type,
int x1,
int y1,
int x2,
int y2)
{
BoundSeg * new_segs = NULL;
/* The mask paramater can be any PixelRegion. If the region
* has more than 1 bytes/pixel, the last byte of each pixel is
* used to determine the boundary outline.
*/
cur_PR = maskPR;
/* Calculate the boundary */
generate_boundary (type, x1, y1, x2, y2);
/* Set the number of X segments */
*num_elems = num_segs;
/* Make a copy of the boundary */
if (num_segs)
{
new_segs = (BoundSeg *) g_malloc (sizeof (BoundSeg) * num_segs);
memcpy (new_segs, tmp_segs, (sizeof (BoundSeg) * num_segs));
}
/* Return the new boundary */
return new_segs;
}
/************************/
/* Sorting a Boundary */
static int find_segment (BoundSeg *, int, int, int);
static int
find_segment (BoundSeg *segs,
int ns,
int x,
int y)
{
int index;
for (index = 0; index < ns; index++)
if (((segs[index].x1 == x && segs[index].y1 == y) || (segs[index].x2 == x && segs[index].y2 == y)) &&
segs[index].visited == FALSE)
return index;
return -1;
}
BoundSeg *
sort_boundary (BoundSeg *segs,
int ns,
int *num_groups)
{
int i;
int index;
int x, y;
int startx, starty;
int empty = (num_segs == 0);
BoundSeg *new_segs;
index = 0;
new_segs = NULL;
for (i = 0; i < ns; i++)
segs[i].visited = FALSE;
num_segs = 0;
*num_groups = 0;
while (! empty)
{
empty = TRUE;
/* find the index of a non-visited segment to start a group */
for (i = 0; i < ns; i++)
if (segs[i].visited == FALSE)
{
index = i;
empty = FALSE;
i = ns;
}
if (! empty)
{
make_seg (segs[index].x1, segs[index].y1,
segs[index].x2, segs[index].y2,
segs[index].open);
segs[index].visited = TRUE;
startx = segs[index].x1;
starty = segs[index].y1;
x = segs[index].x2;
y = segs[index].y2;
while ((index = find_segment (segs, ns, x, y)) != -1)
{
/* make sure ordering is correct */
if (x == segs[index].x1 && y == segs[index].y1)
{
make_seg (segs[index].x1, segs[index].y1,
segs[index].x2, segs[index].y2,
segs[index].open);
x = segs[index].x2;
y = segs[index].y2;
}
else
{
make_seg (segs[index].x2, segs[index].y2,
segs[index].x1, segs[index].y1,
segs[index].open);
x = segs[index].x1;
y = segs[index].y1;
}
segs[index].visited = TRUE;
}
if (x != startx || y != starty)
g_message ("sort_boundary(): Unconnected boundary group!");
/* Mark the end of a group */
*num_groups = *num_groups + 1;
make_seg (-1, -1, -1, -1, 0);
}
}
/* Make a copy of the boundary */
if (num_segs)
{
new_segs = (BoundSeg *) g_malloc (sizeof (BoundSeg) * num_segs);
memcpy (new_segs, tmp_segs, (sizeof (BoundSeg) * num_segs));
}
/* Return the new boundary */
return new_segs;
}

View File

@@ -1,37 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __BOUNDARY_H__
#define __BOUNDARY_H__
#include "boundaryF.h"
#include "paint_funcs.h"
struct _BoundSeg
{
int x1, y1;
int x2, y2;
int open;
int visited;
};
BoundSeg * find_mask_boundary (PixelRegion *, int *, BoundaryType, int, int, int, int);
BoundSeg * sort_boundary (BoundSeg *, int, int *);
#endif /* __BOUNDARY_H__ */

View File

@@ -1,344 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <glib.h>
#include "brush_scale.h"
MaskBuf *
brush_scale_mask (MaskBuf *brush_mask,
int dest_width,
int dest_height)
{
MaskBuf *scale_brush;
int src_width;
int src_height;
int value;
int area;
int i, j;
int x, x0, y, y0;
int dx, dx0, dy, dy0;
int fx, fx0, fy, fy0;
unsigned char *src, *dest;
g_return_val_if_fail (brush_mask != NULL &&
dest_width != 0 && dest_height != 0, NULL);
src_width = brush_mask->width;
src_height = brush_mask->height;
scale_brush = mask_buf_new (dest_width, dest_height);
g_return_val_if_fail (scale_brush != NULL, NULL);
/* get the data */
dest = mask_buf_data (scale_brush);
src = mask_buf_data (brush_mask);
fx = fx0 = (256.0 * src_width) / dest_width;
fy = fy0 = (256.0 * src_height) / dest_height;
area = fx0 * fy0;
x = x0 = 0;
y = y0 = 0;
dx = dx0 = 0;
dy = dy0 = 0;
for (i=0; i<dest_height; i++)
{
for (j=0; j<dest_width; j++)
{
value = 0;
fy = fy0;
y = y0;
dy = dy0;
if (dy)
{
fx = fx0;
x = x0;
dx = dx0;
if (dx)
{
value += dx * dy * src[x + src_width * y];
x++;
fx -= dx;
dx = 0;
}
while (fx >= 256)
{
value += 256 * dy * src[x + src_width * y];
x++;
fx -= 256;
}
if (fx)
{
value += fx * dy * src[x + src_width * y];
dx = 256 - fx;
}
y++;
fy -= dy;
dy = 0;
}
while (fy >= 256)
{
fx = fx0;
x = x0;
dx = dx0;
if (dx)
{
value += dx * 256 * src[x + src_width * y];
x++;
fx -= dx;
dx = 0;
}
while (fx >= 256)
{
value += 256 * 256 * src[x + src_width * y];
x++;
fx -= 256;
}
if (fx)
{
value += fx * 256 * src[x + src_width * y];
dx = 256 - fx;
}
y++;
fy -= 256;
}
if (fy)
{
fx = fx0;
x = x0;
dx = dx0;
if (dx)
{
value += dx * fy * src[x + src_width * y];
x++;
fx -= dx;
dx = 0;
}
while (fx >= 256)
{
value += 256 * fy * src[x + src_width * y];
x++;
fx -= 256;
}
if (fx)
{
value += fx * fy * src[x + src_width * y];
dx = 256 - fx;
}
dy = 256 - fy;
}
*dest++ = MIN ((value / area), 255);
x0 = x;
dx0 = dx;
}
x0 = 0;
dx0 = 0;
y0 = y;
dy0 = dy;
}
return scale_brush;
}
#define ADD_RGB(dest, factor, src) \
dest[0] += factor * src[0]; \
dest[1] += factor * src[1]; \
dest[2] += factor * src[2];
MaskBuf *
brush_scale_pixmap (MaskBuf *pixmap,
int dest_width,
int dest_height)
{
MaskBuf *scale_brush;
int src_width;
int src_height;
int value[3];
int factor;
int area;
int i, j;
int x, x0, y, y0;
int dx, dx0, dy, dy0;
int fx, fx0, fy, fy0;
unsigned char *src, *src_ptr, *dest;
g_return_val_if_fail (pixmap != NULL && pixmap->bytes == 3 &&
dest_width != 0 && dest_height != 0, NULL);
src_width = pixmap->width;
src_height = pixmap->height;
scale_brush = temp_buf_new (dest_width, dest_height, 3, 0, 0, NULL);
g_return_val_if_fail (scale_brush != NULL, NULL);
/* get the data */
dest = mask_buf_data (scale_brush);
src = mask_buf_data (pixmap);
fx = fx0 = (256.0 * src_width) / dest_width;
fy = fy0 = (256.0 * src_height) / dest_height;
area = fx0 * fy0;
x = x0 = 0;
y = y0 = 0;
dx = dx0 = 0;
dy = dy0 = 0;
for (i=0; i<dest_height; i++)
{
for (j=0; j<dest_width; j++)
{
value[0] = 0;
value[1] = 0;
value[2] = 0;
fy = fy0;
y = y0;
dy = dy0;
if (dy)
{
fx = fx0;
x = x0;
dx = dx0;
if (dx)
{
factor = dx * dy;
src_ptr = src + 3 * (x + y * src_width);
ADD_RGB (value, factor, src_ptr);
x++;
fx -= dx;
dx = 0;
}
while (fx >= 256)
{
factor = 256 * dy;
src_ptr = src + 3 * (x + y * src_width);
ADD_RGB (value, factor, src_ptr);
x++;
fx -= 256;
}
if (fx)
{
factor = fx * dy;
src_ptr = src + 3 * (x + y * src_width);
ADD_RGB (value, factor, src_ptr);
dx = 256 - fx;
}
y++;
fy -= dy;
dy = 0;
}
while (fy >= 256)
{
fx = fx0;
x = x0;
dx = dx0;
if (dx)
{
factor = dx * 256;
src_ptr = src + 3 * (x + y * src_width);
ADD_RGB (value, factor, src_ptr);
x++;
fx -= dx;
dx = 0;
}
while (fx >= 256)
{
factor = 256 * 256;
src_ptr = src + 3 * (x + y * src_width);
ADD_RGB (value, factor, src_ptr);
x++;
fx -= 256;
}
if (fx)
{
factor = fx * 256;
src_ptr = src + 3 * (x + y * src_width);
ADD_RGB (value, factor, src_ptr);
dx = 256 - fx;
}
y++;
fy -= 256;
}
if (fy)
{
fx = fx0;
x = x0;
dx = dx0;
if (dx)
{
factor = dx * fy;
src_ptr = src + 3 * (x + y * src_width);
ADD_RGB (value, factor, src_ptr);
x++;
fx -= dx;
dx = 0;
}
while (fx >= 256)
{
factor = 256 * fy;
src_ptr = src + 3 * (x + y * src_width);
ADD_RGB (value, factor, src_ptr);
x++;
fx -= 256;
}
if (fx)
{
factor = fx * fy;
src_ptr = src + 3 * (x + y * src_width);
ADD_RGB (value, factor, src_ptr);
dx = 256 - fx;
}
dy = 256 - fy;
}
*dest++ = MIN ((value[0] / area), 255);
*dest++ = MIN ((value[1] / area), 255);
*dest++ = MIN ((value[2] / area), 255);
x0 = x;
dx0 = dx;
}
x0 = 0;
dx0 = 0;
y0 = y;
dy0 = dy;
}
return scale_brush;
}
#undef ADD_RGB

View File

@@ -1,35 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __BRUSH_SCALE_H__
#define __BRUSH_SCALE_H__
#include "temp_buf.h"
/* functions */
MaskBuf * brush_scale_mask (MaskBuf *, int, int);
MaskBuf * brush_scale_pixmap (MaskBuf *, int, int);
#endif /* __BRUSH_SCALE_H__ */

View File

@@ -1,732 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <glib.h>
#include "apptypes.h"
#include "appenv.h"
#include "color_balance.h"
#include "color_transfer.h"
#include "drawable.h"
#include "gdisplay.h"
#include "gimpui.h"
#include "image_map.h"
#include "libgimp/gimpintl.h"
#include "libgimp/gimpmath.h"
#include "libgimp/gimpcolorspace.h"
#define CYAN_RED 0x1
#define MAGENTA_GREEN 0x2
#define YELLOW_BLUE 0x4
#define ALL (CYAN_RED | MAGENTA_GREEN | YELLOW_BLUE)
/* the color balance structures */
typedef struct _ColorBalance ColorBalance;
struct _ColorBalance
{
gint x, y; /* coords for last mouse click */
};
/* the color balance tool options */
static ToolOptions *color_balance_options = NULL;
/* the color balance dialog */
static ColorBalanceDialog *color_balance_dialog = NULL;
/* color balance action functions */
static void color_balance_control (Tool *, ToolAction, gpointer);
static ColorBalanceDialog * color_balance_dialog_new (void);
static void color_balance_update (ColorBalanceDialog *, int);
static void color_balance_preview (ColorBalanceDialog *);
static void color_balance_reset_callback (GtkWidget *, gpointer);
static void color_balance_ok_callback (GtkWidget *, gpointer);
static void color_balance_cancel_callback (GtkWidget *, gpointer);
static void color_balance_range_callback (GtkWidget *, gpointer);
static void color_balance_preserve_update (GtkWidget *, gpointer);
static void color_balance_preview_update (GtkWidget *, gpointer);
static void color_balance_cr_adjustment_update (GtkAdjustment *, gpointer);
static void color_balance_mg_adjustment_update (GtkAdjustment *, gpointer);
static void color_balance_yb_adjustment_update (GtkAdjustment *, gpointer);
/* color balance machinery */
void
color_balance (PixelRegion *srcPR,
PixelRegion *destPR,
void *data)
{
ColorBalanceDialog *cbd;
guchar *src, *s;
guchar *dest, *d;
gint alpha;
gint r, g, b;
gint r_n, g_n, b_n;
gint w, h;
cbd = (ColorBalanceDialog *) data;
h = srcPR->h;
src = srcPR->data;
dest = destPR->data;
alpha = (srcPR->bytes == 4) ? TRUE : FALSE;
while (h--)
{
w = srcPR->w;
s = src;
d = dest;
while (w--)
{
r = s[RED_PIX];
g = s[GREEN_PIX];
b = s[BLUE_PIX];
r_n = cbd->r_lookup[r];
g_n = cbd->g_lookup[g];
b_n = cbd->b_lookup[b];
if (cbd->preserve_luminosity)
{
gimp_rgb_to_hls (&r_n, &g_n, &b_n);
g_n = gimp_rgb_to_l (r, g, b);
gimp_hls_to_rgb (&r_n, &g_n, &b_n);
}
d[RED_PIX] = r_n;
d[GREEN_PIX] = g_n;
d[BLUE_PIX] = b_n;
if (alpha)
d[ALPHA_PIX] = s[ALPHA_PIX];
s += srcPR->bytes;
d += destPR->bytes;
}
src += srcPR->rowstride;
dest += destPR->rowstride;
}
}
/* color balance action functions */
static void
color_balance_control (Tool *tool,
ToolAction action,
gpointer gdisp_ptr)
{
ColorBalance * color_bal;
color_bal = (ColorBalance *) tool->private;
switch (action)
{
case PAUSE:
break;
case RESUME:
break;
case HALT:
color_balance_dialog_hide ();
break;
default:
break;
}
}
Tool *
tools_new_color_balance (void)
{
Tool * tool;
ColorBalance * private;
/* The tool options */
if (!color_balance_options)
{
color_balance_options = tool_options_new (_("Color Balance"));
tools_register (COLOR_BALANCE, color_balance_options);
}
tool = tools_new_tool (COLOR_BALANCE);
private = g_new0 (ColorBalance, 1);
tool->scroll_lock = TRUE; /* Disallow scrolling */
tool->preserve = FALSE; /* Don't preserve on drawable change */
tool->private = (void *) private;
tool->control_func = color_balance_control;
return tool;
}
void
color_balance_dialog_hide (void)
{
if (color_balance_dialog)
color_balance_cancel_callback (NULL, (gpointer) color_balance_dialog);
}
void
tools_free_color_balance (Tool *tool)
{
ColorBalance * color_bal;
color_bal = (ColorBalance *) tool->private;
/* Close the color select dialog */
color_balance_dialog_hide ();
g_free (color_bal);
}
void
color_balance_initialize (GDisplay *gdisp)
{
gint i;
if (! drawable_color (gimage_active_drawable (gdisp->gimage)))
{
g_message (_("Color balance operates only on RGB color drawables."));
return;
}
/* The color balance dialog */
if (!color_balance_dialog)
color_balance_dialog = color_balance_dialog_new ();
else
if (!GTK_WIDGET_VISIBLE (color_balance_dialog->shell))
gtk_widget_show (color_balance_dialog->shell);
for (i = 0; i < 3; i++)
{
color_balance_dialog->cyan_red[i] = 0.0;
color_balance_dialog->magenta_green[i] = 0.0;
color_balance_dialog->yellow_blue[i] = 0.0;
}
color_balance_dialog->drawable = gimage_active_drawable (gdisp->gimage);
color_balance_dialog->image_map =
image_map_create (gdisp, color_balance_dialog->drawable);
color_balance_update (color_balance_dialog, ALL);
}
/**************************/
/* Color Balance dialog */
/**************************/
static ColorBalanceDialog *
color_balance_dialog_new (void)
{
ColorBalanceDialog *cbd;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *table;
GtkWidget *start_label;
GtkWidget *end_label;
GtkWidget *label;
GtkWidget *spinbutton;
GtkWidget *slider;
GtkWidget *toggle;
GtkWidget *radio_button;
GtkObject *data;
GSList *group = NULL;
gint i;
gchar *appl_mode_names[] =
{
N_("Shadows"),
N_("Midtones"),
N_("Highlights")
};
cbd = g_new (ColorBalanceDialog, 1);
cbd->preserve_luminosity = TRUE;
cbd->preview = TRUE;
cbd->application_mode = SHADOWS;
/* The shell and main vbox */
cbd->shell = gimp_dialog_new (_("Color Balance"), "color_balance",
tools_help_func, NULL,
GTK_WIN_POS_NONE,
FALSE, TRUE, FALSE,
_("OK"), color_balance_ok_callback,
cbd, NULL, NULL, TRUE, FALSE,
_("Reset"), color_balance_reset_callback,
cbd, NULL, NULL, TRUE, FALSE,
_("Cancel"), color_balance_cancel_callback,
cbd, NULL, NULL, FALSE, TRUE,
NULL);
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (cbd->shell)->vbox), vbox);
/* Horizontal box for application mode */
hbox = gtk_hbox_new (FALSE, 4);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
label = gtk_label_new (_("Color Levels:"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
/* cyan-red spinbutton */
data = gtk_adjustment_new (0, -100.0, 100.0, 1.0, 10.0, 0.0);
cbd->cyan_red_data = GTK_ADJUSTMENT (data);
spinbutton = gtk_spin_button_new (cbd->cyan_red_data, 1.0, 0);
gtk_widget_set_usize (spinbutton, 75, -1);
gtk_box_pack_start (GTK_BOX (hbox), spinbutton, FALSE, FALSE, 0);
gtk_widget_show (spinbutton);
/* magenta-green spinbutton */
data = gtk_adjustment_new (0, -100.0, 100.0, 1.0, 10.0, 0.0);
cbd->magenta_green_data = GTK_ADJUSTMENT (data);
spinbutton = gtk_spin_button_new (cbd->magenta_green_data, 1.0, 0);
gtk_widget_set_usize (spinbutton, 75, -1);
gtk_box_pack_start (GTK_BOX (hbox), spinbutton, FALSE, FALSE, 0);
gtk_widget_show (spinbutton);
/* yellow-blue spinbutton */
data = gtk_adjustment_new (0, -100.0, 100.0, 1.0, 10.0, 0.0);
cbd->yellow_blue_data = GTK_ADJUSTMENT (data);
spinbutton = gtk_spin_button_new (cbd->yellow_blue_data, 1.0, 0);
gtk_widget_set_usize (spinbutton, 75, -1);
gtk_box_pack_start (GTK_BOX (hbox), spinbutton, FALSE, FALSE, 0);
gtk_widget_show (spinbutton);
gtk_widget_show (hbox);
/* The table containing sliders */
table = gtk_table_new (3, 3, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
/* Create the cyan-red scale widget */
start_label = gtk_label_new (_("Cyan"));
gtk_misc_set_alignment (GTK_MISC (start_label), 1.0, 1.0);
gtk_table_attach (GTK_TABLE (table), start_label, 0, 1, 0, 1,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
slider = gtk_hscale_new (cbd->cyan_red_data);
gtk_scale_set_digits (GTK_SCALE (slider), 0);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_table_attach_defaults (GTK_TABLE (table), slider, 1, 2, 0, 1);
gtk_signal_connect (GTK_OBJECT (cbd->cyan_red_data), "value_changed",
GTK_SIGNAL_FUNC (color_balance_cr_adjustment_update),
cbd);
end_label = gtk_label_new (_("Red"));
gtk_misc_set_alignment (GTK_MISC (end_label), 0.0, 1.0);
gtk_table_attach (GTK_TABLE (table), end_label, 2, 3, 0, 1,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (start_label);
gtk_widget_show (end_label);
gtk_widget_show (slider);
/* Create the magenta-green scale widget */
start_label = gtk_label_new (_("Magenta"));
gtk_misc_set_alignment (GTK_MISC (start_label), 1.0, 1.0);
gtk_table_attach (GTK_TABLE (table), start_label, 0, 1, 1, 2,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
slider = gtk_hscale_new (cbd->magenta_green_data);
gtk_scale_set_digits (GTK_SCALE (slider), 0);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_table_attach_defaults (GTK_TABLE (table), slider, 1, 2, 1, 2);
gtk_signal_connect (GTK_OBJECT (cbd->magenta_green_data), "value_changed",
GTK_SIGNAL_FUNC (color_balance_mg_adjustment_update),
cbd);
end_label = gtk_label_new (_("Green"));
gtk_misc_set_alignment (GTK_MISC (end_label), 0.0, 1.0);
gtk_table_attach (GTK_TABLE (table), end_label, 2, 3, 1, 2,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (start_label);
gtk_widget_show (end_label);
gtk_widget_show (slider);
/* Create the yellow-blue scale widget */
start_label = gtk_label_new (_("Yellow"));
gtk_misc_set_alignment (GTK_MISC (start_label), 1.0, 1.0);
gtk_table_attach (GTK_TABLE (table), start_label, 0, 1, 2, 3,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
slider = gtk_hscale_new (cbd->yellow_blue_data);
gtk_scale_set_digits (GTK_SCALE (slider), 0);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_table_attach_defaults (GTK_TABLE (table), slider, 1, 2, 2, 3);
gtk_signal_connect (GTK_OBJECT (cbd->yellow_blue_data), "value_changed",
GTK_SIGNAL_FUNC (color_balance_yb_adjustment_update),
cbd);
end_label = gtk_label_new (_("Blue"));
gtk_misc_set_alignment (GTK_MISC (end_label), 0.0, 1.0);
gtk_table_attach (GTK_TABLE (table), end_label, 2, 3, 2, 3,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (start_label);
gtk_widget_show (end_label);
gtk_widget_show (slider);
gtk_widget_show (table);
/* Horizontal box for application mode */
hbox = gtk_hbox_new (TRUE, 4);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
/* the radio buttons for application mode */
for (i = 0; i < 3; i++)
{
radio_button =
gtk_radio_button_new_with_label (group, gettext (appl_mode_names[i]));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio_button));
gtk_box_pack_start (GTK_BOX (hbox), radio_button, TRUE, FALSE, 0);
gtk_object_set_user_data (GTK_OBJECT (radio_button), (gpointer) i);
gtk_signal_connect (GTK_OBJECT (radio_button), "toggled",
GTK_SIGNAL_FUNC (color_balance_range_callback),
cbd);
gtk_widget_show (radio_button);
}
gtk_widget_show (hbox);
/* Horizontal box for preview and preserve luminosity toggle buttons */
hbox = gtk_hbox_new (FALSE, 4);
gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
/* The preserve luminosity toggle */
toggle = gtk_check_button_new_with_label (_("Preserve Luminosity"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
cbd->preserve_luminosity);
gtk_box_pack_start (GTK_BOX (hbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (color_balance_preserve_update),
cbd);
gtk_widget_show (toggle);
/* The preview toggle */
toggle = gtk_check_button_new_with_label (_("Preview"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), cbd->preview);
gtk_box_pack_end (GTK_BOX (hbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (color_balance_preview_update),
cbd);
gtk_widget_show (toggle);
gtk_widget_show (hbox);
gtk_widget_show (vbox);
gtk_widget_show (cbd->shell);
return cbd;
}
static void
color_balance_update (ColorBalanceDialog *cbd,
gint update)
{
if (update & CYAN_RED)
{
gtk_adjustment_set_value (cbd->cyan_red_data,
cbd->cyan_red[cbd->application_mode]);
}
if (update & MAGENTA_GREEN)
{
gtk_adjustment_set_value (cbd->magenta_green_data,
cbd->magenta_green[cbd->application_mode]);
}
if (update & YELLOW_BLUE)
{
gtk_adjustment_set_value (cbd->yellow_blue_data,
cbd->yellow_blue[cbd->application_mode]);
}
}
void
color_balance_create_lookup_tables (ColorBalanceDialog *cbd)
{
gdouble *cyan_red_transfer[3];
gdouble *magenta_green_transfer[3];
gdouble *yellow_blue_transfer[3];
gint i;
gint32 r_n, g_n, b_n;
/* Set the transfer arrays (for speed) */
cyan_red_transfer[SHADOWS] = (cbd->cyan_red[SHADOWS] > 0) ? shadows_add : shadows_sub;
cyan_red_transfer[MIDTONES] = (cbd->cyan_red[MIDTONES] > 0) ? midtones_add : midtones_sub;
cyan_red_transfer[HIGHLIGHTS] = (cbd->cyan_red[HIGHLIGHTS] > 0) ? highlights_add : highlights_sub;
magenta_green_transfer[SHADOWS] = (cbd->magenta_green[SHADOWS] > 0) ? shadows_add : shadows_sub;
magenta_green_transfer[MIDTONES] = (cbd->magenta_green[MIDTONES] > 0) ? midtones_add : midtones_sub;
magenta_green_transfer[HIGHLIGHTS] = (cbd->magenta_green[HIGHLIGHTS] > 0) ? highlights_add : highlights_sub;
yellow_blue_transfer[SHADOWS] = (cbd->yellow_blue[SHADOWS] > 0) ? shadows_add : shadows_sub;
yellow_blue_transfer[MIDTONES] = (cbd->yellow_blue[MIDTONES] > 0) ? midtones_add : midtones_sub;
yellow_blue_transfer[HIGHLIGHTS] = (cbd->yellow_blue[HIGHLIGHTS] > 0) ? highlights_add : highlights_sub;
for (i = 0; i < 256; i++)
{
r_n = i;
g_n = i;
b_n = i;
r_n += cbd->cyan_red[SHADOWS] * cyan_red_transfer[SHADOWS][r_n];
r_n = CLAMP0255 (r_n);
r_n += cbd->cyan_red[MIDTONES] * cyan_red_transfer[MIDTONES][r_n];
r_n = CLAMP0255 (r_n);
r_n += cbd->cyan_red[HIGHLIGHTS] * cyan_red_transfer[HIGHLIGHTS][r_n];
r_n = CLAMP0255 (r_n);
g_n += cbd->magenta_green[SHADOWS] * magenta_green_transfer[SHADOWS][g_n];
g_n = CLAMP0255 (g_n);
g_n += cbd->magenta_green[MIDTONES] * magenta_green_transfer[MIDTONES][g_n];
g_n = CLAMP0255 (g_n);
g_n += cbd->magenta_green[HIGHLIGHTS] * magenta_green_transfer[HIGHLIGHTS][g_n];
g_n = CLAMP0255 (g_n);
b_n += cbd->yellow_blue[SHADOWS] * yellow_blue_transfer[SHADOWS][b_n];
b_n = CLAMP0255 (b_n);
b_n += cbd->yellow_blue[MIDTONES] * yellow_blue_transfer[MIDTONES][b_n];
b_n = CLAMP0255 (b_n);
b_n += cbd->yellow_blue[HIGHLIGHTS] * yellow_blue_transfer[HIGHLIGHTS][b_n];
b_n = CLAMP0255 (b_n);
cbd->r_lookup[i] = r_n;
cbd->g_lookup[i] = g_n;
cbd->b_lookup[i] = b_n;
}
}
static void
color_balance_preview (ColorBalanceDialog *cbd)
{
if (!cbd->image_map)
{
g_message ("color_balance_preview(): No image map");
return;
}
active_tool->preserve = TRUE;
color_balance_create_lookup_tables (cbd);
image_map_apply (cbd->image_map, color_balance, (void *) cbd);
active_tool->preserve = FALSE;
}
static void
color_balance_reset_callback (GtkWidget *widget,
gpointer data)
{
ColorBalanceDialog *cbd;
cbd = (ColorBalanceDialog *) data;
cbd->cyan_red[cbd->application_mode] = 0.0;
cbd->magenta_green[cbd->application_mode] = 0.0;
cbd->yellow_blue[cbd->application_mode] = 0.0;
color_balance_update (cbd, ALL);
if (cbd->preview)
color_balance_preview (cbd);
}
static void
color_balance_ok_callback (GtkWidget *widget,
gpointer data)
{
ColorBalanceDialog *cbd;
cbd = (ColorBalanceDialog *) data;
gimp_dialog_hide (cbd->shell);
active_tool->preserve = TRUE;
if (!cbd->preview)
image_map_apply (cbd->image_map, color_balance, (void *) cbd);
if (cbd->image_map)
image_map_commit (cbd->image_map);
active_tool->preserve = FALSE;
cbd->image_map = NULL;
active_tool->gdisp_ptr = NULL;
active_tool->drawable = NULL;
}
static void
color_balance_cancel_callback (GtkWidget *widget,
gpointer data)
{
ColorBalanceDialog *cbd;
cbd = (ColorBalanceDialog *) data;
gimp_dialog_hide (cbd->shell);
if (cbd->image_map)
{
active_tool->preserve = TRUE;
image_map_abort (cbd->image_map);
active_tool->preserve = FALSE;
gdisplays_flush ();
cbd->image_map = NULL;
}
active_tool->gdisp_ptr = NULL;
active_tool->drawable = NULL;
}
static void
color_balance_range_callback (GtkWidget *widget,
gpointer data)
{
ColorBalanceDialog *cbd;
TransferMode range;
cbd = (ColorBalanceDialog *) data;
range = (TransferMode) gtk_object_get_user_data (GTK_OBJECT (widget));
cbd->application_mode = range;
color_balance_update (cbd, ALL);
}
static void
color_balance_preserve_update (GtkWidget *widget,
gpointer data)
{
ColorBalanceDialog *cbd;
cbd = (ColorBalanceDialog *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
cbd->preserve_luminosity = TRUE;
else
cbd->preserve_luminosity = FALSE;
if (cbd->preview)
color_balance_preview (cbd);
}
static void
color_balance_preview_update (GtkWidget *widget,
gpointer data)
{
ColorBalanceDialog *cbd;
cbd = (ColorBalanceDialog *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
{
cbd->preview = TRUE;
color_balance_preview (cbd);
}
else
{
cbd->preview = FALSE;
if (cbd->image_map)
{
active_tool->preserve = TRUE;
image_map_clear (cbd->image_map);
active_tool->preserve = FALSE;
gdisplays_flush ();
}
}
}
static void
color_balance_cr_adjustment_update (GtkAdjustment *adjustment,
gpointer data)
{
ColorBalanceDialog *cbd;
cbd = (ColorBalanceDialog *) data;
if (cbd->cyan_red[cbd->application_mode] != adjustment->value)
{
cbd->cyan_red[cbd->application_mode] = adjustment->value;
if (cbd->preview)
color_balance_preview (cbd);
}
}
static void
color_balance_mg_adjustment_update (GtkAdjustment *adjustment,
gpointer data)
{
ColorBalanceDialog *cbd;
cbd = (ColorBalanceDialog *) data;
if (cbd->magenta_green[cbd->application_mode] != adjustment->value)
{
cbd->magenta_green[cbd->application_mode] = adjustment->value;
if (cbd->preview)
color_balance_preview (cbd);
}
}
static void
color_balance_yb_adjustment_update (GtkAdjustment *adjustment,
gpointer data)
{
ColorBalanceDialog *cbd;
cbd = (ColorBalanceDialog *) data;
if (cbd->yellow_blue[cbd->application_mode] != adjustment->value)
{
cbd->yellow_blue[cbd->application_mode] = adjustment->value;
if (cbd->preview)
color_balance_preview (cbd);
}
}

View File

@@ -1,71 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __COLOR_BALANCE_H__
#define __COLOR_BALANCE_H__
#include "image_map.h"
#include "tools.h"
typedef enum
{
SHADOWS,
MIDTONES,
HIGHLIGHTS
} TransferMode;
typedef struct _ColorBalanceDialog ColorBalanceDialog;
struct _ColorBalanceDialog
{
GtkWidget *shell;
GtkAdjustment *cyan_red_data;
GtkAdjustment *magenta_green_data;
GtkAdjustment *yellow_blue_data;
GimpDrawable *drawable;
ImageMap image_map;
gdouble cyan_red[3];
gdouble magenta_green[3];
gdouble yellow_blue[3];
guchar r_lookup[256];
guchar g_lookup[256];
guchar b_lookup[256];
gboolean preserve_luminosity;
gboolean preview;
TransferMode application_mode;
};
Tool * tools_new_color_balance (void);
void tools_free_color_balance (Tool *tool);
void color_balance_initialize (GDisplay *gdisp);
void color_balance_dialog_hide (void);
void color_balance (PixelRegion *srcPR,
PixelRegion *destPR,
void *data);
void color_balance_create_lookup_tables (ColorBalanceDialog *cbd);
#endif /* __COLOR_BALANCE_H__ */

File diff suppressed because it is too large Load Diff

View File

@@ -1,78 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __CURVES_H__
#define __CURVES_H__
#include "image_map.h"
#include "lut_funcs.h"
#include "tools.h"
#define SMOOTH 0
#define GFREE 1
typedef struct _CurvesDialog CurvesDialog;
struct _CurvesDialog
{
GtkWidget *shell;
GtkWidget *channel_menu;
GtkWidget *xrange;
GtkWidget *yrange;
GtkWidget *graph;
GdkPixmap *pixmap;
GtkWidget *curve_type_menu;
GimpDrawable *drawable;
ImageMap image_map;
gint color;
gint channel;
gboolean preview;
gint grab_point;
gint last;
gint leftmost;
gint rightmost;
gint curve_type[5];
gint points[5][17][2];
guchar curve[5][256];
gint col_value[5];
gint cursor_ind_height;
gint cursor_ind_width;
gint cursor_ind_ascent;
GimpLut *lut;
};
Tool * tools_new_curves (void);
void tools_free_curves (Tool *tool);
void curves_dialog_hide (void);
void curves_initialize (GDisplay *gdisp);
void curves_free (void);
float curves_lut_func (CurvesDialog *cd,
gint nchannels,
gint channel,
gfloat value);
void curves_calculate_curve (CurvesDialog *cd);
#endif /* __CURVES_H__ */

View File

@@ -1,502 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimphistogram module Copyright (C) 1999 Jay Cox <jaycox@earthlink.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#ifdef ENABLE_MP
#include <pthread.h>
#endif /* ENABLE_MP */
#include <glib.h>
#include <libgimp/gimpmath.h>
#include "gimphistogram.h"
#include "pixel_region.h"
#include "gimpdrawable.h"
#include "channel.h"
#include "gimpimage.h"
#include "gimprc.h"
struct _GimpHistogram
{
gint bins;
gdouble **values;
gint nchannels;
#ifdef ENABLE_MP
pthread_mutex_t mutex;
gint nthreads;
gdouble ***tmp_values;
gchar *tmp_slots;
#endif /* ENABLE_MP */
};
GimpHistogram *
gimp_histogram_new (void)
{
GimpHistogram *histogram;
histogram = g_new0 (GimpHistogram, 1);
histogram->bins = 0;
histogram->values = NULL;
histogram->nchannels = 0;
#ifdef ENABLE_MP
histogram->nthreads = 0;
histogram->tmp_values = NULL;
histogram->tmp_slots = NULL;
#endif /* ENABLE_MP */
return histogram;
}
void
gimp_histogram_free (GimpHistogram *histogram)
{
gint i;
if (histogram->values)
{
for (i = 0; i < histogram->nchannels; i++)
g_free (histogram->values[i]);
g_free (histogram->values);
}
g_free (histogram);
}
static void
gimp_histogram_calculate_sub_region (GimpHistogram *histogram,
PixelRegion *region,
PixelRegion *mask)
{
const guchar *src, *msrc;
const guchar *m, *s;
gdouble **values;
gint h, w, max;
#ifdef ENABLE_MP
gint slot = 0;
/* find an unused temporary slot to put our results in and lock it */
pthread_mutex_lock (&histogram->mutex);
{
while (histogram->tmp_slots[slot])
slot++;
values = histogram->tmp_values[slot];
histogram->tmp_slots[slot] = 1;
}
pthread_mutex_unlock (&histogram->mutex);
#else /* !ENABLE_MP */
values = histogram->values;
#endif
h = region->h;
w = region->w;
if (mask)
{
gdouble masked;
src = region->data;
msrc = region->data;
while (h--)
{
s = src;
m = msrc;
w = region->w;
switch(region->bytes)
{
case 1:
while (w--)
{
masked = m[0] / 255.0;
values[0][s[0]] += masked;
s += 1;
m += 1;
}
break;
case 2:
while (w--)
{
masked = m[0] / 255.0;
values[0][s[0]] += masked;
values[1][s[1]] += masked;
s += 2;
m += 1;
}
break;
case 3: /* calculate seperate value values */
while (w--)
{
masked = m[0] / 255.0;
values[1][s[0]] += masked;
values[2][s[1]] += masked;
values[3][s[2]] += masked;
max = (s[0] > s[1]) ? s[0] : s[1];
if (s[2] > max)
values[0][s[2]] += masked;
else
values[0][max] += masked;
s += 3;
m += 1;
}
break;
case 4: /* calculate seperate value values */
while (w--)
{
masked = m[0] / 255.0;
values[1][s[0]] += masked;
values[2][s[1]] += masked;
values[3][s[2]] += masked;
values[4][s[3]] += masked;
max = (s[0] > s[1]) ? s[0] : s[1];
if (s[2] > max)
values[0][s[2]] += masked;
else
values[0][max] += masked;
s += 3;
m += 1;
}
break;
}
src += region->rowstride;
msrc += mask->rowstride;
}
}
else /* no mask */
{
src = region->data;
while (h--)
{
s = src;
w = region->w;
switch(region->bytes)
{
case 1:
while (w--)
{
values[0][s[0]] += 1.0;
s += 1;
}
break;
case 2:
while (w--)
{
values[0][s[0]] += 1.0;
values[1][s[1]] += 1.0;
s += 2;
}
break;
case 3: /* calculate seperate value values */
while (w--)
{
values[1][s[0]] += 1.0;
values[2][s[1]] += 1.0;
values[3][s[2]] += 1.0;
max = (s[0] > s[1]) ? s[0] : s[1];
if (s[2] > max)
values[0][s[2]] += 1.0;
else
values[0][max] += 1.0;
s += 3;
}
break;
case 4: /* calculate seperate value values */
while (w--)
{
values[1][s[0]] += 1.0;
values[2][s[1]] += 1.0;
values[3][s[2]] += 1.0;
values[4][s[3]] += 1.0;
max = (s[0] > s[1]) ? s[0] : s[1];
if (s[2] > max)
values[0][s[2]] += 1.0;
else
values[0][max] += 1.0;
s += 4;
}
break;
}
src += region->rowstride;
}
}
#ifdef ENABLE_MP
/* unlock this slot */
/* we shouldn't have to use mutex locks here */
pthread_mutex_lock (&histogram->mutex);
histogram->tmp_slots[slot] = 0;
pthread_mutex_unlock (&histogram->mutex);
#endif
}
static void
gimp_histogram_alloc (GimpHistogram *histogram,
gint bytes)
{
gint i;
if (bytes + 1 != histogram->nchannels)
{
if (histogram->values)
{
for (i = 0; i < histogram->nchannels; i++)
g_free (histogram->values[i]);
g_free (histogram->values);
}
histogram->nchannels = bytes + 1;
histogram->values = g_new0 (gdouble *, histogram->nchannels);
for (i = 0; i < histogram->nchannels; i++)
histogram->values[i] = g_new (double, 256);
}
}
void
gimp_histogram_calculate (GimpHistogram *histogram,
PixelRegion *region,
PixelRegion *mask)
{
gint i, j;
#ifdef ENABLE_MP
gint k;
#endif
gimp_histogram_alloc (histogram, region->bytes);
#ifdef ENABLE_MP
pthread_mutex_init (&histogram->mutex, NULL);
histogram->tmp_slots = g_new0 (gchar, num_processors);
histogram->tmp_values = g_new0 (gdouble **, num_processors);
for (i = 0; i < num_processors; i++)
{
histogram->tmp_values[i] = g_new0 (double *, histogram->nchannels);
histogram->tmp_slots[i] = 0;
for (j = 0; j < histogram->nchannels; j++)
{
histogram->tmp_values[i][j] = g_new0 (gdouble, 256);
for (k = 0; k < 256; k++)
histogram->tmp_values[i][j][k] = 0.0;
}
}
#endif
for (i = 0; i < histogram->nchannels; i++)
for (j = 0; j < 256; j++)
histogram->values[i][j] = 0.0;
pixel_regions_process_parallel ((p_func)gimp_histogram_calculate_sub_region,
histogram, 2, region, mask);
#ifdef ENABLE_MP
/* add up all the tmp buffers and free their memmory */
for (i = 0; i < num_processors; i++)
{
for (j = 0; j < histogram->nchannels; j++)
{
for (k = 0; k < 256; k++)
histogram->values[j][k] += histogram->tmp_values[i][j][k];
g_free (histogram->tmp_values[i][j]);
}
g_free (histogram->tmp_values[i]);
}
g_free (histogram->tmp_values);
g_free (histogram->tmp_slots);
#endif
}
void
gimp_histogram_calculate_drawable (GimpHistogram *histogram,
GimpDrawable *drawable)
{
PixelRegion region;
PixelRegion mask;
gint x1, y1, x2, y2;
gint off_x, off_y;
gboolean no_mask;
no_mask = (drawable_mask_bounds (drawable, &x1, &y1, &x2, &y2) == FALSE);
pixel_region_init (&region, gimp_drawable_data (drawable), x1, y1,
(x2 - x1), (y2 - y1), FALSE);
if (!no_mask)
{
Channel *sel_mask;
GimpImage *gimage;
gimage = gimp_drawable_gimage (drawable);
sel_mask = gimp_image_get_mask (gimage);
drawable_offsets (drawable, &off_x, &off_y);
pixel_region_init (&mask, gimp_drawable_data (GIMP_DRAWABLE (sel_mask)),
x1 + off_x, y1 + off_y, (x2 - x1), (y2 - y1), FALSE);
gimp_histogram_calculate (histogram, &region, &mask);
}
else
{
gimp_histogram_calculate (histogram, &region, NULL);
}
}
gdouble
gimp_histogram_get_maximum (GimpHistogram *histogram,
GimpHistogramChannel channel)
{
gdouble max = 0.0;
gint x;
for (x = 0; x < 256; x++)
if (histogram->values[channel][x] > max)
max = histogram->values[channel][x];
return max;
}
gdouble
gimp_histogram_get_value (GimpHistogram *histogram,
GimpHistogramChannel channel,
gint bin)
{
if (channel < histogram->nchannels && bin >= 0 && bin < 256)
return histogram->values[channel][bin];
return 0.0;
}
gdouble
gimp_histogram_get_channel (GimpHistogram *histogram,
GimpHistogramChannel channel,
gint bin)
{
if (histogram->nchannels > 3)
return gimp_histogram_get_value (histogram, channel + 1, bin);
else
return gimp_histogram_get_value (histogram, channel , bin);
}
gint
gimp_histogram_nchannels (GimpHistogram *histogram)
{
return histogram->nchannels - 1;
}
gdouble
gimp_histogram_get_count (GimpHistogram *histogram,
gint start,
gint end)
{
gint i;
gdouble count = 0.0;
for (i = start; i <= end; i++)
count += histogram->values[0][i];
return count;
}
gdouble
gimp_histogram_get_mean (GimpHistogram *histogram,
GimpHistogramChannel channel,
gint start,
gint end)
{
gint i;
gdouble mean = 0.0;
gdouble count;
for (i = start; i <= end; i++)
mean += i * histogram->values[channel][i];
count = gimp_histogram_get_count (histogram, start, end);
if (count > 0.0)
return mean / count;
return mean;
}
gint
gimp_histogram_get_median (GimpHistogram *histogram,
GimpHistogramChannel channel,
gint start,
gint end)
{
gint i;
gdouble sum = 0.0;
gdouble count;
count = gimp_histogram_get_count (histogram, start, end);
for (i = start; i <= end; i++)
{
sum += i * histogram->values[channel][i];
if (sum * 2 > count)
return i;
}
return -1;
}
gdouble
gimp_histogram_get_std_dev (GimpHistogram *histogram,
GimpHistogramChannel channel,
gint start,
gint end)
{
gint i;
gdouble dev = 0.0;
gdouble count;
gdouble mean;
mean = gimp_histogram_get_mean (histogram, channel, start, end);
count = gimp_histogram_get_count (histogram, start, end);
if (count == 0.0)
count = 1.0;
for (i = start; i <= end; i++)
dev += gimp_histogram_get_value (histogram, channel, i) *
(i - mean) * (i - mean);
return sqrt (dev / count);
}

View File

@@ -1,70 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimphistogram module Copyright (C) 1999 Jay Cox <jaycox@earthlink.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __GIMP_HISTOGRAM_H__
#define __GIMP_HISTOGRAM_H__
#include "pixel_region.h"
#include "gimpdrawable.h"
typedef enum
{
GIMP_HISTOGRAM_VALUE = 0,
GIMP_HISTOGRAM_RED = 1,
GIMP_HISTOGRAM_GREEN = 2,
GIMP_HISTOGRAM_BLUE = 3,
GIMP_HISTOGRAM_ALPHA = 4
} GimpHistogramChannel;
GimpHistogram * gimp_histogram_new (void);
void gimp_histogram_free (GimpHistogram *histogram);
void gimp_histogram_calculate (GimpHistogram *historgam,
PixelRegion *region,
PixelRegion *mask);
void gimp_histogram_calculate_drawable (GimpHistogram *histogram,
GimpDrawable *drawable);
gdouble gimp_histogram_get_maximum (GimpHistogram *histogram,
GimpHistogramChannel channel);
gdouble gimp_histogram_get_count (GimpHistogram *histogram,
gint start,
gint end);
gdouble gimp_histogram_get_mean (GimpHistogram *histogram,
GimpHistogramChannel channel,
gint start,
gint end);
gint gimp_histogram_get_median (GimpHistogram *histogram,
GimpHistogramChannel channel,
gint start,
gint end);
gdouble gimp_histogram_get_std_dev (GimpHistogram *histogram,
GimpHistogramChannel channel,
gint start,
gint end);
gdouble gimp_histogram_get_value (GimpHistogram *histogram,
GimpHistogramChannel channel,
gint bin);
gdouble gimp_histogram_get_channel (GimpHistogram *histogram,
GimpHistogramChannel channel,
gint bin);
gint gimp_histogram_nchannels (GimpHistogram *histogram);
#endif /* __GIMP_HISTOGRAM_H__ */

View File

@@ -1,254 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimplut.c: Copyright (C) 1999 Jay Cox <jaycox@earthlink.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdio.h>
#include <gtk/gtk.h>
#include "apptypes.h"
#include "gimplutP.h"
#include "gimplut.h"
GimpLut *
gimp_lut_new ()
{
GimpLut *lut;
lut = g_new(GimpLut, 1);
lut->luts = NULL;
lut->nchannels = 0;
return lut;
}
void
gimp_lut_free (GimpLut *lut)
{
int i;
for (i = 0; i < lut->nchannels; i++)
g_free(lut->luts[i]);
if (lut->luts)
g_free(lut->luts);
}
void
gimp_lut_setup (GimpLut *lut,
GimpLutFunc func,
void *user_data,
int nchannels)
{
int i, v;
double val;
if (lut->luts)
{
for (i = 0; i < lut->nchannels; i++)
g_free(lut->luts[i]);
g_free(lut->luts);
}
lut->nchannels = nchannels;
lut->luts = g_new(unsigned char*, lut->nchannels);
for (i = 0; i < lut->nchannels; i++)
{
lut->luts[i] = g_new(unsigned char, 256);
for (v = 0; v < 256; v++)
{ /* to add gamma correction use func(v ^ g) ^ 1/g instead. */
val = 255.0 * func(user_data, lut->nchannels, i, v/255.0) + 0.5;
if (val < 0.0)
lut->luts[i][v] = 0;
else if (val >= 255.0)
lut->luts[i][v] = 255;
else
lut->luts[i][v] = val;
}
}
}
void
gimp_lut_setup_exact (GimpLut *lut,
GimpLutFunc func,
void *user_data,
int nchannels)
{
gimp_lut_setup(lut, func, user_data, nchannels);
}
void
gimp_lut_process (GimpLut *lut,
PixelRegion *srcPR,
PixelRegion *destPR)
{
int h, width, src_r_i, dest_r_i;
unsigned char *src, *dest;
unsigned char *lut0 = NULL, *lut1 = NULL, *lut2 = NULL, *lut3 = NULL;
if (lut->nchannels > 0)
lut0 = lut->luts[0];
if (lut->nchannels > 1)
lut1 = lut->luts[1];
if (lut->nchannels > 2)
lut2 = lut->luts[2];
if (lut->nchannels > 3)
lut3 = lut->luts[3];
h = srcPR->h;
src = srcPR->data;
dest = destPR->data;
width = srcPR->w;
src_r_i = srcPR->rowstride - (srcPR->bytes * srcPR->w);
dest_r_i = destPR->rowstride - (destPR->bytes * srcPR->w);
if (src_r_i == 0 && dest_r_i == 0)
{
width *= h;
h = 1;
}
while (h--)
{
switch (lut->nchannels)
{
case 1:
while (width--)
{
*dest = lut0[*src];
src++;
dest++;
}
break;
case 2:
while (width--)
{
dest[0] = lut0[src[0]];
dest[1] = lut1[src[1]];
src += 2;
dest += 2;
}
break;
case 3:
while (width--)
{
dest[0] = lut0[src[0]];
dest[1] = lut1[src[1]];
dest[2] = lut2[src[2]];
src += 3;
dest += 3;
}
break;
case 4:
while (width--)
{
dest[0] = lut0[src[0]];
dest[1] = lut1[src[1]];
dest[2] = lut2[src[2]];
dest[3] = lut3[src[3]];
src += 4;
dest += 4;
}
break;
default:
fprintf(stderr, "gimplut: Error: nchannels = %d\n", lut->nchannels);
}
width = srcPR->w;
src += src_r_i;
dest += dest_r_i;
}
}
void
gimp_lut_process_inline (GimpLut *lut,
PixelRegion *srcPR)
{
int h, width, src_r_i;
unsigned char *src;
unsigned char *lut0 = NULL, *lut1 = NULL, *lut2 = NULL, *lut3 = NULL;
if (lut->nchannels > 0)
lut0 = lut->luts[0];
if (lut->nchannels > 1)
lut1 = lut->luts[1];
if (lut->nchannels > 2)
lut2 = lut->luts[2];
if (lut->nchannels > 3)
lut3 = lut->luts[3];
h = srcPR->h;
src = srcPR->data;
width = srcPR->w;
src_r_i = srcPR->rowstride - (srcPR->bytes * srcPR->w);
if (src_r_i == 0)
{
width *= h;
h = 1;
}
while (h--)
{
switch (lut->nchannels)
{
case 1:
while (width--)
{
*src = lut0[*src];
src++;
}
break;
case 2:
while (width--)
{
src[0] = lut0[src[0]];
src[1] = lut1[src[1]];
src += 2;
}
break;
case 3:
while (width--)
{
src[0] = lut0[src[0]];
src[1] = lut1[src[1]];
src[2] = lut2[src[2]];
src += 3;
}
break;
case 4:
while (width--)
{
src[0] = lut0[src[0]];
src[1] = lut1[src[1]];
src[2] = lut2[src[2]];
src[3] = lut3[src[3]];
src += 4;
}
break;
default:
fprintf(stderr, "gimplut: Error: nchannels = %d\n", lut->nchannels);
}
width = srcPR->w;
src += src_r_i;
}
}
void
gimp_lut_process_2 (PixelRegion *srcPR,
PixelRegion *destPR,
GimpLut *lut)
{
gimp_lut_process(lut, srcPR, destPR);
}

View File

@@ -1,66 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimplut.h: Copyright (C) 1999 Jay Cox <jaycox@earthlink.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __GIMP_LUT_H__
#define __GIMP_LUT_H__
#include "pixel_region.h"
/* TODO: the GimpLutFunc should really be passed the ColorModel of the region,
not just the number of channels */
/* GimpLutFuncs should assume that the input and output gamma are 1.0
and do no correction as this will be handled by gimp_lut_setup */
typedef float (*GimpLutFunc)(void *user_data, int nchannels,
int channel, float value);
GimpLut * gimp_lut_new ();
void gimp_lut_free (GimpLut *lut);
void gimp_lut_setup (GimpLut *, GimpLutFunc,
void *user_data,
int nchannels);
/* gimp_lut_setup_exact is currently identical to gimp_lut_setup. It
however is guaranteed to never perform any interpolation or gamma
correction on the lut */
void gimp_lut_setup_exact (GimpLut *, GimpLutFunc,
void *user_data,
int nchannels);
void gimp_lut_process (GimpLut *lut,
PixelRegion *srcPR,
PixelRegion *destPR);
/* gimp_lut_process_inline is like gimp_lut_process except it uses a
single PixelRegion as both the source and destination */
void gimp_lut_process_inline(GimpLut *lut,
PixelRegion *src_destPR);
/* gimp_lut_process_2 is the same as gimp_lut_process but the lut
perameter is last instead of first. this is necesary because
pixel_region_process_paralell sends the user_data as the 1st
parameter, and the image_map functions send user_data as the last
parameter */
void gimp_lut_process_2 (PixelRegion *srcPR,
PixelRegion *destPR,
GimpLut *lut);
#endif /* __GIMP_LUT_H__ */

View File

@@ -1,837 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <glib.h>
#include "apptypes.h"
#include "appenv.h"
#include "drawable.h"
#include "gimage_mask.h"
#include "gdisplay.h"
#include "gimpui.h"
#include "hue_saturation.h"
#include "libgimp/gimpcolorspace.h"
#include "libgimp/gimpmath.h"
#include "libgimp/gimpintl.h"
#define HUE_PARTITION_MASK GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK
#define SLIDER_WIDTH 200
#define DA_WIDTH 40
#define DA_HEIGHT 20
#define HUE_PARTITION 0x0
#define HUE_SLIDER 0x1
#define LIGHTNESS_SLIDER 0x2
#define SATURATION_SLIDER 0x4
#define DRAW 0x40
#define ALL 0xFF
/* the hue-saturation structures */
typedef struct _HueSaturation HueSaturation;
struct _HueSaturation
{
gint x, y; /* coords for last mouse click */
};
/* the hue-saturation tool options */
static ToolOptions *hue_saturation_options = NULL;
/* the hue-saturation tool dialog */
static HueSaturationDialog *hue_saturation_dialog = NULL;
/* Local variables */
static gint hue_transfer[6][256];
static gint lightness_transfer[6][256];
static gint saturation_transfer[6][256];
static gint default_colors[6][3] =
{
{ 255, 0, 0 },
{ 255, 255, 0 },
{ 0, 255, 0 },
{ 0, 255, 255 },
{ 0, 0, 255 },
{ 255, 0, 255 }
};
/* hue saturation action functions */
static void hue_saturation_control (Tool *, ToolAction, gpointer);
static HueSaturationDialog * hue_saturation_dialog_new (void);
static void hue_saturation_update (HueSaturationDialog *,
gint);
static void hue_saturation_preview (HueSaturationDialog *);
static void hue_saturation_reset_callback (GtkWidget *, gpointer);
static void hue_saturation_ok_callback (GtkWidget *, gpointer);
static void hue_saturation_cancel_callback (GtkWidget *, gpointer);
static void hue_saturation_partition_callback (GtkWidget *, gpointer);
static void hue_saturation_preview_update (GtkWidget *, gpointer);
static void hue_saturation_hue_adjustment_update (GtkAdjustment *,
gpointer);
static void hue_saturation_lightness_adjustment_update (GtkAdjustment *,
gpointer);
static void hue_saturation_saturation_adjustment_update (GtkAdjustment *,
gpointer);
static gint hue_saturation_hue_partition_events (GtkWidget *, GdkEvent *,
HueSaturationDialog *);
/* hue saturation machinery */
void
hue_saturation_calculate_transfers (HueSaturationDialog *hsd)
{
gint value;
gint hue;
gint i;
/* Calculate transfers */
for (hue = 0; hue < 6; hue++)
for (i = 0; i < 256; i++)
{
value = (hsd->hue[0] + hsd->hue[hue + 1]) * 255.0 / 360.0;
if ((i + value) < 0)
hue_transfer[hue][i] = 255 + (i + value);
else if ((i + value) > 255)
hue_transfer[hue][i] = i + value - 255;
else
hue_transfer[hue][i] = i + value;
/* Lightness */
value = (hsd->lightness[0] + hsd->lightness[hue + 1]) * 127.0 / 100.0;
value = CLAMP (value, -255, 255);
if (value < 0)
lightness_transfer[hue][i] = (unsigned char) ((i * (255 + value)) / 255);
else
lightness_transfer[hue][i] = (unsigned char) (i + ((255 - i) * value) / 255);
/* Saturation */
value = (hsd->saturation[0] + hsd->saturation[hue + 1]) * 255.0 / 100.0;
value = CLAMP (value, -255, 255);
/* This change affects the way saturation is computed. With the
old code (different code for value < 0), increasing the
saturation affected muted colors very much, and bright colors
less. With the new code, it affects muted colors and bright
colors more or less evenly. For enhancing the color in photos,
the new behavior is exactly what you want. It's hard for me
to imagine a case in which the old behavior is better.
*/
saturation_transfer[hue][i] = CLAMP ((i * (255 + value)) / 255, 0, 255);
}
}
void
hue_saturation (PixelRegion *srcPR,
PixelRegion *destPR,
void *user_data)
{
HueSaturationDialog *hsd;
unsigned char *src, *s;
unsigned char *dest, *d;
int alpha;
int w, h;
int r, g, b;
int hue;
hsd = (HueSaturationDialog *) user_data;
/* Set the transfer arrays (for speed) */
h = srcPR->h;
src = srcPR->data;
dest = destPR->data;
alpha = (srcPR->bytes == 4) ? TRUE : FALSE;
while (h--)
{
w = srcPR->w;
s = src;
d = dest;
while (w--)
{
r = s[RED_PIX];
g = s[GREEN_PIX];
b = s[BLUE_PIX];
gimp_rgb_to_hls (&r, &g, &b);
if (r < 43)
hue = 0;
else if (r < 85)
hue = 1;
else if (r < 128)
hue = 2;
else if (r < 171)
hue = 3;
else if (r < 213)
hue = 4;
else
hue = 5;
r = hue_transfer[hue][r];
g = lightness_transfer[hue][g];
b = saturation_transfer[hue][b];
gimp_hls_to_rgb (&r, &g, &b);
d[RED_PIX] = r;
d[GREEN_PIX] = g;
d[BLUE_PIX] = b;
if (alpha)
d[ALPHA_PIX] = s[ALPHA_PIX];
s += srcPR->bytes;
d += destPR->bytes;
}
src += srcPR->rowstride;
dest += destPR->rowstride;
}
}
/* hue saturation action functions */
static void
hue_saturation_control (Tool *tool,
ToolAction action,
gpointer gdisp_ptr)
{
switch (action)
{
case PAUSE:
break;
case RESUME:
break;
case HALT:
hue_saturation_dialog_hide ();
break;
default:
break;
}
}
Tool *
tools_new_hue_saturation (void)
{
Tool * tool;
HueSaturation * private;
/* The tool options */
if (!hue_saturation_options)
{
hue_saturation_options = tool_options_new (_("Hue-Saturation"));
tools_register (HUE_SATURATION, hue_saturation_options);
}
tool = tools_new_tool (HUE_SATURATION);
private = g_new0 (HueSaturation, 1);
tool->scroll_lock = TRUE; /* Disallow scrolling */
tool->preserve = FALSE; /* Don't preserve on drawable change */
tool->private = (void *) private;
tool->control_func = hue_saturation_control;
return tool;
}
void
hue_saturation_dialog_hide (void)
{
if (hue_saturation_dialog)
hue_saturation_cancel_callback (NULL, (gpointer) hue_saturation_dialog);
}
void
tools_free_hue_saturation (Tool *tool)
{
HueSaturation * color_bal;
color_bal = (HueSaturation *) tool->private;
/* Close the hue saturation dialog */
hue_saturation_dialog_hide ();
g_free (color_bal);
}
void
hue_saturation_initialize (GDisplay *gdisp)
{
gint i;
if (! drawable_color (gimage_active_drawable (gdisp->gimage)))
{
g_message (_("Hue-Saturation operates only on RGB color drawables."));
return;
}
/* The "hue-saturation" dialog */
if (!hue_saturation_dialog)
hue_saturation_dialog = hue_saturation_dialog_new ();
else
if (!GTK_WIDGET_VISIBLE (hue_saturation_dialog->shell))
gtk_widget_show (hue_saturation_dialog->shell);
for (i = 0; i < 7; i++)
{
hue_saturation_dialog->hue[i] = 0.0;
hue_saturation_dialog->lightness[i] = 0.0;
hue_saturation_dialog->saturation[i] = 0.0;
}
hue_saturation_dialog->drawable = gimage_active_drawable (gdisp->gimage);
hue_saturation_dialog->image_map =
image_map_create (gdisp, hue_saturation_dialog->drawable);
hue_saturation_update (hue_saturation_dialog, ALL);
}
void
hue_saturation_free (void)
{
if (hue_saturation_dialog)
{
if (hue_saturation_dialog->image_map)
{
active_tool->preserve = TRUE;
image_map_abort (hue_saturation_dialog->image_map);
active_tool->preserve = FALSE;
hue_saturation_dialog->image_map = NULL;
}
gtk_widget_destroy (hue_saturation_dialog->shell);
}
}
/***************************/
/* Hue-Saturation dialog */
/***************************/
static HueSaturationDialog *
hue_saturation_dialog_new (void)
{
HueSaturationDialog *hsd;
GtkWidget *main_vbox;
GtkWidget *main_hbox;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *table;
GtkWidget *label;
GtkWidget *slider;
GtkWidget *abox;
GtkWidget *spinbutton;
GtkWidget *toggle;
GtkWidget *radio_button;
GtkWidget *frame;
GtkObject *data;
GSList *group = NULL;
gint i;
gchar *hue_partition_names[] =
{
N_("Master"),
N_("R"),
N_("Y"),
N_("G"),
N_("C"),
N_("B"),
N_("M")
};
hsd = g_new (HueSaturationDialog, 1);
hsd->hue_partition = ALL_HUES;
hsd->preview = TRUE;
/* The shell and main vbox */
hsd->shell = gimp_dialog_new (_("Hue-Saturation"), "hue_saturation",
tools_help_func, NULL,
GTK_WIN_POS_NONE,
FALSE, TRUE, FALSE,
_("OK"), hue_saturation_ok_callback,
hsd, NULL, NULL, TRUE, FALSE,
_("Reset"), hue_saturation_reset_callback,
hsd, NULL, NULL, FALSE, FALSE,
_("Cancel"), hue_saturation_cancel_callback,
hsd, NULL, NULL, FALSE, TRUE,
NULL);
main_vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 4);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (hsd->shell)->vbox), main_vbox);
/* The main hbox containing hue partitions and sliders */
main_hbox = gtk_hbox_new (FALSE, 12);
gtk_box_pack_start (GTK_BOX (main_vbox), main_hbox, FALSE, FALSE, 0);
/* The table containing hue partitions */
table = gtk_table_new (7, 2, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_box_pack_start (GTK_BOX (main_hbox), table, FALSE, FALSE, 0);
/* the radio buttons for hue partitions */
for (i = 0; i < 7; i++)
{
radio_button = gtk_radio_button_new_with_label (group, gettext (hue_partition_names[i]));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio_button));
gtk_object_set_data (GTK_OBJECT (radio_button), "hue_partition",
(gpointer) i);
if (!i)
{
gtk_table_attach (GTK_TABLE (table), radio_button, 0, 2, 0, 1,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
}
else
{
gtk_table_attach (GTK_TABLE (table), radio_button, 0, 1, i, i + 1,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_table_attach (GTK_TABLE (table), frame, 1, 2, i, i + 1,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
hsd->hue_partition_da[i - 1] = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_size (GTK_PREVIEW (hsd->hue_partition_da[i - 1]),
DA_WIDTH, DA_HEIGHT);
gtk_widget_set_events (hsd->hue_partition_da[i - 1],
HUE_PARTITION_MASK);
gtk_signal_connect (GTK_OBJECT (hsd->hue_partition_da[i - 1]), "event",
GTK_SIGNAL_FUNC (hue_saturation_hue_partition_events),
hsd);
gtk_container_add (GTK_CONTAINER (frame), hsd->hue_partition_da[i - 1]);
gtk_widget_show (hsd->hue_partition_da[i - 1]);
gtk_widget_show (frame);
}
gtk_signal_connect (GTK_OBJECT (radio_button), "toggled",
GTK_SIGNAL_FUNC (hue_saturation_partition_callback),
hsd);
gtk_widget_show (radio_button);
}
gtk_widget_show (table);
/* The vbox for the table and preview toggle */
vbox = gtk_vbox_new (FALSE, 4);
gtk_box_pack_start (GTK_BOX (main_hbox), vbox, FALSE, FALSE, 0);
label = gtk_label_new (_("Hue / Lightness / Saturation Adjustments"));
gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
/* The table containing sliders */
table = gtk_table_new (3, 3, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
/* Create the hue scale widget */
label = gtk_label_new (_("Hue:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
data = gtk_adjustment_new (0, -180, 180.0, 1.0, 1.0, 0.0);
hsd->hue_data = GTK_ADJUSTMENT (data);
slider = gtk_hscale_new (hsd->hue_data);
gtk_widget_set_usize (slider, SLIDER_WIDTH, -1);
gtk_scale_set_digits (GTK_SCALE (slider), 0);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_table_attach (GTK_TABLE (table), slider, 1, 2, 0, 1,
GTK_EXPAND | GTK_SHRINK | GTK_FILL,
GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
abox = gtk_vbox_new (FALSE, 0);
spinbutton = gtk_spin_button_new (hsd->hue_data, 1.0, 0);
gtk_widget_set_usize (spinbutton, 74, -1);
gtk_box_pack_end (GTK_BOX (abox), spinbutton, FALSE, FALSE, 0);
gtk_table_attach (GTK_TABLE (table), abox, 2, 3, 0, 1,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_signal_connect (GTK_OBJECT (hsd->hue_data), "value_changed",
GTK_SIGNAL_FUNC (hue_saturation_hue_adjustment_update),
hsd);
gtk_widget_show (label);
gtk_widget_show (slider);
gtk_widget_show (spinbutton);
gtk_widget_show (abox);
/* Create the lightness scale widget */
label = gtk_label_new (_("Lightness:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
data = gtk_adjustment_new (0, -100.0, 100.0, 1.0, 1.0, 0.0);
hsd->lightness_data = GTK_ADJUSTMENT (data);
slider = gtk_hscale_new (hsd->lightness_data);
gtk_widget_set_usize (slider, SLIDER_WIDTH, -1);
gtk_scale_set_digits (GTK_SCALE (slider), 0);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_table_attach (GTK_TABLE (table), slider, 1, 2, 1, 2,
GTK_EXPAND | GTK_SHRINK | GTK_FILL,
GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
abox = gtk_vbox_new (FALSE, 0);
spinbutton = gtk_spin_button_new (hsd->lightness_data, 1.0, 0);
gtk_widget_set_usize (spinbutton, 75, -1);
gtk_box_pack_end (GTK_BOX (abox), spinbutton, FALSE, FALSE, 0);
gtk_table_attach (GTK_TABLE (table), abox, 2, 3, 1, 2,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_signal_connect (GTK_OBJECT (hsd->lightness_data), "value_changed",
GTK_SIGNAL_FUNC (hue_saturation_lightness_adjustment_update),
hsd);
gtk_widget_show (label);
gtk_widget_show (slider);
gtk_widget_show (spinbutton);
gtk_widget_show (abox);
/* Create the saturation scale widget */
label = gtk_label_new (_("Saturation:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
data = gtk_adjustment_new (0, -100.0, 100.0, 1.0, 1.0, 0.0);
hsd->saturation_data = GTK_ADJUSTMENT (data);
slider = gtk_hscale_new (hsd->saturation_data);
gtk_widget_set_usize (slider, SLIDER_WIDTH, -1);
gtk_scale_set_digits (GTK_SCALE (slider), 0);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_table_attach (GTK_TABLE (table), slider, 1, 2, 2, 3,
GTK_EXPAND | GTK_SHRINK | GTK_FILL,
GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
abox = gtk_vbox_new (FALSE, 0);
spinbutton = gtk_spin_button_new (hsd->saturation_data, 1.0, 0);
gtk_widget_set_usize (spinbutton, 75, -1);
gtk_box_pack_end (GTK_BOX (abox), spinbutton, FALSE, FALSE, 0);
gtk_table_attach (GTK_TABLE (table), abox, 2, 3, 2, 3,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_signal_connect (GTK_OBJECT (hsd->saturation_data), "value_changed",
GTK_SIGNAL_FUNC (hue_saturation_saturation_adjustment_update),
hsd);
gtk_widget_show (label);
gtk_widget_show (slider);
gtk_widget_show (spinbutton);
gtk_widget_show (abox);
gtk_widget_show (table);
/* Horizontal box for preview toggle button */
hbox = gtk_hbox_new (FALSE, 4);
gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
/* The preview toggle */
toggle = gtk_check_button_new_with_label (_("Preview"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), hsd->preview);
gtk_box_pack_end (GTK_BOX (hbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (hue_saturation_preview_update),
hsd);
gtk_widget_show (toggle);
gtk_widget_show (hbox);
gtk_widget_show (vbox);
gtk_widget_show (main_hbox);
gtk_widget_show (main_vbox);
gtk_widget_show (hsd->shell);
return hsd;
}
static void
hue_saturation_update (HueSaturationDialog *hsd,
gint update)
{
gint i, j, b;
gint rgb[3];
guchar buf[DA_WIDTH * 3];
if (update & HUE_SLIDER)
{
gtk_adjustment_set_value (GTK_ADJUSTMENT (hsd->hue_data),
hsd->hue[hsd->hue_partition]);
}
if (update & LIGHTNESS_SLIDER)
{
gtk_adjustment_set_value (GTK_ADJUSTMENT (hsd->lightness_data),
hsd->lightness[hsd->hue_partition]);
}
if (update & SATURATION_SLIDER)
{
gtk_adjustment_set_value (GTK_ADJUSTMENT (hsd->saturation_data),
hsd->saturation[hsd->hue_partition]);
}
hue_saturation_calculate_transfers (hsd);
for (i = 0; i < 6; i++)
{
rgb[RED_PIX] = default_colors[i][RED_PIX];
rgb[GREEN_PIX] = default_colors[i][GREEN_PIX];
rgb[BLUE_PIX] = default_colors[i][BLUE_PIX];
gimp_rgb_to_hls (rgb, rgb + 1, rgb + 2);
rgb[RED_PIX] = hue_transfer[i][rgb[RED_PIX]];
rgb[GREEN_PIX] = lightness_transfer[i][rgb[GREEN_PIX]];
rgb[BLUE_PIX] = saturation_transfer[i][rgb[BLUE_PIX]];
gimp_hls_to_rgb (rgb, rgb + 1, rgb + 2);
for (j = 0; j < DA_WIDTH; j++)
for (b = 0; b < 3; b++)
buf[j * 3 + b] = (guchar) rgb[b];
for (j = 0; j < DA_HEIGHT; j++)
gtk_preview_draw_row (GTK_PREVIEW (hsd->hue_partition_da[i]),
buf, 0, j, DA_WIDTH);
if (update & DRAW)
gtk_widget_draw (hsd->hue_partition_da[i], NULL);
}
}
static void
hue_saturation_preview (HueSaturationDialog *hsd)
{
if (!hsd->image_map)
{
g_warning ("hue_saturation_preview(): No image map");
return;
}
active_tool->preserve = TRUE;
image_map_apply (hsd->image_map, hue_saturation, (void *) hsd);
active_tool->preserve = FALSE;
}
static void
hue_saturation_reset_callback (GtkWidget *widget,
gpointer data)
{
HueSaturationDialog *hsd;
hsd = (HueSaturationDialog *) data;
hsd->hue[hsd->hue_partition] = 0.0;
hsd->lightness[hsd->hue_partition] = 0.0;
hsd->saturation[hsd->hue_partition] = 0.0;
hue_saturation_update (hsd, ALL);
if (hsd->preview)
hue_saturation_preview (hsd);
}
static void
hue_saturation_ok_callback (GtkWidget *widget,
gpointer data)
{
HueSaturationDialog *hsd;
hsd = (HueSaturationDialog *) data;
gimp_dialog_hide (hsd->shell);
active_tool->preserve = TRUE;
if (!hsd->preview)
image_map_apply (hsd->image_map, hue_saturation, (void *) hsd);
if (hsd->image_map)
image_map_commit (hsd->image_map);
active_tool->preserve = FALSE;
hsd->image_map = NULL;
active_tool->gdisp_ptr = NULL;
active_tool->drawable = NULL;
}
static void
hue_saturation_cancel_callback (GtkWidget *widget,
gpointer data)
{
HueSaturationDialog *hsd;
hsd = (HueSaturationDialog *) data;
gimp_dialog_hide (hsd->shell);
if (hsd->image_map)
{
active_tool->preserve = TRUE;
image_map_abort (hsd->image_map);
active_tool->preserve = FALSE;
gdisplays_flush ();
hsd->image_map = NULL;
}
active_tool->gdisp_ptr = NULL;
active_tool->drawable = NULL;
}
static void
hue_saturation_partition_callback (GtkWidget *widget,
gpointer data)
{
HueSaturationDialog *hsd;
HueRange partition;
hsd = (HueSaturationDialog *) data;
partition = (HueRange) gtk_object_get_data (GTK_OBJECT (widget),
"hue_partition");
hsd->hue_partition = partition;
hue_saturation_update (hsd, ALL);
}
static void
hue_saturation_preview_update (GtkWidget *widget,
gpointer data)
{
HueSaturationDialog *hsd;
hsd = (HueSaturationDialog *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
{
hsd->preview = TRUE;
hue_saturation_preview (hsd);
}
else
{
hsd->preview = FALSE;
if (hsd->image_map)
{
active_tool->preserve = TRUE;
image_map_clear (hsd->image_map);
active_tool->preserve = FALSE;
gdisplays_flush ();
}
}
}
static void
hue_saturation_hue_adjustment_update (GtkAdjustment *adjustment,
gpointer data)
{
HueSaturationDialog *hsd;
hsd = (HueSaturationDialog *) data;
if (hsd->hue[hsd->hue_partition] != adjustment->value)
{
hsd->hue[hsd->hue_partition] = adjustment->value;
hue_saturation_update (hsd, DRAW);
if (hsd->preview)
hue_saturation_preview (hsd);
}
}
static void
hue_saturation_lightness_adjustment_update (GtkAdjustment *adjustment,
gpointer data)
{
HueSaturationDialog *hsd;
hsd = (HueSaturationDialog *) data;
if (hsd->lightness[hsd->hue_partition] != adjustment->value)
{
hsd->lightness[hsd->hue_partition] = adjustment->value;
hue_saturation_update (hsd, DRAW);
if (hsd->preview)
hue_saturation_preview (hsd);
}
}
static void
hue_saturation_saturation_adjustment_update (GtkAdjustment *adjustment,
gpointer data)
{
HueSaturationDialog *hsd;
hsd = (HueSaturationDialog *) data;
if (hsd->saturation[hsd->hue_partition] != adjustment->value)
{
hsd->saturation[hsd->hue_partition] = adjustment->value;
hue_saturation_update (hsd, DRAW);
if (hsd->preview)
hue_saturation_preview (hsd);
}
}
static gint
hue_saturation_hue_partition_events (GtkWidget *widget,
GdkEvent *event,
HueSaturationDialog *hsd)
{
switch (event->type)
{
case GDK_EXPOSE:
hue_saturation_update (hsd, HUE_PARTITION);
break;
default:
break;
}
return FALSE;
}

View File

@@ -1,72 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __HUE_SATURATION_H__
#define __HUE_SATURATION_H__
#include "image_map.h"
#include "tools.h"
typedef enum
{
ALL_HUES,
RED_HUES,
YELLOW_HUES,
GREEN_HUES,
CYAN_HUES,
BLUE_HUES,
MAGENTA_HUES
} HueRange;
typedef struct _HueSaturationDialog HueSaturationDialog;
struct _HueSaturationDialog
{
GtkWidget *shell;
GtkWidget *hue_partition_da[6];
GtkAdjustment *hue_data;
GtkAdjustment *lightness_data;
GtkAdjustment *saturation_data;
GimpDrawable *drawable;
ImageMap image_map;
gdouble hue[7];
gdouble lightness[7];
gdouble saturation[7];
HueRange hue_partition;
gboolean preview;
};
Tool * tools_new_hue_saturation (void);
void tools_free_hue_saturation (Tool *tool);
void hue_saturation_initialize (GDisplay *gdisp);
void hue_saturation_free (void);
void hue_saturation_dialog_hide (void);
void hue_saturation (PixelRegion *srcPR,
PixelRegion *destPR,
void *data);
void hue_saturation_calculate_transfers (HueSaturationDialog *hsd);
#endif /* __HUE_SATURATION_H__ */

View File

@@ -1,426 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdio.h>
#include <glib.h>
#include <glib.h>
#include "apptypes.h"
#include "appenv.h"
#include "gimplut.h"
#include "gimphistogram.h"
#include "libgimp/gimpmath.h"
/* ---------- Brightness/Contrast -----------*/
typedef struct B_C_struct
{
double brightness;
double contrast;
} B_C_struct;
static float
brightness_contrast_lut_func(B_C_struct *data,
int nchannels, int channel, float value)
{
float nvalue;
double power;
/* return the original value for the alpha channel */
if ((nchannels == 2 || nchannels == 4) && channel == nchannels -1)
return value;
/* apply brightness */
if (data->brightness < 0.0)
value = value * (1.0 + data->brightness);
else
value = value + ((1.0 - value) * data->brightness);
/* apply contrast */
if (data->contrast < 0.0)
{
if (value > 0.5)
nvalue = 1.0 - value;
else
nvalue = value;
if (nvalue < 0.0)
nvalue = 0.0;
nvalue = 0.5 * pow (nvalue * 2.0 , (double) (1.0 + data->contrast));
if (value > 0.5)
value = 1.0 - nvalue;
else
value = nvalue;
}
else
{
if (value > 0.5)
nvalue = 1.0 - value;
else
nvalue = value;
if (nvalue < 0.0)
nvalue = 0.0;
power = (data->contrast == 1.0) ? 127 : 1.0 / (1.0 - data->contrast);
nvalue = 0.5 * pow (2.0 * nvalue, power);
if (value > 0.5)
value = 1.0 - nvalue;
else
value = nvalue;
}
return value;
}
void
brightness_contrast_lut_setup(GimpLut *lut, double brightness, double contrast,
int nchannels)
{
B_C_struct data;
data.brightness = brightness;
data.contrast = contrast;
gimp_lut_setup(lut, (GimpLutFunc) brightness_contrast_lut_func,
(void *) &data, nchannels);
}
GimpLut *
brightness_contrast_lut_new(double brightness, double contrast,
int nchannels)
{
GimpLut *lut;
lut = gimp_lut_new();
brightness_contrast_lut_setup(lut, brightness, contrast, nchannels);
return lut;
}
/* ---------------- invert ------------------ */
static float
invert_lut_func(void *unused,
int nchannels, int channel, float value)
{
/* don't invert the alpha channel */
if ((nchannels == 2 || nchannels == 4) && channel == nchannels -1)
return value;
return 1.0 - value;
}
void
invert_lut_setup(GimpLut *lut, int nchannels)
{
gimp_lut_setup_exact(lut, (GimpLutFunc) invert_lut_func,
NULL , nchannels);
}
GimpLut *
invert_lut_new(int nchannels)
{
GimpLut *lut;
lut = gimp_lut_new();
invert_lut_setup(lut, nchannels);
return lut;
}
/* ---------------- add (or subract)------------------ */
static float
add_lut_func(double *ammount,
int nchannels, int channel, float value)
{
/* don't change the alpha channel */
if ((nchannels == 2 || nchannels == 4) && channel == nchannels -1)
return value;
return (value + *ammount);
}
void
add_lut_setup(GimpLut *lut, double ammount, int nchannels)
{
gimp_lut_setup(lut, (GimpLutFunc) add_lut_func,
(void *) &ammount , nchannels);
}
GimpLut *
add_lut_new(double ammount, int nchannels)
{
GimpLut *lut;
lut = gimp_lut_new();
add_lut_setup(lut, ammount, nchannels);
return lut;
}
/* ---------------- intersect (MIN (pixel, value)) ------------------ */
static float
intersect_lut_func(double *min,
int nchannels, int channel, float value)
{
/* don't change the alpha channel */
if ((nchannels == 2 || nchannels == 4) && channel == nchannels -1)
return value;
return MIN (value, *min);
}
void
intersect_lut_setup(GimpLut *lut, double value, int nchannels)
{
gimp_lut_setup_exact(lut, (GimpLutFunc) intersect_lut_func,
(void *) &value , nchannels);
}
GimpLut *
intersect_lut_new(double value, int nchannels)
{
GimpLut *lut;
lut = gimp_lut_new();
intersect_lut_setup(lut, value, nchannels);
return lut;
}
/* ---------------- Threshold ------------------ */
static float
threshold_lut_func(double *min,
int nchannels, int channel, float value)
{
/* don't change the alpha channel */
if ((nchannels == 2 || nchannels == 4) && channel == nchannels -1)
return value;
if (value < *min)
return 0.0;
return 1.0;
}
void
threshold_lut_setup(GimpLut *lut, double value, int nchannels)
{
gimp_lut_setup_exact(lut, (GimpLutFunc) threshold_lut_func,
(void *) &value , nchannels);
}
GimpLut *
threshold_lut_new(double value, int nchannels)
{
GimpLut *lut;
lut = gimp_lut_new();
threshold_lut_setup(lut, value, nchannels);
return lut;
}
/* ------------- levels ------------ */
typedef struct
{
double *gamma;
int *low_input;
int *high_input;
int *low_output;
int *high_output;
} levels_struct;
static float
levels_lut_func(levels_struct *data,
int nchannels, int channel, float value)
{
double inten;
int j;
if (nchannels == 1)
j = 0;
else
j = channel + 1;
inten = value;
/* For color images this runs through the loop with j = channel +1
the first time and j = 0 the second time */
/* For bw images this runs through the loop with j = 0 the first and
only time */
for (; j >= 0; j -= (channel + 1))
{
/* don't apply the overall curve to the alpha channel */
if (j == 0 && (nchannels == 2 || nchannels == 4)
&& channel == nchannels -1)
return inten;
/* determine input intensity */
if (data->high_input[j] != data->low_input[j])
inten = (double) (255.0*inten - data->low_input[j]) /
(double) (data->high_input[j] - data->low_input[j]);
else
inten = (double) (255.0*inten - data->low_input[j]);
if (data->gamma[j] != 0.0)
{
if (inten >= 0.0)
inten = pow ( inten, (1.0 / data->gamma[j]));
else
inten = -pow (-inten, (1.0 / data->gamma[j]));
}
/* determine the output intensity */
if (data->high_output[j] >= data->low_output[j])
inten = (double) (inten * (data->high_output[j] - data->low_output[j]) +
data->low_output[j]);
else if (data->high_output[j] < data->low_output[j])
inten = (double) (data->low_output[j] - inten *
(data->low_output[j] - data->high_output[j]));
inten /= 255.0;
}
return inten;
}
void
levels_lut_setup(GimpLut *lut, double *gamma, int *low_input, int *high_input,
int *low_output, int *high_output, int nchannels)
{
levels_struct data;
data.gamma = gamma;
data.low_input = low_input;
data.high_input = high_input;
data.low_output = low_output;
data.high_output = high_output;
gimp_lut_setup(lut, (GimpLutFunc) levels_lut_func,
(void *) &data, nchannels);
}
GimpLut *
levels_lut_new(double *gamma, int *low_input, int *high_input,
int *low_output, int *high_output, int nchannels)
{
GimpLut *lut;
lut = gimp_lut_new();
levels_lut_setup(lut, gamma, low_input, high_input,
low_output, high_output, nchannels);
return lut;
}
/* --------------- posterize ---------------- */
static float
posterize_lut_func(int *ilevels,
int nchannels, int channel, float value)
{
int levels;
/* don't posterize the alpha channel */
if ((nchannels == 2 || nchannels == 4) && channel == nchannels -1)
return value;
if (*ilevels < 2)
levels = 2;
else
levels = *ilevels;
value = RINT(value * (levels - 1.0)) / (levels - 1.0);
return value;
}
void
posterize_lut_setup(GimpLut *lut, int levels, int nchannels)
{
gimp_lut_setup_exact(lut, (GimpLutFunc) posterize_lut_func,
(void *) &levels , nchannels);
}
GimpLut *
posterize_lut_new(int levels, int nchannels)
{
GimpLut *lut;
lut = gimp_lut_new();
posterize_lut_setup(lut, levels, nchannels);
return lut;
}
/* --------------- equalize ------------- */
struct hist_lut_struct
{
GimpHistogram *histogram;
int part[5][257];
};
static float
equalize_lut_func(struct hist_lut_struct *hlut,
int nchannels, int channel, float value)
{
int i = 0, j;
j = (int)(value * 255.0 + 0.5);
while (hlut->part[channel][i + 1] <= j)
i++;
return i / 255.0;
}
void
eq_histogram_lut_setup (GimpLut *lut, GimpHistogram *hist, int bytes)
{
int i, k, j;
struct hist_lut_struct hlut;
double pixels_per_value;
double desired;
double sum, dif;
/* Find partition points */
pixels_per_value = gimp_histogram_get_count(hist, 0, 255) / 256.0;
for (k = 0; k < bytes; k++)
{
/* First and last points in partition */
hlut.part[k][0] = 0;
hlut.part[k][256] = 256;
/* Find intermediate points */
j = 0;
sum = gimp_histogram_get_channel(hist, k, 0) +
gimp_histogram_get_channel(hist, k, 1);
for (i = 1; i < 256; i++)
{
desired = i * pixels_per_value;
while (sum <= desired)
{
j++;
sum += gimp_histogram_get_channel(hist, k, j + 1);
}
/* Nearest sum */
dif = sum - gimp_histogram_get_channel(hist, k, j);
if ((sum - desired) > (dif / 2.0))
hlut.part[k][i] = j;
else
hlut.part[k][i] = j + 1;
}
}
gimp_lut_setup(lut, (GimpLutFunc) equalize_lut_func,
(void *) &hlut, bytes);
}
GimpLut *
eq_histogram_lut_new(GimpHistogram *h, int nchannels)
{
GimpLut *lut;
lut = gimp_lut_new();
eq_histogram_lut_setup(lut, h, nchannels);
return lut;
}

View File

@@ -1,70 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __LUT_FUNCS_H__
#define __LUT_FUNCS_H__
typedef enum
{
VALUE_LUT,
RED_LUT,
GREEN_LUT,
BLUE_LUT,
ALPHA_LUT,
GRAY_LUT = 0 /*< skip >*/
} ChannelLutType;
/* brightness contrast */
void brightness_contrast_lut_setup (GimpLut *lut,
double brightness, double contrast,
int nchannels);
GimpLut *brightness_contrast_lut_new (double brightness, double contrast,
int nchannels);
/* invert */
void invert_lut_setup (GimpLut *lut, int nchannels);
GimpLut *invert_lut_new (int nchannels);
/* add (or subtract) */
void add_lut_setup (GimpLut *lut, double ammount, int nchannels);
GimpLut *add_lut_new (double ammount, int nchannels);
/* intersect (MIN (pixel, value)) */
void intersect_lut_setup (GimpLut *lut, double value, int nchannels);
GimpLut *intersect_lut_new (double value, int nchannels);
/* threshold */
void threshold_lut_setup (GimpLut *lut, double value, int nchannels);
GimpLut *threshold_lut_new (double value, int nchannels);
/* levels */
void levels_lut_setup (GimpLut *lut, double *gamma,
int *low_input, int *high_input,
int *low_output, int *high_output, int nchannels);
GimpLut *levels_lut_new (double *gamma, int *low_input, int *high_input,
int *low_output, int *high_output, int nchannels);
/* posterize */
void posterize_lut_setup (GimpLut *lut, int levels, int nchannels);
GimpLut *posterize_lut_new (int levels, int nchannels);
/* equalize histogram */
void eq_histogram_lut_setup (GimpLut *lut, GimpHistogram *hist, int bytes);
GimpLut *eq_histogram_lut_new (GimpHistogram *h, int nchannels);
#endif /* __LUT_FUNCS_H__ */

View File

@@ -1,384 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* pixel_processor.c: Copyright (C) 1999 Jay Cox <jaycox@earthlink.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include "pixel_processor.h"
#include "pixel_region.h"
#include "pixel_regionP.h"
#include "gimprc.h"
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#ifdef ENABLE_MP
#include <pthread.h>
#define IF_THREAD(statement) statement
#else /* !ENABLE_MP */
#define IF_THREAD(statement)
#endif /* ENABLE_MP */
typedef void (*p1_func)(void *, PixelRegion *);
typedef void (*p2_func)(void *, PixelRegion * ,PixelRegion *);
typedef void (*p3_func)(void *, PixelRegion * ,PixelRegion *, PixelRegion *);
typedef void (*p4_func)(void *, PixelRegion * ,PixelRegion *, PixelRegion *,
PixelRegion *);
struct _PixelProcessor
{
void *data;
p_func f;
PixelRegionIterator *PRI;
IF_THREAD(pthread_mutex_t mutex;)
int nthreads;
int n_regions;
PixelRegion *r[4];
void *progress_report_data;
ProgressReportFunc progress_report_func;
};
IF_THREAD(
static void *
do_parallel_regions (PixelProcessor *p_s)
{
PixelRegion tr[4];
int ntiles = 0;
int i;
int cont = 1;
pthread_mutex_lock(&p_s->mutex);
if (p_s->nthreads != 0 && p_s->PRI)
p_s->PRI = (PixelRegionIterator*)pixel_regions_process(p_s->PRI);
if (p_s->PRI == NULL)
{
pthread_mutex_unlock(&p_s->mutex);
return NULL;
}
p_s->nthreads++;
do
{
for (i = 0; i < p_s->n_regions; i++)
if (p_s->r[i])
{
memcpy(&tr[i], p_s->r[i], sizeof(PixelRegion));
if (tr[i].tiles)
tile_lock(tr[i].curtile);
}
pthread_mutex_unlock(&p_s->mutex);
ntiles++;
switch(p_s->n_regions)
{
case 1:
((p1_func)p_s->f)(p_s->data,
p_s->r[0] ? &tr[0] : NULL);
break;
case 2:
((p2_func)p_s->f)(p_s->data,
p_s->r[0] ? &tr[0] : NULL,
p_s->r[1] ? &tr[1] : NULL);
break;
case 3:
((p3_func)p_s->f)(p_s->data,
p_s->r[0] ? &tr[0] : NULL,
p_s->r[1] ? &tr[1] : NULL,
p_s->r[2] ? &tr[2] : NULL);
break;
case 4:
((p4_func)p_s->f)(p_s->data,
p_s->r[0] ? &tr[0] : NULL,
p_s->r[1] ? &tr[1] : NULL,
p_s->r[2] ? &tr[2] : NULL,
p_s->r[3] ? &tr[3] : NULL);
break;
default:
g_message("do_parallel_regions: Bad number of regions %d\n",
p_s->n_regions);
}
pthread_mutex_lock(&p_s->mutex);
for (i = 0; i < p_s->n_regions; i++)
if (p_s->r[i])
{
if (tr[i].tiles)
tile_release(tr[i].curtile, tr[i].dirty);
}
if (p_s->progress_report_func &&
!p_s->progress_report_func(p_s->progress_report_data,
p_s->r[0]->x, p_s->r[0]->y,
p_s->r[0]->w, p_s->r[0]->h))
cont = 0;
}
while (cont && p_s->PRI &&
(p_s->PRI = (PixelRegionIterator*)pixel_regions_process(p_s->PRI)));
p_s->nthreads--;
/* fprintf(stderr, "processed %d tiles\n", ntiles); */
pthread_mutex_unlock(&p_s->mutex);
return NULL;
}
)
/* do_parallel_regions_single is just like do_parallel_regions
* except that all the mutex and tile locks have been removed
*
* If we are processing with only a single thread we don't need to do the
* mutex locks etc. and aditional tile locks even if we were
* configured --with-mp
*/
static void *
do_parallel_regions_single(PixelProcessor *p_s)
{
int cont = 1;
do
{
switch(p_s->n_regions)
{
case 1:
((p1_func)p_s->f)(p_s->data,
p_s->r[0]);
break;
case 2:
((p2_func)p_s->f)(p_s->data,
p_s->r[0],
p_s->r[1]);
break;
case 3:
((p3_func)p_s->f)(p_s->data,
p_s->r[0],
p_s->r[1],
p_s->r[2]);
break;
case 4:
((p4_func)p_s->f)(p_s->data,
p_s->r[0],
p_s->r[1],
p_s->r[2],
p_s->r[3]);
break;
default:
g_message("do_parallel_regions_single: Bad number of regions %d\n",
p_s->n_regions);
}
if (p_s->progress_report_func)
if (!p_s->progress_report_func(p_s->progress_report_data,
p_s->r[0]->x, p_s->r[0]->y,
p_s->r[0]->w, p_s->r[0]->h))
cont = 0;
} while (cont && p_s->PRI &&
(p_s->PRI = (PixelRegionIterator*)pixel_regions_process(p_s->PRI)));
return NULL;
}
#define MAX_THREADS 30
static void
pixel_regions_do_parallel(PixelProcessor *p_s)
{
IF_THREAD(
int nthreads;
nthreads = MIN(num_processors, MAX_THREADS);
/* make sure we have at least one tile per thread */
nthreads = MIN(nthreads,
(p_s->PRI->region_width * p_s->PRI->region_height)
/(TILE_WIDTH*TILE_HEIGHT));
if (nthreads > 1)
{
int i;
pthread_t threads[MAX_THREADS];
pthread_attr_t pthread_attr;
pthread_attr_init (&pthread_attr);
for (i = 0; i < nthreads; i++)
{
pthread_create (&threads[i], &pthread_attr,
(void *(*)(void *)) do_parallel_regions,
p_s);
}
for (i = 0; i < nthreads; i++)
{
int ret;
if ((ret = pthread_join(threads[i], NULL)))
{
fprintf(stderr, "pixel_regions_do_parallel:: pthread_join returned: %d\n", ret);
}
}
if (p_s->nthreads != 0)
fprintf(stderr, "pixel_regions_do_prarallel: we lost a thread\n");
}
else
)
do_parallel_regions_single(p_s);
}
static PixelProcessor *
pixel_regions_real_process_parallel(p_func f, void *data,
ProgressReportFunc report_func,
void *report_data,
int num_regions, va_list ap)
{
int i;
PixelProcessor *p_s;
p_s = g_new(PixelProcessor, 1);
for (i = 0; i < num_regions; i++)
p_s->r[i] = va_arg (ap, PixelRegion *);
switch(num_regions)
{
case 1:
p_s->PRI = (PixelRegionIterator *) pixel_regions_register(num_regions,
p_s->r[0]);
break;
case 2:
p_s->PRI = (PixelRegionIterator *) pixel_regions_register(num_regions,
p_s->r[0],
p_s->r[1]);
break;
case 3:
p_s->PRI = (PixelRegionIterator *) pixel_regions_register(num_regions,
p_s->r[0],
p_s->r[1],
p_s->r[2]);
break;
case 4:
p_s->PRI = (PixelRegionIterator *) pixel_regions_register(num_regions,
p_s->r[0],
p_s->r[1],
p_s->r[2],
p_s->r[3]);
break;
default:
g_message("pixel_regions_real_process_parallel: Bad number of regions %d\n",
p_s->n_regions);
}
if (!p_s->PRI)
{
pixel_processor_free(p_s);
return NULL;
}
/* Why would we wan't to set dirty_tiles to 0 here? */
/* IF_THREAD(p_s->PRI->dirty_tiles = 0;) */
p_s->f = f;
p_s->data = data;
p_s->n_regions = num_regions;
IF_THREAD(pthread_mutex_init(&(p_s->mutex), NULL);)
p_s->nthreads = 0;
p_s->progress_report_data = report_data;
p_s->progress_report_func = report_func;
pixel_regions_do_parallel(p_s);
if (p_s->PRI)
return p_s;
pixel_processor_free (p_s);
return NULL;
}
void
pixel_regions_process_parallel(p_func f, void *data, int num_regions, ...)
{
va_list va;
va_start (va, num_regions);
pixel_regions_real_process_parallel(f, data, NULL, NULL, num_regions, va);
va_end (va);
}
PixelProcessor *
pixel_regions_process_parallel_progress(p_func f, void *data,
ProgressReportFunc progress_func,
void *progress_data, int num_regions,
...)
{
PixelProcessor *ret;
va_list va;
va_start (va, num_regions);
ret = pixel_regions_real_process_parallel(f, data,
progress_func, progress_data,
num_regions, va);
va_end (va);
return ret;
}
void
pixel_processor_stop(PixelProcessor *pp)
{
if (!pp)
return;
if (pp->PRI)
{
pixel_regions_process_stop (pp->PRI);
pp->PRI = NULL;
}
pixel_processor_free(pp);
}
PixelProcessor *
pixel_processor_cont(PixelProcessor *pp)
{
pixel_regions_do_parallel(pp);
if (pp->PRI)
return pp;
pixel_processor_free (pp);
return NULL;
}
void
pixel_processor_free (PixelProcessor *pp)
{
if (pp->PRI)
pixel_processor_stop(pp);
else
g_free(pp);
}

View File

@@ -1,40 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* pixel_processor.h: Copyright (C) 1999 Jay Cox <jaycox@earthlink.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __PIXEL_PROCESSOR_H__
#define __PIXEL_PROCESSOR_H__
typedef struct _PixelProcessor PixelProcessor;
typedef void (*p_func)(void);
typedef int (*ProgressReportFunc)(void *, int, int, int, int);
void pixel_regions_process_parallel (p_func f, void *data, int num_regions,
...);
PixelProcessor *pixel_process_progress (p_func f, void *data,
ProgressReportFunc progress_func,
void *progress_data,
int num_regions, ...);
void pixel_processor_free (PixelProcessor *);
void pixel_processor_stop (PixelProcessor *);
PixelProcessor *pixel_processor_cont (PixelProcessor *);
#endif /* __PIXEL_PROCESSOR_H__ */

View File

@@ -1,606 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdarg.h>
#include <string.h>
#include <glib.h>
#include "apptypes.h"
#include "appenv.h"
#include "gimprc.h"
#include "pixel_region.h"
#include "pixel_regionP.h"
#include "tile_manager_pvt.h"
#include "tile.h" /* ick. */
/*********************/
/* Local Variables */
/*********************/
/* Local Functions */
static gint get_portion_width (PixelRegionIterator *PRI);
static gint get_portion_height (PixelRegionIterator *PRI);
static gpointer pixel_regions_configure (PixelRegionIterator *PRI);
static void pixel_region_configure (PixelRegionHolder *PRH,
PixelRegionIterator *PRI);
/**************************/
/* Function definitions */
void
pixel_region_init (PixelRegion *PR,
TileManager *tiles,
gint x,
gint y,
gint w,
gint h,
gboolean dirty)
{
PR->tiles = tiles;
PR->curtile = NULL;
PR->data = NULL;
PR->bytes = tiles->bpp;
PR->rowstride = PR->bytes * TILE_WIDTH;
PR->x = x;
PR->y = y;
PR->w = w;
PR->h = h;
PR->dirty = dirty;
}
void
pixel_region_resize (PixelRegion *PR,
gint x,
gint y,
gint w,
gint h)
{
/* If the data is non-null, data is contiguous--need to advance */
if (PR->data != NULL)
{
PR->data += (y - PR->y) * PR->rowstride + (x - PR->x) * PR->bytes;
}
/* update sizes for both contiguous and tiled regions */
PR->x = x;
PR->y = y;
PR->w = w;
PR->h = h;
}
/* request that tiles within a region be fetched asynchronously */
void
pixel_region_get_async (PixelRegion *PR,
gint ulx,
gint uly,
gint lrx,
gint lry)
{
gint x;
gint y;
for (y = uly; y < lry; y += TILE_HEIGHT)
for (x = ulx; x < lrx; x += TILE_WIDTH)
tile_manager_get_async (PR->tiles, x, y);
}
void
pixel_region_get_row (PixelRegion *PR,
gint x,
gint y,
gint w,
guchar *data,
gint subsample)
{
Tile *tile;
guchar *tile_data;
gint inc;
gint end;
gint boundary;
gint b;
gint npixels;
gint tilebpp;
end = x + w;
pixel_region_get_async (PR, x, y, end, y);
while (x < end)
{
tile = tile_manager_get_tile (PR->tiles, x, y, TRUE, FALSE);
tilebpp = tile_bpp (tile);
tile_data = tile_data_pointer (tile, x % TILE_WIDTH, y % TILE_HEIGHT);
npixels = tile_ewidth (tile) - (x % TILE_WIDTH);
if ((x + npixels) > end) /* make sure we don't write past the end */
npixels = end - x;
if (subsample == 1) /* optimize for the common case */
{
memcpy (data, tile_data, tilebpp * npixels);
data += tilebpp * npixels;
x += npixels;
}
else
{
boundary = x + npixels;
inc = subsample * tilebpp;
for ( ; x < boundary; x += subsample)
{
for (b = 0; b < tilebpp; b++)
*data++ = tile_data[b];
tile_data += inc;
}
}
tile_release (tile, FALSE);
}
}
void
pixel_region_set_row (PixelRegion *PR,
gint x,
gint y,
gint w,
guchar *data)
{
Tile *tile;
guchar *tile_data;
gint end;
gint npixels;
end = x + w;
pixel_region_get_async (PR, x, y, end, y);
while (x < end)
{
tile = tile_manager_get_tile (PR->tiles, x, y, TRUE, TRUE);
tile_data = tile_data_pointer (tile, x % TILE_WIDTH, y % TILE_HEIGHT);
npixels = tile_ewidth (tile) - (x % TILE_WIDTH);
if ((x + npixels) > end) /* make sure we don't write past the end */
npixels = end - x;
memcpy (tile_data, data, tile_bpp (tile) * npixels);
data += tile_bpp (tile) * npixels;
x += npixels;
tile_release (tile, TRUE);
}
}
void
pixel_region_get_col (PixelRegion *PR,
gint x,
gint y,
gint h,
guchar *data,
gint subsample)
{
Tile *tile;
guchar *tile_data;
gint tilebpp;
gint inc;
gint end;
gint boundary;
gint b;
end = y + h;
pixel_region_get_async (PR, x, y, x, end);
while (y < end)
{
tile = tile_manager_get_tile (PR->tiles, x, y, TRUE, FALSE);
tilebpp = tile_bpp (tile);
tile_data = tile_data_pointer (tile, x % TILE_WIDTH, y % TILE_HEIGHT);
boundary = y + (tile_eheight(tile) - (y % TILE_HEIGHT));
if (boundary > end) /* make sure we don't write past the end */
boundary = end;
inc = subsample * tilebpp * tile_ewidth (tile);
for ( ; y < boundary; y += subsample)
{
for (b = 0; b < tilebpp; b++)
*data++ = tile_data[b];
tile_data += inc;
}
tile_release (tile, FALSE);
}
}
void
pixel_region_set_col (PixelRegion *PR,
gint x,
gint y,
gint h,
guchar *data)
{
Tile *tile;
guchar *tile_data;
gint tilebpp;
gint inc;
gint end;
gint boundary;
gint b;
end = y + h;
pixel_region_get_async (PR, x, y, x, end);
while (y < end)
{
tile = tile_manager_get_tile (PR->tiles, x, y, TRUE, TRUE);
tilebpp = tile_bpp (tile);
tile_data = tile_data_pointer (tile, x % TILE_WIDTH, y % TILE_HEIGHT);
boundary = y + (tile_eheight (tile) - (y % TILE_HEIGHT));
inc = tilebpp * tile_ewidth (tile);
if (boundary > end) /* make sure we don't write past the end */
boundary = end;
for ( ; y < boundary; y++)
{
for (b = 0; b < tilebpp; b++)
tile_data[b] = *data++;
tile_data += inc;
}
tile_release (tile, TRUE);
}
}
gboolean
pixel_region_has_alpha (PixelRegion *PR)
{
if (PR->bytes == 2 || PR->bytes == 4)
return TRUE;
else
return FALSE;
}
gpointer
pixel_regions_register (gint num_regions,
...)
{
PixelRegion *PR;
PixelRegionHolder *PRH;
PixelRegionIterator *PRI;
gboolean found;
va_list ap;
PRI = (PixelRegionIterator *) g_malloc (sizeof (PixelRegionIterator));
PRI->pixel_regions = NULL;
PRI->process_count = 0;
PRI->dirty_tiles = 1;
if (num_regions < 1)
return NULL;
va_start (ap, num_regions);
found = FALSE;
while (num_regions --)
{
PR = va_arg (ap, PixelRegion *);
PRH = (PixelRegionHolder *) g_malloc (sizeof (PixelRegionHolder));
PRH->PR = PR;
if (PR != NULL)
{
/* If there is a defined value for data, make sure tiles is NULL */
if (PR->data)
PR->tiles = NULL;
PRH->original_data = PR->data;
PRH->startx = PR->x;
PRH->starty = PR->y;
PRH->PR->process_count = 0;
if (!found)
{
found = TRUE;
PRI->region_width = PR->w;
PRI->region_height = PR->h;
}
}
/* Add the pixel region holder to the list */
PRI->pixel_regions = g_slist_prepend (PRI->pixel_regions, PRH);
}
va_end (ap);
return pixel_regions_configure (PRI);
}
gpointer
pixel_regions_process (gpointer PRI_ptr)
{
GSList *list;
PixelRegionHolder *PRH;
PixelRegionIterator *PRI;
PRI = (PixelRegionIterator *) PRI_ptr;
PRI->process_count++;
/* Unref all referenced tiles and increment the offsets */
for (list = PRI->pixel_regions; list; list = g_slist_next (list))
{
PRH = (PixelRegionHolder *) list->data;
if ((PRH->PR != NULL) && (PRH->PR->process_count != PRI->process_count))
{
/* This eliminates the possibility of incrementing the
* same region twice
*/
PRH->PR->process_count++;
/* Unref the last referenced tile if the underlying region
is a tile manager */
if (PRH->PR->tiles)
{
/* only set the dirty flag if PRH->dirty_tiles == TRUE */
tile_release (PRH->PR->curtile,
PRH->PR->dirty && PRI->dirty_tiles);
PRH->PR->curtile = NULL;
}
PRH->PR->x += PRI->portion_width;
if ((PRH->PR->x - PRH->startx) >= PRI->region_width)
{
PRH->PR->x = PRH->startx;
PRH->PR->y += PRI->portion_height;
}
}
}
return pixel_regions_configure (PRI);
}
void
pixel_regions_process_stop (gpointer PRI_ptr)
{
GSList *list;
PixelRegionHolder *PRH;
PixelRegionIterator *PRI;
PRI = (PixelRegionIterator *) PRI_ptr;
PRI->process_count++;
/* Unref all referenced tiles and increment the offsets */
for (list = PRI->pixel_regions; list; list = g_slist_next (list))
{
PRH = (PixelRegionHolder *) list->data;
if ((PRH->PR != NULL) && (PRH->PR->process_count != PRI->process_count))
{
/* This eliminates the possibility of incrementing the
* same region twice
*/
PRH->PR->process_count++;
/* Unref the last referenced tile if the underlying region
is a tile manager */
if (PRH->PR->tiles)
{
tile_release (PRH->PR->curtile, PRH->PR->dirty);
PRH->PR->curtile = NULL;
}
}
}
if (PRI->pixel_regions)
{
for (list = PRI->pixel_regions; list; list = g_slist_next (list))
g_free (list->data);
g_slist_free (PRI->pixel_regions);
g_free (PRI);
}
}
/*********************************/
/* Static Function Definitions */
static gint
get_portion_height (PixelRegionIterator *PRI)
{
GSList *list;
PixelRegionHolder *PRH;
gint min_height = G_MAXINT;
gint height;
/* Find the minimum height to the next vertical tile
* (in the case of a tile manager) or to the end of the
* pixel region (in the case of no tile manager)
*/
for (list = PRI->pixel_regions; list; list = g_slist_next (list))
{
PRH = (PixelRegionHolder *) list->data;
if (PRH->PR)
{
/* Check if we're past the point of no return */
if ((PRH->PR->y - PRH->starty) >= PRI->region_height)
return 0;
if (PRH->PR->tiles)
{
height = TILE_HEIGHT - (PRH->PR->y % TILE_HEIGHT);
height = CLAMP (height,
0,
(PRI->region_height - (PRH->PR->y - PRH->starty)));
}
else
height = (PRI->region_height - (PRH->PR->y - PRH->starty));
if (height < min_height)
min_height = height;
}
}
return min_height;
}
static gint
get_portion_width (PixelRegionIterator *PRI)
{
GSList *list;
PixelRegionHolder *PRH;
gint min_width = G_MAXINT;
gint width;
/* Find the minimum width to the next vertical tile
* (in the case of a tile manager) or to the end of
* the pixel region (in the case of no tile manager)
*/
for (list = PRI->pixel_regions; list; list = g_slist_next (list))
{
PRH = (PixelRegionHolder *) list->data;
if (PRH->PR)
{
/* Check if we're past the point of no return */
if ((PRH->PR->x - PRH->startx) >= PRI->region_width)
return 0;
if (PRH->PR->tiles)
{
width = TILE_WIDTH - (PRH->PR->x % TILE_WIDTH);
width = CLAMP (width,
0,
(PRI->region_width - (PRH->PR->x - PRH->startx)));
}
else
width = (PRI->region_width - (PRH->PR->x - PRH->startx));
if (width < min_width)
min_width = width;
}
}
return min_width;
}
static gpointer
pixel_regions_configure (PixelRegionIterator *PRI)
{
PixelRegionHolder *PRH;
GSList *list;
/* Determine the portion width and height */
PRI->portion_width = get_portion_width (PRI);
PRI->portion_height = get_portion_height (PRI);
if (PRI->portion_width == 0 || PRI->portion_height == 0)
{
/* free the pixel regions list */
if (PRI->pixel_regions)
{
for (list = PRI->pixel_regions; list; list = g_slist_next (list))
g_free (list->data);
g_slist_free (PRI->pixel_regions);
g_free (PRI);
}
return NULL;
}
PRI->process_count++;
for (list = PRI->pixel_regions; list; list = g_slist_next (list))
{
PRH = (PixelRegionHolder *) list->data;
if ((PRH->PR != NULL) && (PRH->PR->process_count != PRI->process_count))
{
PRH->PR->process_count++;
pixel_region_configure (PRH, PRI);
}
}
return PRI;
}
static void
pixel_region_configure (PixelRegionHolder *PRH,
PixelRegionIterator *PRI)
{
/* Configure the rowstride and data pointer for the pixel region
* based on the current offsets into the region and whether the
* region is represented by a tile manager or not
*/
if (PRH->PR->tiles)
{
PRH->PR->curtile = tile_manager_get_tile (PRH->PR->tiles,
PRH->PR->x,
PRH->PR->y,
TRUE,
PRH->PR->dirty);
PRH->PR->offx = PRH->PR->x % TILE_WIDTH;
PRH->PR->offy = PRH->PR->y % TILE_HEIGHT;
PRH->PR->rowstride = tile_ewidth (PRH->PR->curtile) * PRH->PR->bytes;
PRH->PR->data = tile_data_pointer (PRH->PR->curtile,
PRH->PR->offx,
PRH->PR->offy);
}
else
{
PRH->PR->data = PRH->original_data +
(PRH->PR->y - PRH->starty) * PRH->PR->rowstride +
(PRH->PR->x - PRH->startx) * PRH->PR->bytes;
}
PRH->PR->w = PRI->portion_width;
PRH->PR->h = PRI->portion_height;
}

View File

@@ -1,92 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __PIXEL_REGION_H__
#define __PIXEL_REGION_H__
#include "tile_manager.h"
#include "pixel_processor.h" /* this is temporary, */
typedef struct _PixelRegion PixelRegion;
struct _PixelRegion
{
guchar *data; /* pointer to region data */
TileManager *tiles; /* pointer to tiles */
Tile *curtile; /* current tile */
gint offx; /* tile offsets */
gint offy; /* tile offsets */
gint rowstride; /* bytes per pixel row */
gint x; /* origin */
gint y; /* origin */
gint w; /* width of region */
gint h; /* height of region */
gint bytes; /* bytes per pixel */
gboolean dirty; /* will this region be dirtied? */
gint process_count; /* used internally */
};
/* PixelRegion functions */
void pixel_region_init (PixelRegion *PR,
TileManager *tiles,
gint x,
gint y,
gint w,
gint h,
gboolean dirty);
void pixel_region_resize (PixelRegion *PR,
gint x,
gint y,
gint w,
gint h);
void pixel_region_get_async (PixelRegion *PR,
gint ulx,
gint uly,
gint lrx,
gint lry);
void pixel_region_get_row (PixelRegion *PR,
gint x,
gint y,
gint w,
guchar *data,
gint subsample);
void pixel_region_set_row (PixelRegion *PR,
gint x,
gint y,
gint w,
guchar *data);
void pixel_region_get_col (PixelRegion *PR,
gint x,
gint y,
gint h,
guchar *data,
gint subsample);
void pixel_region_set_col (PixelRegion *PR,
gint x,
gint y,
gint h,
guchar *data);
gboolean pixel_region_has_alpha (PixelRegion *PR);
gpointer pixel_regions_register (gint num_regions,
...);
gpointer pixel_regions_process (gpointer PRI_ptr);
void pixel_regions_process_stop (gpointer PRI_ptr);
#endif /* __PIXEL_REGION_H__ */

View File

@@ -1,592 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <glib.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef G_OS_WIN32
#include <process.h> /* For _getpid() */
#endif
#include "apptypes.h"
#include "appenv.h"
#include "drawable.h"
#include "gdisplay.h"
#include "gimprc.h"
#include "paint_funcs.h"
#include "temp_buf.h"
#include "libgimp/gimpcolorspace.h"
static guchar * temp_buf_allocate (guint);
static void temp_buf_to_color (TempBuf *, TempBuf *);
static void temp_buf_to_gray (TempBuf *, TempBuf *);
/* Memory management */
static guchar *
temp_buf_allocate (guint size)
{
guchar *data;
data = g_new (guchar, size);
return data;
}
/* The conversion routines */
static void
temp_buf_to_color (TempBuf *src_buf,
TempBuf *dest_buf)
{
guchar *src;
guchar *dest;
long num_bytes;
src = temp_buf_data (src_buf);
dest = temp_buf_data (dest_buf);
num_bytes = src_buf->width * src_buf->height;
while (num_bytes--)
{
guchar tmpch;
*dest++ = *src++; /* alpha channel */
*dest++ = tmpch = *src++;
*dest++ = tmpch;
*dest++ = tmpch;
}
}
static void
temp_buf_to_gray (TempBuf *src_buf,
TempBuf *dest_buf)
{
guchar *src;
guchar *dest;
long num_bytes;
float pix;
src = temp_buf_data (src_buf);
dest = temp_buf_data (dest_buf);
num_bytes = src_buf->width * src_buf->height;
while (num_bytes--)
{
*dest++ = *src++; /* alpha channel */
pix = INTENSITY (*src++, *src++, *src++);
*dest++ = (guchar) pix;
}
}
TempBuf *
temp_buf_new (gint width,
gint height,
gint bytes,
gint x,
gint y,
guchar *col)
{
long i;
int j;
guchar *data;
TempBuf *temp;
temp = g_new (TempBuf, 1);
temp->width = width;
temp->height = height;
temp->bytes = bytes;
temp->x = x;
temp->y = y;
temp->swapped = FALSE;
temp->filename = NULL;
temp->data = data = temp_buf_allocate (width * height * bytes);
/* initialize the data */
if (col)
{
/* First check if we can save a lot of work */
if (bytes == 1)
{
memset (data, *col, width * height);
}
else if ((bytes == 3) && (col[1] == *col) && (*col == col[2]))
{
memset (data, *col, width * height * 3);
}
else if ((bytes == 4) && (col[1] == *col) && (*col == col[2]) && (col[2] == col[3]))
{
memset (data, *col, (width * height) << 2);
}
else
{
/* No, we cannot */
guchar * dptr;
/* Fill the first row */
dptr = data;
for (i = width - 1; i >= 0; --i)
{
guchar * init;
j = bytes;
init = col;
while (j--)
*dptr++ = *init++;
}
/* Now copy from it (we set bytes to bytesperrow now) */
bytes *= width;
while (--height)
{
memcpy (dptr, data, bytes);
dptr += bytes;
}
}
}
return temp;
}
TempBuf *
temp_buf_copy (TempBuf *src,
TempBuf *dest)
{
TempBuf * new;
long length;
if (!src)
{
g_message ("trying to copy a temp buf which is NULL.");
return dest;
}
if (!dest)
new = temp_buf_new (src->width, src->height, src->bytes, 0, 0, NULL);
else
{
new = dest;
if (dest->width != src->width || dest->height != src->height)
g_message ("In temp_buf_copy, the widths or heights don't match.");
/* The temp buf is smart, and can translate between color and gray */
/* (only necessary if not we allocated it */
if (src->bytes != new->bytes)
{
if (src->bytes == 4) /* RGB color */
temp_buf_to_gray (src, new);
else if (src->bytes == 2) /* grayscale */
temp_buf_to_color (src, new);
else
g_message ("Cannot convert from indexed color.");
return new;
}
}
/* make the copy */
length = src->width * src->height * src->bytes;
memcpy (temp_buf_data (new), temp_buf_data (src), length);
return new;
}
TempBuf *
temp_buf_resize (TempBuf *buf,
gint bytes,
gint x,
gint y,
gint w,
gint h)
{
gint size;
/* calculate the requested size */
size = w * h * bytes;
/* First, configure the canvas buffer */
if (!buf)
buf = temp_buf_new (w, h, bytes, x, y, NULL);
else
{
if (size != (buf->width * buf->height * buf->bytes))
{
/* Make sure the temp buf is unswapped */
temp_buf_unswap (buf);
/* Reallocate the data for it */
buf->data = g_realloc (buf->data, size);
}
/* Make sure the temp buf fields are valid */
buf->x = x;
buf->y = y;
buf->width = w;
buf->height = h;
buf->bytes = bytes;
}
return buf;
}
TempBuf *
temp_buf_copy_area (TempBuf *src,
TempBuf *dest,
gint x,
gint y,
gint w,
gint h,
gint border)
{
TempBuf * new;
PixelRegion srcR, destR;
guchar empty[MAX_CHANNELS] = { 0, 0, 0, 0 };
gint x1, y1, x2, y2;
if (!src)
{
g_message ("trying to copy a temp buf which is NULL.");
return dest;
}
/* some bounds checking */
x1 = CLAMP (x, 0, src->width);
y1 = CLAMP (y, 0, src->height);
x2 = CLAMP (x + w, 0, src->width);
y2 = CLAMP (y + h, 0, src->height);
if (!(x2 - x1) || !(y2 - y1))
return dest;
x = x1 - border;
y = y1 - border;
w = (x2 - x1) + border * 2;
h = (y2 - y1) + border * 2;
if (!dest)
new = temp_buf_new (w, h, src->bytes, x, y, empty);
else
{
new = dest;
if (dest->bytes != src->bytes)
g_message ("In temp_buf_copy_area, the widths or heights or bytes don't match.");
}
/* Set the offsets for the dest */
new->x = src->x + x;
new->y = src->y + y;
/* Copy the region */
srcR.bytes = src->bytes;
srcR.w = (x2 - x1);
srcR.h = (y2 - y1);
srcR.rowstride = src->bytes * src->width;
srcR.data = temp_buf_data (src) + y1 * srcR.rowstride + x1 * srcR.bytes;
destR.rowstride = new->bytes * new->width;
destR.data = temp_buf_data (new) + (y1 - y) * destR.rowstride + (x1 - x) * srcR.bytes;
copy_region (&srcR, &destR);
return new;
}
void
temp_buf_free (TempBuf *temp_buf)
{
if (temp_buf->data)
g_free (temp_buf->data);
if (temp_buf->swapped)
temp_buf_swap_free (temp_buf);
g_free (temp_buf);
}
guchar *
temp_buf_data (TempBuf *temp_buf)
{
if (temp_buf->swapped)
temp_buf_unswap (temp_buf);
return temp_buf->data;
}
/******************************************************************
* Mask buffer functions *
******************************************************************/
MaskBuf *
mask_buf_new (gint width,
gint height)
{
static guchar empty = 0;
return (temp_buf_new (width, height, 1, 0, 0, &empty));
}
void
mask_buf_free (MaskBuf *mask)
{
temp_buf_free ((TempBuf *) mask);
}
guchar *
mask_buf_data (MaskBuf *mask_buf)
{
if (mask_buf->swapped)
temp_buf_unswap (mask_buf);
return mask_buf->data;
}
/******************************************************************
* temp buffer disk caching functions *
******************************************************************/
/* NOTES:
* Disk caching is setup as follows:
* On a call to temp_buf_swap, the TempBuf parameter is stored
* in a temporary variable called cached_in_memory.
* On the next call to temp_buf_swap, if cached_in_memory is non-null,
* cached_in_memory is moved to disk, and the latest TempBuf parameter
* is stored in cached_in_memory. This method keeps the latest TempBuf
* structure in memory instead of moving it directly to disk as requested.
* On a call to temp_buf_unswap, if cached_in_memory is non-null, it is
* compared against the requested TempBuf. If they are the same, nothing
* must be moved in from disk since it still resides in memory. However,
* if the two pointers are different, the requested TempBuf is retrieved
* from disk. In the former case, cached_in_memory is set to NULL;
* in the latter case, cached_in_memory is left unchanged.
* If temp_buf_swap_free is called, cached_in_memory must be checked
* against the temp buf being freed. If they are the same, then
* cached_in_memory must be set to NULL;
*
* In the case where memory usage is set to "stingy":
* temp bufs are not cached in memory at all, they go right to disk.
*/
/* a static counter for generating unique filenames */
static gint swap_index = 0;
/* a static pointer which keeps track of the last request for a swapped buffer */
static TempBuf * cached_in_memory = NULL;
static gchar *
generate_unique_filename (void)
{
pid_t pid;
pid = getpid ();
return g_strdup_printf ("%s" G_DIR_SEPARATOR_S "gimp%d.%d",
temp_path, (int) pid, swap_index++);
}
void
temp_buf_swap (TempBuf *buf)
{
TempBuf * swap;
gchar * filename;
struct stat stat_buf;
gint err;
FILE * fp;
if (!buf || buf->swapped)
return;
/* Set the swapped flag */
buf->swapped = TRUE;
if (stingy_memory_use)
swap = buf;
else
{
swap = cached_in_memory;
cached_in_memory = buf;
}
/* For the case where there is no temp buf ready to be moved to disk, return */
if (!swap)
return;
/* Get a unique filename for caching the data to a UNIX file */
filename = generate_unique_filename ();
/* Check if generated filename is valid */
err = stat (filename, &stat_buf);
if (!err)
{
if (stat_buf.st_mode & S_IFDIR)
{
g_message ("Error in temp buf caching: \"%s\" is a directory (cannot overwrite)", filename);
g_free (filename);
return;
}
}
/* Open file for overwrite */
if ((fp = fopen (filename, "wb")))
{
size_t blocks_written;
blocks_written = fwrite (swap->data, swap->width * swap->height * swap->bytes, 1, fp);
/* Check whether all bytes were written and fclose() was able to flush its buffers */
if ((0 != fclose (fp)) || (1 != blocks_written))
{
(void) unlink (filename);
perror ("Write error on temp buf");
g_message ("Cannot write \"%s\"", filename);
g_free (filename);
return;
}
}
else
{
(void) unlink (filename);
perror ("Error in temp buf caching");
g_message ("Cannot write \"%s\"", filename);
g_free (filename);
return;
}
/* Finally, free the buffer's data */
g_free (swap->data);
swap->data = NULL;
swap->filename = filename;
}
void
temp_buf_unswap (TempBuf *buf)
{
struct stat stat_buf;
FILE * fp;
gboolean succ = FALSE;
if (!buf || !buf->swapped)
return;
/* Set the swapped flag */
buf->swapped = FALSE;
/* If the requested temp buf is still in memory, simply return */
if (cached_in_memory == buf)
{
cached_in_memory = NULL;
return;
}
/* Allocate memory for the buffer's data */
buf->data = temp_buf_allocate (buf->width * buf->height * buf->bytes);
/* Find out if the filename of the swapped data is an existing file... */
/* (buf->filname HAS to be != 0 */
if (!stat (buf->filename, &stat_buf))
{
if ((fp = fopen (buf->filename, "rb")))
{
size_t blocks_read;
blocks_read = fread (buf->data, buf->width * buf->height * buf->bytes, 1, fp);
(void) fclose (fp);
if (blocks_read != 1)
perror ("Read error on temp buf");
else
succ = TRUE;
}
else
perror ("Error in temp buf caching");
/* Delete the swap file */
unlink (buf->filename);
}
if (!succ)
g_message ("Error in temp buf caching: information swapped to disk was lost!");
g_free (buf->filename); /* free filename */
buf->filename = NULL;
}
void
temp_buf_swap_free (TempBuf *buf)
{
struct stat stat_buf;
if (!buf->swapped)
return;
/* Set the swapped flag */
buf->swapped = FALSE;
/* If the requested temp buf is cached in memory... */
if (cached_in_memory == buf)
{
cached_in_memory = NULL;
return;
}
/* Find out if the filename of the swapped data is an existing file... */
if (!stat (buf->filename, &stat_buf))
{
/* Delete the swap file */
unlink (buf->filename);
}
else
g_message ("Error in temp buf disk swapping: information swapped to disk was lost!");
if (buf->filename)
g_free (buf->filename); /* free filename */
buf->filename = NULL;
}
void
swapping_free (void)
{
if (cached_in_memory)
temp_buf_free (cached_in_memory);
}

View File

@@ -1,65 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __TEMP_BUF_H__
#define __TEMP_BUF_H__
typedef struct _TempBuf TempBuf;
typedef struct _TempBuf MaskBuf;
struct _TempBuf
{
gint bytes; /* The necessary info */
gint width;
gint height;
gint x, y; /* origin of data source */
gboolean swapped; /* flag indicating whether buf is cached to disk */
gchar *filename; /* filename of cached information */
guchar *data; /* The data buffer */
};
/* The temp buffer functions */
TempBuf * temp_buf_new (gint, gint, gint, gint, gint, guchar *);
TempBuf * temp_buf_copy (TempBuf *, TempBuf *);
TempBuf * temp_buf_resize (TempBuf *, gint, gint, gint, gint, gint);
TempBuf * temp_buf_copy_area (TempBuf *, TempBuf *,
gint, gint, gint, gint, gint);
void temp_buf_free (TempBuf *);
guchar * temp_buf_data (TempBuf *);
/* The mask buffer functions */
MaskBuf * mask_buf_new (gint, gint);
void mask_buf_free (MaskBuf *);
guchar * mask_buf_data (MaskBuf *);
/* The disk caching functions */
void temp_buf_swap (TempBuf *);
void temp_buf_unswap (TempBuf *);
void temp_buf_swap_free (TempBuf *);
/* Called by app_procs:exit() to free up the cached undo buffer */
void swapping_free (void);
#endif /* __TEMP_BUF_H__ */

View File

@@ -1,557 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <glib.h>
#include "apptypes.h"
#include "appenv.h"
#include "drawable.h"
#include "gdisplay.h"
#include "gimpui.h"
#include "threshold.h"
#include "libgimp/gimpintl.h"
#define HISTOGRAM_WIDTH 256
#define HISTOGRAM_HEIGHT 150
#define LOW 0x1
#define HIGH 0x2
#define HISTORGAM 0x4
#define ALL (LOW | HIGH | HISTOGRAM)
/* the threshold structures */
typedef struct _Threshold Threshold;
struct _Threshold
{
gint x, y; /* coords for last mouse click */
};
/* the threshold tool options */
static ToolOptions *threshold_options = NULL;
/* the threshold tool dialog */
static ThresholdDialog *threshold_dialog = NULL;
/* threshold action functions */
static void threshold_control (Tool *, ToolAction, gpointer);
static ThresholdDialog * threshold_dialog_new (void);
static void threshold_update (ThresholdDialog *,
gint);
static void threshold_preview (ThresholdDialog *);
static void threshold_reset_callback (GtkWidget *, gpointer);
static void threshold_ok_callback (GtkWidget *, gpointer);
static void threshold_cancel_callback (GtkWidget *, gpointer);
static void threshold_preview_update (GtkWidget *, gpointer);
static void threshold_low_threshold_adjustment_update (GtkAdjustment *,
gpointer);
static void threshold_high_threshold_adjustment_update (GtkAdjustment *,
gpointer);
static void threshold (PixelRegion *, PixelRegion *, void *);
static void threshold_histogram_range (HistogramWidget *, gint, gint,
gpointer);
/* threshold machinery */
void
threshold_2 (void *data,
PixelRegion *srcPR,
PixelRegion *destPR)
{
/* this function just re-orders the arguments so we can use
* pixel_regions_process_paralell
*/
threshold (srcPR, destPR, data);
}
static void
threshold (PixelRegion *srcPR,
PixelRegion *destPR,
void *data)
{
ThresholdDialog *td;
unsigned char *src, *s;
unsigned char *dest, *d;
int has_alpha, alpha;
int w, h, b;
int value;
td = (ThresholdDialog *) data;
h = srcPR->h;
src = srcPR->data;
dest = destPR->data;
has_alpha = (srcPR->bytes == 2 || srcPR->bytes == 4);
alpha = has_alpha ? srcPR->bytes - 1 : srcPR->bytes;
while (h--)
{
w = srcPR->w;
s = src;
d = dest;
while (w--)
{
if (td->color)
{
value = MAX (s[RED_PIX], s[GREEN_PIX]);
value = MAX (value, s[BLUE_PIX]);
value = (value >= td->low_threshold && value <= td->high_threshold ) ? 255 : 0;
}
else
value = (s[GRAY_PIX] >= td->low_threshold && s[GRAY_PIX] <= td->high_threshold) ? 255 : 0;
for (b = 0; b < alpha; b++)
d[b] = value;
if (has_alpha)
d[alpha] = s[alpha];
s += srcPR->bytes;
d += destPR->bytes;
}
src += srcPR->rowstride;
dest += destPR->rowstride;
}
}
/* threshold action functions */
static void
threshold_control (Tool *tool,
ToolAction action,
gpointer gdisp_ptr)
{
switch (action)
{
case PAUSE:
break;
case RESUME:
break;
case HALT:
threshold_dialog_hide ();
break;
default:
break;
}
}
Tool *
tools_new_threshold (void)
{
Tool * tool;
Threshold * private;
/* The tool options */
if (! threshold_options)
{
threshold_options = tool_options_new (_("Threshold"));
tools_register (THRESHOLD, threshold_options);
}
tool = tools_new_tool (THRESHOLD);
private = g_new0 (Threshold, 1);
tool->scroll_lock = TRUE; /* Disallow scrolling */
tool->preserve = FALSE; /* Don't preserve on drawable change */
tool->private = (void *) private;
tool->control_func = threshold_control;
return tool;
}
void
threshold_dialog_hide (void)
{
if (threshold_dialog)
threshold_cancel_callback (NULL, (gpointer) threshold_dialog);
}
void
tools_free_threshold (Tool *tool)
{
Threshold * thresh;
thresh = (Threshold *) tool->private;
/* Close the threshold dialog */
threshold_dialog_hide ();
g_free (thresh);
}
void
threshold_initialize (GDisplay *gdisp)
{
if (drawable_indexed (gimage_active_drawable (gdisp->gimage)))
{
g_message (_("Threshold does not operate on indexed drawables."));
return;
}
/* The threshold dialog */
if (!threshold_dialog)
threshold_dialog = threshold_dialog_new ();
else
if (!GTK_WIDGET_VISIBLE (threshold_dialog->shell))
gtk_widget_show (threshold_dialog->shell);
threshold_dialog->low_threshold = 127;
threshold_dialog->high_threshold = 255;
threshold_dialog->drawable = gimage_active_drawable (gdisp->gimage);
threshold_dialog->color = drawable_color (threshold_dialog->drawable);
threshold_dialog->image_map =
image_map_create (gdisp, threshold_dialog->drawable);
gimp_histogram_calculate_drawable (threshold_dialog->hist,
threshold_dialog->drawable);
gtk_signal_handler_block_by_data (GTK_OBJECT (threshold_dialog->histogram),
threshold_dialog);
histogram_widget_update (threshold_dialog->histogram,
threshold_dialog->hist);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (threshold_dialog->histogram),
threshold_dialog);
threshold_update (threshold_dialog, ALL);
if (threshold_dialog->preview)
threshold_preview (threshold_dialog);
}
/**********************/
/* Threshold dialog */
/**********************/
static ThresholdDialog *
threshold_dialog_new (void)
{
ThresholdDialog *td;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *spinbutton;
GtkWidget *label;
GtkWidget *frame;
GtkWidget *toggle;
GtkObject *data;
td = g_new (ThresholdDialog, 1);
td->preview = TRUE;
td->low_threshold = 127;
td->high_threshold = 255;
td->hist = gimp_histogram_new ();
/* The shell and main vbox */
td->shell =
gimp_dialog_new (_("Threshold"), "threshold",
tools_help_func, NULL,
GTK_WIN_POS_NONE,
FALSE, TRUE, FALSE,
_("OK"), threshold_ok_callback,
td, NULL, NULL, TRUE, FALSE,
_("Reset"), threshold_reset_callback,
td, NULL, NULL, TRUE, FALSE,
_("Cancel"), threshold_cancel_callback,
td, NULL, NULL, FALSE, TRUE,
NULL);
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (td->shell)->vbox), vbox);
/* Horizontal box for threshold text widget */
hbox = gtk_hbox_new (FALSE, 4);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
label = gtk_label_new (_("Threshold Range:"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
/* low threshold spinbutton */
data = gtk_adjustment_new (td->low_threshold, 0.0, 255.0, 1.0, 10.0, 0.0);
td->low_threshold_data = GTK_ADJUSTMENT (data);
spinbutton = gtk_spin_button_new (td->low_threshold_data, 1.0, 0);
gtk_widget_set_usize (spinbutton, 75, -1);
gtk_box_pack_start (GTK_BOX (hbox), spinbutton, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (td->low_threshold_data), "value_changed",
GTK_SIGNAL_FUNC (threshold_low_threshold_adjustment_update),
td);
gtk_widget_show (spinbutton);
/* high threshold spinbutton */
data = gtk_adjustment_new (td->high_threshold, 0.0, 255.0, 1.0, 10.0, 0.0);
td->high_threshold_data = GTK_ADJUSTMENT (data);
spinbutton = gtk_spin_button_new (td->high_threshold_data, 1.0, 0);
gtk_widget_set_usize (spinbutton, 75, -1);
gtk_box_pack_start (GTK_BOX (hbox), spinbutton, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (td->high_threshold_data), "value_changed",
GTK_SIGNAL_FUNC (threshold_high_threshold_adjustment_update),
td);
gtk_widget_show (spinbutton);
gtk_widget_show (hbox);
/* The threshold histogram */
hbox = gtk_hbox_new (TRUE, 0);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, FALSE, 0);
td->histogram = histogram_widget_new (HISTOGRAM_WIDTH, HISTOGRAM_HEIGHT);
gtk_container_add (GTK_CONTAINER (frame), GTK_WIDGET (td->histogram));
gtk_signal_connect (GTK_OBJECT (td->histogram), "range_changed",
GTK_SIGNAL_FUNC (threshold_histogram_range),
td);
gtk_widget_show (GTK_WIDGET(td->histogram));
gtk_widget_show (frame);
gtk_widget_show (hbox);
/* Horizontal box for preview */
hbox = gtk_hbox_new (FALSE, 4);
gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
/* The preview toggle */
toggle = gtk_check_button_new_with_label (_("Preview"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), td->preview);
gtk_box_pack_end (GTK_BOX (hbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (threshold_preview_update),
td);
gtk_widget_show (toggle);
gtk_widget_show (hbox);
gtk_widget_show (vbox);
gtk_widget_show (td->shell);
return td;
}
static void
threshold_update (ThresholdDialog *td,
gint update)
{
if (update & LOW)
{
gtk_adjustment_set_value (td->low_threshold_data, td->low_threshold);
}
if (update & HIGH)
{
gtk_adjustment_set_value (td->high_threshold_data, td->high_threshold);
}
if (update & HISTOGRAM)
{
histogram_widget_range (td->histogram,
td->low_threshold,
td->high_threshold);
}
}
static void
threshold_preview (ThresholdDialog *td)
{
if (!td->image_map)
{
g_warning ("threshold_preview(): No image map");
return;
}
active_tool->preserve = TRUE;
image_map_apply (td->image_map, threshold, td);
active_tool->preserve = FALSE;
}
static void
threshold_reset_callback (GtkWidget *widget,
gpointer data)
{
ThresholdDialog *td;
td = (ThresholdDialog *) data;
td->low_threshold = 127.0;
td->high_threshold = 255.0;
threshold_update (td, ALL);
if (td->preview)
threshold_preview (td);
}
static void
threshold_ok_callback (GtkWidget *widget,
gpointer data)
{
ThresholdDialog *td;
td = (ThresholdDialog *) data;
gimp_dialog_hide (td->shell);
active_tool->preserve = TRUE;
if (!td->preview)
image_map_apply (td->image_map, threshold, (void *) td);
if (td->image_map)
image_map_commit (td->image_map);
active_tool->preserve = FALSE;
td->image_map = NULL;
active_tool->gdisp_ptr = NULL;
active_tool->drawable = NULL;
}
static void
threshold_cancel_callback (GtkWidget *widget,
gpointer data)
{
ThresholdDialog *td;
td = (ThresholdDialog *) data;
gimp_dialog_hide (td->shell);
if (td->image_map)
{
active_tool->preserve = TRUE;
image_map_abort (td->image_map);
active_tool->preserve = FALSE;
td->image_map = NULL;
gdisplays_flush ();
}
active_tool->gdisp_ptr = NULL;
active_tool->drawable = NULL;
}
static void
threshold_preview_update (GtkWidget *widget,
gpointer data)
{
ThresholdDialog *td;
td = (ThresholdDialog *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
{
td->preview = TRUE;
threshold_preview (td);
}
else
{
td->preview = FALSE;
if (td->image_map)
{
active_tool->preserve = TRUE;
image_map_clear (td->image_map);
active_tool->preserve = FALSE;
gdisplays_flush ();
}
}
}
static void
threshold_low_threshold_adjustment_update (GtkAdjustment *adjustment,
gpointer data)
{
ThresholdDialog *td;
td = (ThresholdDialog *) data;
if (td->low_threshold != adjustment->value)
{
td->low_threshold = adjustment->value;
threshold_update (td, HISTOGRAM);
if (td->preview)
threshold_preview (td);
}
}
static void
threshold_high_threshold_adjustment_update (GtkAdjustment *adjustment,
gpointer data)
{
ThresholdDialog *td;
td = (ThresholdDialog *) data;
if (td->high_threshold != adjustment->value)
{
td->high_threshold = adjustment->value;
threshold_update (td, HISTOGRAM);
if (td->preview)
threshold_preview (td);
}
}
static void
threshold_histogram_range (HistogramWidget *widget,
gint start,
gint end,
gpointer data)
{
ThresholdDialog *td;
td = (ThresholdDialog *) data;
td->low_threshold = start;
td->high_threshold = end;
threshold_update (td, LOW | HIGH);
if (td->preview)
threshold_preview (td);
}

View File

@@ -1,59 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __THRESHOLD_H__
#define __THRESHOLD_H__
#include "image_map.h"
#include "histogramwidget.h"
#include "tools.h"
typedef struct _ThresholdDialog ThresholdDialog;
struct _ThresholdDialog
{
GtkWidget *shell;
GtkAdjustment *low_threshold_data;
GtkAdjustment *high_threshold_data;
HistogramWidget *histogram;
GimpHistogram *hist;
GimpDrawable *drawable;
ImageMap image_map;
gint color;
gint low_threshold;
gint high_threshold;
gboolean preview;
};
Tool * tools_new_threshold (void);
void tools_free_threshold (Tool *tool);
void threshold_dialog_hide (void);
void threshold_initialize (GDisplay *gdisp);
void threshold_2 (void *data,
PixelRegion *srcPR,
PixelRegion *destPR);
#endif /* __THRESHOLD_H__ */

View File

@@ -1,372 +0,0 @@
#include <gtk/gtkmain.h>
#include <glib.h>
#include "gimprc.h"
#include "tile.h"
#include "tile_cache.h"
#include "tile_swap.h"
#ifdef USE_PTHREADS
#include <pthread.h>
#endif
#include "tile_pvt.h" /* ick. */
#include "stdio.h"
/* This is the percentage of the maximum cache size that should be cleared
* from the cache when an eviction is necessary
*/
#define FREE_QUANTUM 0.1
static void tile_cache_init (void);
static gint tile_cache_zorch_next (void);
static void tile_cache_flush_internal (Tile *tile);
#ifdef USE_PTHREADS
static void* tile_idle_thread (void *);
#else
static gint tile_idle_preswap (gpointer);
#endif
static int initialize = TRUE;
typedef struct _TileList {
Tile* first;
Tile* last;
} TileList;
static unsigned long max_tile_size = TILE_WIDTH * TILE_HEIGHT * 4;
static unsigned long cur_cache_size = 0;
static unsigned long max_cache_size = 0;
static unsigned long cur_cache_dirty = 0;
static TileList clean_list = { NULL, NULL };
static TileList dirty_list = { NULL, NULL };
#ifdef USE_PTHREADS
static pthread_t preswap_thread;
static pthread_mutex_t dirty_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t dirty_signal = PTHREAD_COND_INITIALIZER;
static pthread_mutex_t tile_mutex = PTHREAD_MUTEX_INITIALIZER;
#define CACHE_LOCK pthread_mutex_lock(&tile_mutex)
#define CACHE_UNLOCK pthread_mutex_unlock(&tile_mutex)
#else
static gint idle_swapper = 0;
#define CACHE_LOCK /*nothing*/
#define CACHE_UNLOCK /*nothing*/
#endif
void
tile_cache_insert (Tile *tile)
{
TileList *list;
TileList *newlist;
if (initialize)
tile_cache_init ();
CACHE_LOCK;
if (tile->data == NULL) goto out;
/* First check and see if the tile is already
* in the cache. In that case we will simply place
* it at the end of the tile list to indicate that
* it was the most recently accessed tile.
*/
list = (TileList*)(tile->listhead);
newlist = (tile->dirty || tile->swap_offset == -1) ? &dirty_list : &clean_list;
/* if list is NULL, the tile is not in the cache */
if (list)
{
/* Tile is in the cache. Remove it from its current list and
put it at the tail of the proper list (clean or dirty) */
if (tile->next)
tile->next->prev = tile->prev;
else
list->last = tile->prev;
if (tile->prev)
tile->prev->next = tile->next;
else
list->first = tile->next;
tile->listhead = NULL;
if (list == &dirty_list) cur_cache_dirty -= tile_size (tile);
}
else
{
/* The tile was not in the cache. First check and see
* if there is room in the cache. If not then we'll have
* to make room first. Note: it might be the case that the
* cache is smaller than the size of a tile in which case
* it won't be possible to put it in the cache.
*/
while ((cur_cache_size + max_tile_size) > max_cache_size)
{
if (!tile_cache_zorch_next())
{
g_warning ("cache: unable to find room for a tile");
goto out;
/* goto grump;*/
}
}
/*grump:*/
/* Note the increase in the number of bytes the cache
* is referencing.
*/
cur_cache_size += tile_size (tile);
}
/* Put the tile at the end of the proper list */
tile->next = NULL;
tile->prev = newlist->last;
tile->listhead = newlist;
if (newlist->last) newlist->last->next = tile;
else newlist->first = tile;
newlist->last = tile;
/* gosgood@idt.net 1999-12-04 */
/* bytes on cur_cache_dirty miscounted in CVS 1.12: */
/* Invariant: test for selecting dirty list should be the same */
/* as counting files dirty. */
if ((tile->dirty) || ( tile->swap_offset == -1))
{
cur_cache_dirty += tile_size (tile);
if (1)
{
#ifdef USE_PTHREADS
pthread_mutex_lock(&dirty_mutex);
pthread_cond_signal(&dirty_signal);
pthread_mutex_unlock(&dirty_mutex);
#endif
}
}
out:
CACHE_UNLOCK;
}
void
tile_cache_flush (Tile *tile)
{
if (initialize)
tile_cache_init ();
CACHE_LOCK;
tile_cache_flush_internal (tile);
CACHE_UNLOCK;
}
static void
tile_cache_flush_internal (Tile *tile)
{
TileList *list;
/* Find where the tile is in the cache.
*/
list = (TileList*)(tile->listhead);
if (list)
{
/* Note the decrease in the number of bytes the cache
* is referencing.
*/
cur_cache_size -= tile_size (tile);
if (list == &dirty_list) cur_cache_dirty -= tile_size (tile);
if (tile->next)
tile->next->prev = tile->prev;
else
list->last = tile->prev;
if (tile->prev)
tile->prev->next = tile->next;
else
list->first = tile->next;
tile->listhead = NULL;
}
}
/* untested -- ADM */
void
tile_cache_set_size (unsigned long cache_size)
{
if (initialize)
tile_cache_init ();
max_cache_size = cache_size;
CACHE_LOCK;
while (cur_cache_size > max_cache_size)
{
if (!tile_cache_zorch_next ())
break;
}
CACHE_UNLOCK;
}
static void
tile_cache_init ()
{
if (initialize)
{
initialize = FALSE;
clean_list.first = clean_list.last = NULL;
dirty_list.first = dirty_list.last = NULL;
max_cache_size = tile_cache_size;
#ifdef USE_PTHREADS
pthread_create (&preswap_thread, NULL, &tile_idle_thread, NULL);
#else
idle_swapper = gtk_timeout_add (250,
(GtkFunction) tile_idle_preswap,
(gpointer) 0);
#endif
}
}
static gint
tile_cache_zorch_next ()
{
Tile *tile;
/* fprintf(stderr, "cache zorch: %u/%u\n", cur_cache_size, cur_cache_dirty);*/
if (clean_list.first) tile = clean_list.first;
else if (dirty_list.first) tile = dirty_list.first;
else return FALSE;
CACHE_UNLOCK;
TILE_MUTEX_LOCK (tile);
CACHE_LOCK;
tile_cache_flush_internal (tile);
if (tile->dirty || tile->swap_offset == -1)
{
tile_swap_out (tile);
}
if (! tile->dirty) {
g_free (tile->data);
tile->data = NULL;
TILE_MUTEX_UNLOCK (tile);
return TRUE;
}
/* unable to swap out tile for some reason */
TILE_MUTEX_UNLOCK (tile);
return FALSE;
}
#if USE_PTHREADS
static void *
tile_idle_thread (void *data)
{
Tile *tile;
TileList *list;
int count;
fprintf (stderr, "starting tile preswapper\n");
count = 0;
while (1)
{
CACHE_LOCK;
if (count > 5 || dirty_list.first == NULL)
{
CACHE_UNLOCK;
count = 0;
pthread_mutex_lock (&dirty_mutex);
pthread_cond_wait (&dirty_signal, &dirty_mutex);
pthread_mutex_unlock (&dirty_mutex);
CACHE_LOCK;
}
if ((tile = dirty_list.first))
{
CACHE_UNLOCK;
TILE_MUTEX_LOCK (tile);
CACHE_LOCK;
if (tile->dirty || tile->swap_offset == -1)
{
list = tile->listhead;
if (list == &dirty_list) cur_cache_dirty -= tile_size (tile);
if (tile->next)
tile->next->prev = tile->prev;
else
list->last = tile->prev;
if (tile->prev)
tile->prev->next = tile->next;
else
list->first = tile->next;
tile->next = NULL;
tile->prev = clean_list.last;
tile->listhead = &clean_list;
if (clean_list.last) clean_list.last->next = tile;
else clean_list.first = tile;
clean_list.last = tile;
CACHE_UNLOCK;
tile_swap_out (tile);
}
else
{
CACHE_UNLOCK;
}
TILE_MUTEX_UNLOCK (tile);
}
else
{
CACHE_UNLOCK;
}
count++;
}
}
#else
static gint
tile_idle_preswap (gpointer data)
{
Tile *tile;
if (cur_cache_dirty*2 < max_cache_size) return TRUE;
if ((tile = dirty_list.first))
{
tile_swap_out(tile);
dirty_list.first = tile->next;
if (tile->next)
tile->next->prev = NULL;
else
dirty_list.last = NULL;
tile->next = NULL;
tile->prev = clean_list.last;
tile->listhead = &clean_list;
if (clean_list.last) clean_list.last->next = tile;
else clean_list.first = tile;
clean_list.last = tile;
cur_cache_dirty -= tile_size (tile);
}
return TRUE;
}
#endif

View File

@@ -1,13 +0,0 @@
#ifndef __TILE_CACHE_H__
#define __TILE_CACHE_H__
#include "tile.h"
void tile_cache_insert (Tile *tile);
void tile_cache_flush (Tile *tile);
void tile_cache_set_size (unsigned long cache_size);
#endif /* __TILE_CACHE_H__ */

View File

@@ -1,42 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __TILE_MANAGER_PVT_H__
#define __TILE_MANAGER_PVT_H__
#include "tile.h"
struct _TileManager
{
int x, y; /* tile manager offsets */
int width; /* the width of the tiled area */
int height; /* the height of the tiled area */
int bpp; /* the bpp of each tile */
int ntile_rows; /* the number of tiles in each row */
int ntile_cols; /* the number of tiles in each columns */
Tile **tiles; /* the tiles for this level */
TileValidateProc validate_proc; /* this proc is called when an attempt to get an
* invalid tile is made.
*/
void *user_data; /* hook for hanging data off of */
};
#endif /* __TILE_MANAGER_PVT_H__ */

View File

@@ -1,554 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <string.h>
#include "tile_cache.h"
#include "tile_manager.h"
#include "tile_swap.h"
#include "tile_manager_pvt.h"
#include "tile_pvt.h" /* ick. */
static int tile_manager_get_tile_num (TileManager *tm,
int xpixel,
int ypixel);
TileManager*
tile_manager_new (int toplevel_width,
int toplevel_height,
int bpp)
{
TileManager *tm;
int width, height;
tm = g_new (TileManager, 1);
tm->user_data = NULL;
tm->validate_proc = NULL;
width = toplevel_width;
height = toplevel_height;
tm->width = width;
tm->height = height;
tm->bpp = bpp;
tm->ntile_rows = (height + TILE_HEIGHT - 1) / TILE_HEIGHT;
tm->ntile_cols = (width + TILE_WIDTH - 1) / TILE_WIDTH;
tm->tiles = NULL;
return tm;
}
void
tile_manager_destroy (TileManager *tm)
{
int ntiles;
int i;
if (tm->tiles)
{
ntiles = tm->ntile_rows * tm->ntile_cols;
for (i = 0; i < ntiles; i++)
{
TILE_MUTEX_LOCK (tm->tiles[i]);
tile_detach (tm->tiles[i], tm, i);
}
g_free (tm->tiles);
}
g_free (tm);
}
void
tile_manager_set_validate_proc (TileManager *tm,
TileValidateProc proc)
{
tm->validate_proc = proc;
}
Tile*
tile_manager_get_tile (TileManager *tm,
int xpixel,
int ypixel,
int wantread,
int wantwrite)
{
int tile_num;
tile_num = tile_manager_get_tile_num (tm, xpixel, ypixel);
if (tile_num < 0)
return NULL;
return tile_manager_get (tm, tile_num, wantread, wantwrite);
}
Tile*
tile_manager_get (TileManager *tm,
int tile_num,
int wantread,
int wantwrite)
{
Tile **tiles;
Tile **tile_ptr;
int ntiles;
int nrows, ncols;
int right_tile;
int bottom_tile;
int i, j, k;
ntiles = tm->ntile_rows * tm->ntile_cols;
if ((tile_num < 0) || (tile_num >= ntiles))
return NULL;
if (!tm->tiles)
{
tm->tiles = g_new (Tile*, ntiles);
tiles = tm->tiles;
nrows = tm->ntile_rows;
ncols = tm->ntile_cols;
right_tile = tm->width - ((ncols - 1) * TILE_WIDTH);
bottom_tile = tm->height - ((nrows - 1) * TILE_HEIGHT);
for (i = 0, k = 0; i < nrows; i++)
{
for (j = 0; j < ncols; j++, k++)
{
tiles[k] = g_new (Tile, 1);
tile_init (tiles[k], tm->bpp);
tile_attach (tiles[k], tm, k);
if (j == (ncols - 1))
tiles[k]->ewidth = right_tile;
if (i == (nrows - 1))
tiles[k]->eheight = bottom_tile;
}
}
}
tile_ptr = &tm->tiles[tile_num];
if (wantwrite && !wantread)
{
g_warning("WRITE-ONLY TILE... UNTESTED!");
}
/*
if ((*tile_ptr)->share_count &&
(*tile_ptr)->write_count)
fprintf(stderr," >> MEEPITY %d,%d << ",
(*tile_ptr)->share_count,
(*tile_ptr)->write_count
); */
if (wantread)
{
TILE_MUTEX_LOCK (*tile_ptr);
if (wantwrite)
{
if ((*tile_ptr)->share_count > 1)
{
/* Copy-on-write required */
Tile *newtile = g_new (Tile, 1);
tile_init (newtile, (*tile_ptr)->bpp);
newtile->ewidth = (*tile_ptr)->ewidth;
newtile->eheight = (*tile_ptr)->eheight;
newtile->valid = (*tile_ptr)->valid;
newtile->data = g_new (guchar, tile_size (newtile));
if (!newtile->valid)
g_warning ("Oh boy, r/w tile is invalid... we suck. Please report.");
if ((*tile_ptr)->rowhint)
{
tile_sanitize_rowhints (newtile);
i = newtile->eheight;
while (i--)
{
newtile->rowhint[i] = (*tile_ptr)->rowhint[i];
}
}
if ((*tile_ptr)->data != NULL)
{
memcpy (newtile->data, (*tile_ptr)->data, tile_size (newtile));
}
else
{
tile_lock (*tile_ptr);
memcpy (newtile->data, (*tile_ptr)->data, tile_size (newtile));
tile_release (*tile_ptr, FALSE);
}
tile_detach (*tile_ptr, tm, tile_num);
TILE_MUTEX_LOCK (newtile);
tile_attach (newtile, tm, tile_num);
*tile_ptr = newtile;
}
(*tile_ptr)->write_count++;
(*tile_ptr)->dirty = TRUE;
}
/* else
{
if ((*tile_ptr)->write_count)
fprintf(stderr,"STINK! r/o on r/w tile /%d\007 ",(*tile_ptr)->write_count);
} */
TILE_MUTEX_UNLOCK (*tile_ptr);
tile_lock (*tile_ptr);
}
return *tile_ptr;
}
void
tile_manager_get_async (TileManager *tm,
int xpixel,
int ypixel)
{
Tile *tile_ptr;
int tile_num;
tile_num = tile_manager_get_tile_num (tm, xpixel, ypixel);
if (tile_num < 0)
return;
tile_ptr = tm->tiles[tile_num];
tile_swap_in_async (tile_ptr);
}
void
tile_manager_validate (TileManager *tm,
Tile *tile)
{
tile->valid = TRUE;
if (tm->validate_proc)
(* tm->validate_proc) (tm, tile);
/* DEBUG STUFF -> if (tm->user_data)
{
fprintf(stderr,"V%p ",tm->user_data);
fprintf(stderr,"V");
}
else
{
fprintf(stderr,"v");
} */
}
void
tile_manager_invalidate_tiles (TileManager *tm,
Tile *toplevel_tile)
{
double x, y;
int row, col;
int num;
col = toplevel_tile->tlink->tile_num % tm->ntile_cols;
row = toplevel_tile->tlink->tile_num / tm->ntile_cols;
x = (col * TILE_WIDTH + toplevel_tile->ewidth / 2.0) / (double) tm->width;
y = (row * TILE_HEIGHT + toplevel_tile->eheight / 2.0) / (double) tm->height;
if (tm->tiles)
{
col = x * tm->width / TILE_WIDTH;
row = y * tm->height / TILE_HEIGHT;
num = row * tm->ntile_cols + col;
tile_invalidate (&tm->tiles[num], tm, num);
}
}
void
tile_invalidate_tile (Tile **tile_ptr, TileManager *tm,
int xpixel, int ypixel)
{
int tile_num;
tile_num = tile_manager_get_tile_num (tm, xpixel, ypixel);
if (tile_num < 0) return;
tile_invalidate (tile_ptr, tm, tile_num);
}
void
tile_invalidate (Tile **tile_ptr, TileManager *tm, int tile_num)
{
Tile *tile = *tile_ptr;
TILE_MUTEX_LOCK (tile);
if (!tile->valid)
goto leave;
if (tile->share_count > 1)
{
/* This tile is shared. Replace it with a new, invalid tile. */
Tile *newtile = g_new (Tile, 1);
tile_init (newtile, tile->bpp);
newtile->ewidth = tile->ewidth;
newtile->eheight = tile->eheight;
tile_detach (tile, tm, tile_num);
TILE_MUTEX_LOCK (newtile);
tile_attach (newtile, tm, tile_num);
tile = *tile_ptr = newtile;
}
if (tile->listhead)
tile_cache_flush (tile);
tile->valid = FALSE;
if (tile->data)
{
g_free (tile->data);
tile->data = NULL;
}
if (tile->swap_offset != -1)
{
/* If the tile is on disk, then delete its
* presence there.
*/
tile_swap_delete (tile);
}
leave:
TILE_MUTEX_UNLOCK (tile);
}
void
tile_manager_map_tile (TileManager *tm,
int xpixel,
int ypixel,
Tile *srctile)
{
int tile_row;
int tile_col;
int tile_num;
if ((xpixel < 0) || (xpixel >= tm->width) ||
(ypixel < 0) || (ypixel >= tm->height))
{
g_warning ("tile_manager_map_tile: tile co-ord out of range.");
return;
}
tile_row = ypixel / TILE_HEIGHT;
tile_col = xpixel / TILE_WIDTH;
tile_num = tile_row * tm->ntile_cols + tile_col;
tile_manager_map (tm, tile_num, srctile);
}
void
tile_manager_map (TileManager *tm,
int tile_num,
Tile *srctile)
{
Tile **tiles;
Tile **tile_ptr;
int ntiles;
int nrows, ncols;
int right_tile;
int bottom_tile;
int i, j, k;
ntiles = tm->ntile_rows * tm->ntile_cols;
if ((tile_num < 0) || (tile_num >= ntiles))
{
g_warning ("tile_manager_map: tile out of range.");
return;
}
if (!tm->tiles)
{
g_warning ("tile_manager_map: empty tile level - init'ing.");
tm->tiles = g_new (Tile*, ntiles);
tiles = tm->tiles;
nrows = tm->ntile_rows;
ncols = tm->ntile_cols;
right_tile = tm->width - ((ncols - 1) * TILE_WIDTH);
bottom_tile = tm->height - ((nrows - 1) * TILE_HEIGHT);
for (i = 0, k = 0; i < nrows; i++)
{
for (j = 0; j < ncols; j++, k++)
{
/* printf(",");fflush(stdout);*/
tiles[k] = g_new (Tile, 1);
tile_init (tiles[k], tm->bpp);
tile_attach (tiles[k], tm, k);
if (j == (ncols - 1))
tiles[k]->ewidth = right_tile;
if (i == (nrows - 1))
tiles[k]->eheight = bottom_tile;
}
}
/* g_warning ("tile_manager_map: empty tile level - done.");*/
}
tile_ptr = &tm->tiles[tile_num];
/* printf(")");fflush(stdout);*/
if (!srctile->valid)
g_warning("tile_manager_map: srctile not validated yet! please report.");
TILE_MUTEX_LOCK (*tile_ptr);
if ((*tile_ptr)->ewidth != srctile->ewidth ||
(*tile_ptr)->eheight != srctile->eheight ||
(*tile_ptr)->bpp != srctile->bpp) {
g_warning ("tile_manager_map: nonconformant map (%p -> %p)",
srctile, *tile_ptr);
}
tile_detach (*tile_ptr, tm, tile_num);
/* printf(">");fflush(stdout);*/
TILE_MUTEX_LOCK (srctile);
/* printf(" [src:%p tm:%p tn:%d] ", srctile, tm, tile_num); fflush(stdout);*/
tile_attach (srctile, tm, tile_num);
*tile_ptr = srctile;
TILE_MUTEX_UNLOCK (srctile);
/* printf("}");fflush(stdout);*/
}
static int
tile_manager_get_tile_num (TileManager *tm,
int xpixel,
int ypixel)
{
int tile_row;
int tile_col;
int tile_num;
if ((xpixel < 0) || (xpixel >= tm->width) ||
(ypixel < 0) || (ypixel >= tm->height))
return -1;
tile_row = ypixel / TILE_HEIGHT;
tile_col = xpixel / TILE_WIDTH;
tile_num = tile_row * tm->ntile_cols + tile_col;
return tile_num;
}
void
tile_manager_set_user_data (TileManager *tm,
void *user_data)
{
tm->user_data = user_data;
}
void *
tile_manager_get_user_data (TileManager *tm)
{
return tm->user_data;
}
int
tile_manager_level_width (TileManager *tm)
{
return tm->width;
}
int
tile_manager_level_height (TileManager *tm)
{
return tm->height;
}
int
tile_manager_level_bpp (TileManager *tm)
{
return tm->bpp;
}
void
tile_manager_get_tile_coordinates (TileManager *tm, Tile *tile, int *x, int *y)
{
TileLink *tl;
for (tl = tile->tlink; tl; tl = tl->next)
{
if (tl->tm == tm) break;
}
if (tl == NULL)
{
g_warning ("tile_manager_get_tile_coordinates: tile not attached to manager");
return;
}
*x = TILE_WIDTH * (tl->tile_num % tm->ntile_cols);
*y = TILE_HEIGHT * (tl->tile_num / tm->ntile_cols);
}
void
tile_manager_map_over_tile (TileManager *tm, Tile *tile, Tile *srctile)
{
TileLink *tl;
for (tl = tile->tlink; tl; tl = tl->next)
{
if (tl->tm == tm) break;
}
if (tl == NULL)
{
g_warning ("tile_manager_map_over_tile: tile not attached to manager");
return;
}
tile_manager_map (tm, tl->tile_num, srctile);
}

View File

@@ -1,120 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __TILE_MANAGER_H__
#define __TILE_MANAGER_H__
#include "tile.h"
typedef struct _TileManager TileManager;
typedef void (*TileValidateProc) (TileManager *tm,
Tile *tile);
/* Creates a new tile manager with the specified
* width for the toplevel. The toplevel sizes is
* used to compute the number of levels and there
* size. Each level is 1/2 the width and height of
* the level above it.
* The toplevel is level 0. The smallest level in the
* hierarchy is "nlevels - 1". That level will be smaller
* than TILE_WIDTH x TILE_HEIGHT
*/
TileManager* tile_manager_new (int toplevel_width,
int toplevel_height,
int bpp);
/* Destroy a tile manager and all the tiles it contains.
*/
void tile_manager_destroy (TileManager *tm);
/* Set the validate procedure for the tile manager.
* The validate procedure is called when an invalid tile
* is referenced. If the procedure is NULL, then the tile
* is set to valid and its memory is allocated, but
* not initialized.
*/
void tile_manager_set_validate_proc (TileManager *tm,
TileValidateProc proc);
/* Get a specified tile from a tile manager.
*/
Tile* tile_manager_get_tile (TileManager *tm,
int xpixel,
int ypixel,
int wantread,
int wantwrite);
/* Get a specified tile from a tile manager.
*/
Tile* tile_manager_get (TileManager *tm,
int tile_num,
int wantread,
int wantwrite);
/* Request that (if possible) the tile at x,y be swapped
* in. This is only a hint to improve performance; no guarantees.
* The tile may be swapped in or otherwise made more accessible
* if it is convenient...
*/
void tile_manager_get_async (TileManager *tm,
int xpixel,
int ypixel);
void tile_manager_map_tile (TileManager *tm,
int xpixel,
int ypixel,
Tile *srctile);
void tile_manager_map (TileManager *tm,
int time_num,
Tile *srctile);
/* Validate a tiles memory.
*/
void tile_manager_validate (TileManager *tm,
Tile *tile);
void tile_invalidate (Tile **tile_ptr, TileManager *tm, int tile_num);
void tile_invalidate_tile (Tile **tile_ptr, TileManager *tm,
int xpixel, int ypixel);
/* Given a toplevel tile, this procedure will invalidate
* (set the dirty bit) for this toplevel tile.
*/
void tile_manager_invalidate_tiles (TileManager *tm,
Tile *toplevel_tile);
void tile_manager_set_user_data (TileManager *tm,
void *user_data);
void *tile_manager_get_user_data (TileManager *tm);
int tile_manager_level_width (TileManager *tm);
int tile_manager_level_height (TileManager *tm);
int tile_manager_level_bpp (TileManager *tm);
void tile_manager_get_tile_coordinates (TileManager *tm, Tile *tile,
int *x, int *y);
void tile_manager_map_over_tile (TileManager *tm, Tile *tile, Tile *srctile);
#endif /* __TILE_MANAGER_H__ */

View File

@@ -1,82 +0,0 @@
#ifndef __TILE_PVT_H__
#define __TILE_PVT_H__
#ifdef USE_PTHREADS
#include <pthread.h>
#endif
#include <sys/types.h>
#include <glib.h>
#include "config.h"
#include "tile.h"
typedef struct _TileLink TileLink;
struct _TileLink
{
TileLink *next;
int tile_num; /* the number of this tile within the drawable */
void *tm; /* A pointer to the tile manager for this tile.
* We need this in order to call the tile managers
* validate proc whenever the tile is referenced yet
* invalid.
*/
};
struct _Tile
{
short ref_count; /* reference count. when the reference count is
* non-zero then the "data" for this tile must
* be valid. when the reference count for a tile
* is 0 then the "data" for this tile must be
* NULL.
*/
short write_count; /* write count: number of references that are
for write access */
short share_count; /* share count: number of tile managers that
hold this tile */
guint dirty : 1; /* is the tile dirty? has it been modified? */
guint valid : 1; /* is the tile valid? */
unsigned char bpp; /* the bytes per pixel (1, 2, 3 or 4) */
unsigned short ewidth; /* the effective width of the tile */
unsigned short eheight; /* the effective height of the tile */
/* a tile's effective width and height may be smaller
* (but not larger) than TILE_WIDTH and TILE_HEIGHT.
* this is to handle edge tiles of a drawable.
*/
TileRowHint *rowhint; /* An array of hints for rendering purposes */
guchar *data; /* the data for the tile. this may be NULL in which
* case the tile data is on disk.
*/
int swap_num; /* the index into the file table of the file to be used
* for swapping. swap_num 1 is always the global swap file.
*/
off_t swap_offset; /* the offset within the swap file of the tile data.
* if the tile data is in memory this will be set to -1.
*/
TileLink *tlink;
Tile *next;
Tile *prev; /* List pointers for the tile cache lists */
void *listhead; /* Pointer to the head of the list this tile is on */
#ifdef USE_PTHREADS
pthread_mutex_t mutex;
#endif
};
#ifdef USE_PTHREADS
#define TILE_MUTEX_LOCK(tile) pthread_mutex_lock(&((tile)->mutex))
#define TILE_MUTEX_UNLOCK(tile) pthread_mutex_unlock(&((tile)->mutex))
#else
#define TILE_MUTEX_LOCK(tile) /* nothing */
#define TILE_MUTEX_UNLOCK(tile) /* nothing */
#endif
#endif /* __TILE_PVT_H__ */

View File

@@ -1,885 +0,0 @@
#include "config.h"
#include <glib.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef USE_PTHREADS
#include <pthread.h>
#endif
#ifdef G_OS_WIN32
#include <io.h>
#endif
#ifndef _O_BINARY
#define _O_BINARY 0
#endif
#ifndef _O_TEMPORARY
#define _O_TEMPORARY 0
#endif
#define MAX_OPEN_SWAP_FILES 16
#include "tile.h"
#include "tile_swap.h"
#include "tile_pvt.h" /* ick. */
typedef struct _SwapFile SwapFile;
typedef struct _DefSwapFile DefSwapFile;
typedef struct _Gap Gap;
typedef struct _AsyncSwapArgs AsyncSwapArgs;
struct _SwapFile
{
char *filename;
int swap_num;
SwapFunc swap_func;
gpointer user_data;
int fd;
};
struct _DefSwapFile
{
GList *gaps;
long swap_file_end;
off_t cur_position;
};
struct _Gap
{
long start;
long end;
};
struct _AsyncSwapArgs
{
DefSwapFile *def_swap_file;
int fd;
Tile *tile;
};
static void tile_swap_init (void);
static guint tile_swap_hash (int *key);
static gint tile_swap_compare (int *a,
int *b);
static void tile_swap_command (Tile *tile,
int command);
static void tile_swap_open (SwapFile *swap_file);
static int tile_swap_default (int fd,
Tile *tile,
int cmd,
gpointer user_data);
static void tile_swap_default_in (DefSwapFile *def_swap_file,
int fd,
Tile *tile);
static void tile_swap_default_in_async (DefSwapFile *def_swap_file,
int fd,
Tile *tile);
static void tile_swap_default_out (DefSwapFile *def_swap_file,
int fd,
Tile *tile);
static void tile_swap_default_delete (DefSwapFile *def_swap_file,
int fd,
Tile *tile);
static long tile_swap_find_offset (DefSwapFile *def_swap_file,
int fd,
int bytes);
static void tile_swap_resize (DefSwapFile *def_swap_file,
int fd,
long new_size);
static Gap* tile_swap_gap_new (long start,
long end);
static void tile_swap_gap_destroy (Gap *gap);
#ifdef USE_PTHREADS
static void* tile_swap_in_thread (void *);
#endif
static int initialize = TRUE;
static GHashTable *swap_files = NULL;
static GList *open_swap_files = NULL;
static int nopen_swap_files = 0;
static int next_swap_num = 1;
static long swap_file_grow = 16 * TILE_WIDTH * TILE_HEIGHT * 4;
#ifdef USE_PTHREADS
static pthread_mutex_t swapfile_mutex = PTHREAD_MUTEX_INITIALIZER;
/* async_swapin_mutex protects only the list, not the tiles therein */
static pthread_t swapin_thread;
static pthread_mutex_t async_swapin_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t async_swapin_signal = PTHREAD_COND_INITIALIZER;
static GSList *async_swapin_tiles = NULL;
static GSList *async_swapin_tiles_end = NULL;
#endif
static gboolean seek_err_msg = TRUE, read_err_msg = TRUE, write_err_msg = TRUE;
static void
tile_swap_print_gaps (DefSwapFile *def_swap_file)
{
GList *gaps;
Gap *gap;
gaps = def_swap_file->gaps;
while (gaps)
{
gap = gaps->data;
gaps = gaps->next;
g_print (" %6ld - %6ld\n", gap->start, gap->end);
}
}
static void
tile_swap_exit1 (gpointer key,
gpointer value,
gpointer data)
{
extern int tile_ref_count;
SwapFile *swap_file;
DefSwapFile *def_swap_file;
if (tile_ref_count != 0)
g_warning ("tile ref count balance: %d\n", tile_ref_count);
swap_file = value;
if (swap_file->swap_func == tile_swap_default)
{
def_swap_file = swap_file->user_data;
if (def_swap_file->swap_file_end != 0)
{
g_warning ("swap file not empty: \"%s\"\n", swap_file->filename);
tile_swap_print_gaps (def_swap_file);
}
#if defined (__EMX__) || defined (G_OS_WIN32)
/* should close before unlink */
if (swap_file->fd > 0)
{
close (swap_file->fd);
swap_file->fd = -1;
}
#endif
unlink (swap_file->filename);
}
}
void
tile_swap_exit ()
{
#ifdef HINTS_SANITY
extern int tile_exist_peak;
fprintf(stderr,"Tile exist peak was %d Tile structs (%d bytes)",
tile_exist_peak, tile_exist_peak * sizeof(Tile));
#endif
if (swap_files)
g_hash_table_foreach (swap_files, tile_swap_exit1, NULL);
}
int
tile_swap_add (char *filename,
SwapFunc swap_func,
gpointer user_data)
{
SwapFile *swap_file;
DefSwapFile *def_swap_file;
#ifdef USE_PTHREADS
pthread_mutex_lock(&swapfile_mutex);
#endif
if (initialize)
tile_swap_init ();
swap_file = g_new (SwapFile, 1);
swap_file->filename = g_strdup (filename);
swap_file->swap_num = next_swap_num++;
if (!swap_func)
{
swap_func = tile_swap_default;
def_swap_file = g_new (DefSwapFile, 1);
def_swap_file->gaps = NULL;
def_swap_file->swap_file_end = 0;
def_swap_file->cur_position = 0;
user_data = def_swap_file;
}
swap_file->swap_func = swap_func;
swap_file->user_data = user_data;
swap_file->fd = -1;
g_hash_table_insert (swap_files, &swap_file->swap_num, swap_file);
#ifdef USE_PTHREADS
pthread_mutex_unlock(&swapfile_mutex);
#endif
return swap_file->swap_num;
}
void
tile_swap_remove (int swap_num)
{
SwapFile *swap_file;
#ifdef USE_PTHREADS
pthread_mutex_lock(&swapfile_mutex);
#endif
if (initialize)
tile_swap_init ();
swap_file = g_hash_table_lookup (swap_files, &swap_num);
if (!swap_file)
goto out;
g_hash_table_remove (swap_files, &swap_num);
if (swap_file->fd != -1)
close (swap_file->fd);
g_free (swap_file);
out:
#ifdef USE_PTHREADS
pthread_mutex_unlock(&swapfile_mutex);
#endif
return;
}
void
tile_swap_in_async (Tile *tile)
{
if (tile->swap_offset == -1)
return;
tile_swap_command (tile, SWAP_IN_ASYNC);
}
void
tile_swap_in (Tile *tile)
{
if (tile->swap_offset == -1)
{
tile_alloc (tile);
return;
}
tile_swap_command (tile, SWAP_IN);
}
void
tile_swap_out (Tile *tile)
{
tile_swap_command (tile, SWAP_OUT);
}
void
tile_swap_delete (Tile *tile)
{
tile_swap_command (tile, SWAP_DELETE);
}
void
tile_swap_compress (int swap_num)
{
tile_swap_command (NULL, SWAP_COMPRESS);
}
static void
tile_swap_init ()
{
if (initialize)
{
initialize = FALSE;
swap_files = g_hash_table_new ((GHashFunc) tile_swap_hash,
(GCompareFunc) tile_swap_compare);
#ifdef NOTDEF /* USE_PTHREADS */
pthread_create (&swapin_thread, NULL, &tile_swap_in_thread, NULL);
#endif
}
}
static guint
tile_swap_hash (int *key)
{
return ((guint) *key);
}
static gint
tile_swap_compare (int *a,
int *b)
{
return (*a == *b);
}
static void
tile_swap_command (Tile *tile,
int command)
{
SwapFile *swap_file;
#ifdef USE_PTHREADS
pthread_mutex_lock(&swapfile_mutex);
#endif
if (initialize)
tile_swap_init ();
do {
swap_file = g_hash_table_lookup (swap_files, &tile->swap_num);
if (!swap_file)
{
g_warning ("could not find swap file for tile");
goto out;
}
if (swap_file->fd == -1)
{
tile_swap_open (swap_file);
if (swap_file->fd == -1)
goto out;
}
} while ((* swap_file->swap_func) (swap_file->fd, tile, command, swap_file->user_data));
out:
#ifdef USE_PTHREADS
pthread_mutex_unlock(&swapfile_mutex);
#endif
return;
}
static void
tile_swap_open (SwapFile *swap_file)
{
SwapFile *tmp;
if (swap_file->fd != -1)
return;
if (nopen_swap_files == MAX_OPEN_SWAP_FILES)
{
tmp = open_swap_files->data;
close (tmp->fd);
tmp->fd = -1;
open_swap_files = g_list_remove (open_swap_files, open_swap_files->data);
nopen_swap_files -= 1;
}
swap_file->fd = open (swap_file->filename,
O_CREAT | O_RDWR | _O_BINARY | _O_TEMPORARY,
S_IREAD | S_IWRITE);
if (swap_file->fd == -1)
{
g_message ("unable to open swap file...BAD THINGS WILL HAPPEN SOON");
return;
}
open_swap_files = g_list_append (open_swap_files, swap_file);
nopen_swap_files += 1;
}
/* The actual swap file code. The swap file consists of tiles
* which have been moved out to disk in order to conserve memory.
* The swap file format is free form. Any tile in memory may
* end up anywhere on disk.
* An actual tile in the swap file consists only of the tile data.
* The offset of the tile on disk is stored in the tile data structure
* in memory.
*/
static int
tile_swap_default (int fd,
Tile *tile,
int cmd,
gpointer user_data)
{
DefSwapFile *def_swap_file;
def_swap_file = (DefSwapFile*) user_data;
switch (cmd)
{
case SWAP_IN:
tile_swap_default_in (def_swap_file, fd, tile);
break;
case SWAP_IN_ASYNC:
tile_swap_default_in_async (def_swap_file, fd, tile);
break;
case SWAP_OUT:
tile_swap_default_out (def_swap_file, fd, tile);
break;
case SWAP_DELETE:
tile_swap_default_delete (def_swap_file, fd, tile);
break;
case SWAP_COMPRESS:
g_warning ("tile_swap_default: SWAP_COMPRESS: UNFINISHED");
break;
}
return FALSE;
}
static void
tile_swap_default_in_async (DefSwapFile *def_swap_file,
int fd,
Tile *tile)
{
#ifdef NOTDEF /* USE_PTHREADS */
AsyncSwapArgs *args;
args = g_new(AsyncSwapArgs, 1);
args->def_swap_file = def_swap_file;
args->fd = fd;
args->tile = tile;
/* add this tile to the list of tiles for the async swapin task */
pthread_mutex_lock (&async_swapin_mutex);
g_slist_append (async_swapin_tiles_end, args);
if (!async_swapin_tiles)
async_swapin_tiles = async_swapin_tiles_end;
pthread_cond_signal (&async_swapin_signal);
pthread_mutex_unlock (&async_swapin_mutex);
#else
/* ignore; it's only a hint anyway */
/* this could be changed to call out to another program that
* tries to make the OS read the data in from disk.
*/
#endif
return;
}
/* NOTE: if you change this function, check to see if your changes
* apply to tile_swap_in_attempt() near the end of the file. The
* difference is that this version makes guarantees about what it
* provides, but tile_swap_in_attempt() just tries and gives up if
* anything goes wrong.
*
* I'm not sure that it is worthwhile to try to pull out common
* bits; I think the two functions are (at least for now) different
* enough to keep as two functions.
*
* N.B. the mutex on the tile must already have been locked on entry
* to this function. DO NOT LOCK IT HERE.
*/
static void
tile_swap_default_in (DefSwapFile *def_swap_file,
int fd,
Tile *tile)
{
int bytes;
int err;
int nleft;
off_t offset;
err = -1;
if (tile->data)
{
return;
}
if (def_swap_file->cur_position != tile->swap_offset)
{
def_swap_file->cur_position = tile->swap_offset;
offset = lseek (fd, tile->swap_offset, SEEK_SET);
if (offset == -1)
{
if (seek_err_msg)
g_message ("unable to seek to tile location on disk: %d", err);
seek_err_msg = FALSE;
return;
}
}
bytes = tile_size (tile);
tile_alloc (tile);
nleft = bytes;
while (nleft > 0)
{
do {
err = read (fd, tile->data + bytes - nleft, nleft);
} while ((err == -1) && ((errno == EAGAIN) || (errno == EINTR)));
if (err <= 0)
{
if (read_err_msg)
g_message ("unable to read tile data from disk: %d/%d ( %d ) bytes read", err, errno, nleft);
read_err_msg = FALSE;
return;
}
nleft -= err;
}
def_swap_file->cur_position += bytes;
/* Do not delete the swap from the file */
/* tile_swap_default_delete (def_swap_file, fd, tile); */
read_err_msg = seek_err_msg = TRUE;
}
static void
tile_swap_default_out (DefSwapFile *def_swap_file,
int fd,
Tile *tile)
{
int bytes;
int rbytes;
int err;
int nleft;
off_t offset;
off_t newpos;
bytes = TILE_WIDTH * TILE_HEIGHT * tile->bpp;
rbytes = tile_size (tile);
/* If there is already a valid swap_offset, use it */
if (tile->swap_offset == -1)
newpos = tile_swap_find_offset (def_swap_file, fd, bytes);
else
newpos = tile->swap_offset;
if (def_swap_file->cur_position != newpos)
{
offset = lseek (fd, newpos, SEEK_SET);
if (offset == -1)
{
if (seek_err_msg)
g_message ("unable to seek to tile location on disk: %d", errno);
seek_err_msg = FALSE;
return;
}
def_swap_file->cur_position = newpos;
}
nleft = rbytes;
while (nleft > 0)
{
err = write (fd, tile->data + rbytes - nleft, nleft);
if (err <= 0)
{
if (write_err_msg)
g_message ("unable to write tile data to disk: %d ( %d ) bytes written", err, nleft);
write_err_msg = FALSE;
return;
}
nleft -= err;
}
def_swap_file->cur_position += rbytes;
/* Do NOT free tile->data because we may be pre-swapping.
* tile->data is freed in tile_cache_zorch_next
*/
tile->dirty = FALSE;
tile->swap_offset = newpos;
write_err_msg = seek_err_msg = TRUE;
}
static void
tile_swap_default_delete (DefSwapFile *def_swap_file,
int fd,
Tile *tile)
{
GList *tmp;
GList *tmp2;
Gap *gap;
Gap *gap2;
long start;
long end;
if (tile->swap_offset == -1)
return;
start = tile->swap_offset;
end = start + TILE_WIDTH * TILE_HEIGHT * tile->bpp;
tile->swap_offset = -1;
tmp = def_swap_file->gaps;
while (tmp)
{
gap = tmp->data;
if (end == gap->start)
{
gap->start = start;
if (tmp->prev)
{
gap2 = tmp->prev->data;
if (gap->start == gap2->end)
{
gap2->end = gap->end;
tile_swap_gap_destroy (gap);
def_swap_file->gaps = g_list_remove_link (def_swap_file->gaps, tmp);
g_list_free (tmp);
}
}
break;
}
else if (start == gap->end)
{
gap->end = end;
if (tmp->next)
{
gap2 = tmp->next->data;
if (gap->end == gap2->start)
{
gap2->start = gap->start;
tile_swap_gap_destroy (gap);
def_swap_file->gaps = g_list_remove_link (def_swap_file->gaps, tmp);
g_list_free (tmp);
}
}
break;
}
else if (end < gap->start)
{
gap = tile_swap_gap_new (start, end);
tmp2 = g_list_alloc ();
tmp2->data = gap;
tmp2->next = tmp;
tmp2->prev = tmp->prev;
if (tmp->prev)
tmp->prev->next = tmp2;
tmp->prev = tmp2;
if (tmp == def_swap_file->gaps)
def_swap_file->gaps = tmp2;
break;
}
else if (!tmp->next)
{
gap = tile_swap_gap_new (start, end);
tmp->next = g_list_alloc ();
tmp->next->data = gap;
tmp->next->prev = tmp;
break;
}
tmp = tmp->next;
}
if (!def_swap_file->gaps)
{
gap = tile_swap_gap_new (start, end);
def_swap_file->gaps = g_list_append (def_swap_file->gaps, gap);
}
tmp = g_list_last (def_swap_file->gaps);
gap = tmp->data;
if (gap->end == def_swap_file->swap_file_end)
{
tile_swap_resize (def_swap_file, fd, gap->start);
tile_swap_gap_destroy (gap);
def_swap_file->gaps = g_list_remove_link (def_swap_file->gaps, tmp);
g_list_free (tmp);
}
}
static void
tile_swap_resize (DefSwapFile *def_swap_file,
int fd,
long new_size)
{
if (def_swap_file->swap_file_end > new_size)
{
ftruncate (fd, new_size);
/*fprintf(stderr, "TRUNCATED SWAP from %d to %d bytes.\n",
(int)def_swap_file->swap_file_end, (int) new_size);*/
}
def_swap_file->swap_file_end = new_size;
}
static long
tile_swap_find_offset (DefSwapFile *def_swap_file,
int fd,
int bytes)
{
GList *tmp;
Gap *gap;
long offset;
tmp = def_swap_file->gaps;
while (tmp)
{
gap = tmp->data;
if ((gap->end - gap->start) >= bytes)
{
offset = gap->start;
gap->start += bytes;
if (gap->start == gap->end)
{
tile_swap_gap_destroy (gap);
def_swap_file->gaps = g_list_remove_link (def_swap_file->gaps, tmp);
g_list_free (tmp);
}
return offset;
}
tmp = tmp->next;
}
offset = def_swap_file->swap_file_end;
tile_swap_resize (def_swap_file, fd, def_swap_file->swap_file_end + swap_file_grow);
if ((offset + bytes) < (def_swap_file->swap_file_end))
{
gap = tile_swap_gap_new (offset + bytes, def_swap_file->swap_file_end);
def_swap_file->gaps = g_list_append (def_swap_file->gaps, gap);
}
return offset;
}
static Gap*
tile_swap_gap_new (long start,
long end)
{
Gap *gap;
gap = g_new (Gap, 1);
gap->start = start;
gap->end = end;
return gap;
}
static void
tile_swap_gap_destroy (Gap *gap)
{
g_free (gap);
}
#ifdef NOTDEF /* USE_PTHREADS */
/* go through the list of tiles that are likely to be used soon and
* try to swap them in. If any tile is not in a state to be swapped
* in, ignore it, and the error will get dealt with when the tile
* is really needed -- assuming that the error still happens.
*
* Potential future enhancement: for non-threaded systems, we could
* fork() a process which merely attempts to bring tiles into the
* OS's buffer/page cache, where they will be read into the gimp
* more quickly. This would be pretty trivial, actually.
*/
static void
tile_swap_in_attempt (DefSwapFile *def_swap_file,
int fd,
Tile *tile)
{
int bytes;
int err;
int nleft;
off_t offset;
err = -1;
TILE_MUTEX_LOCK (tile);
if (tile->data)
goto out;
if (!tile->swap_num || !tile->swap_offset)
goto out;
if (def_swap_file->cur_position != tile->swap_offset)
{
def_swap_file->cur_position = tile->swap_offset;
offset = lseek (fd, tile->swap_offset, SEEK_SET);
if (offset == -1)
return;
}
bytes = tile_size (tile);
tile_alloc (tile);
nleft = bytes;
while (nleft > 0)
{
do {
err = read (fd, tile->data + bytes - nleft, nleft);
} while ((err == -1) && ((errno == EAGAIN) || (errno == EINTR)));
if (err <= 0)
{
g_free (tile->data);
return;
}
nleft -= err;
}
def_swap_file->cur_position += bytes;
out:
TILE_MUTEX_UNLOCK (tile);
}
static void *
tile_swap_in_thread (void *data)
{
AsyncSwapArgs *args;
GSList *free_item;
while (1)
{
pthread_mutex_lock (&async_swapin_mutex);
if (!async_swapin_tiles)
{
pthread_cond_wait (&async_swapin_signal, &async_swapin_mutex);
}
args = async_swapin_tiles->data;
free_item = async_swapin_tiles;
async_swapin_tiles = async_swapin_tiles->next;
g_slist_free_1(free_item);
if (!async_swapin_tiles)
async_swapin_tiles_end = NULL;
pthread_mutex_unlock (&async_swapin_mutex);
tile_swap_in_attempt(args->def_swap_file, args->fd, args->tile);
g_free(args);
}
}
#endif

View File

@@ -1,34 +0,0 @@
#ifndef __TILE_SWAP_H__
#define __TILE_SWAP_H__
#include "tile.h"
typedef enum {
SWAP_IN = 1,
SWAP_IN_ASYNC,
SWAP_OUT,
SWAP_DELETE,
SWAP_COMPRESS
} SwapCommand;
typedef int (*SwapFunc) (int fd,
Tile *tile,
int cmd,
gpointer user_data);
void tile_swap_exit (void);
int tile_swap_add (char *filename,
SwapFunc swap_func,
gpointer user_data);
void tile_swap_remove (int swap_num);
void tile_swap_in (Tile *tile);
void tile_swap_in_async (Tile *tile);
void tile_swap_out (Tile *tile);
void tile_swap_delete (Tile *tile);
void tile_swap_compress (int swap_num);
#endif /* __TILE_SWAP_H__ */

View File

@@ -1,372 +0,0 @@
#include <stdio.h>
#include "tile.h"
#include "tile_pvt.h"
#include "tile_cache.h"
#include "tile_manager.h"
#include "tile_swap.h"
static void tile_destroy (Tile *tile);
int tile_count = 0;
void
tile_sanitize_rowhints (Tile *tile)
{
int height, y;
/* If tile has rowhints array already, do nothing. */
if (tile->rowhint)
return;
height = tile->eheight;
tile->rowhint = g_new (TileRowHint, height);
for (y=0; y<height; y++)
{
tile->rowhint[y] = TILEROWHINT_UNKNOWN;
}
}
TileRowHint
tile_get_rowhint (Tile *tile, int yoff)
{
#ifdef HINTS_SANITY
if (yoff < tile_eheight(tile) && yoff>=0)
{
return tile->rowhint[yoff];
}
else
g_error("GET_ROWHINT OUT OF RANGE");
return TILEROWHINT_OUTOFRANGE;
#else
return tile->rowhint[yoff];
#endif
}
void
tile_set_rowhint (Tile *tile, int yoff, TileRowHint rowhint)
{
#ifdef HINTS_SANITY
if (yoff < tile_eheight(tile) && yoff>=0)
{
tile->rowhint[yoff] = rowhint;
}
else
g_error("SET_ROWHINT OUT OF RANGE");
#else
tile->rowhint[yoff] = rowhint;
#endif
}
void
tile_init (Tile *tile,
int bpp)
{
tile->ref_count = 0;
tile->write_count = 0;
tile->share_count = 0;
tile->dirty = FALSE;
tile->valid = FALSE;
tile->data = NULL;
tile->ewidth = TILE_WIDTH;
tile->eheight = TILE_HEIGHT;
tile->bpp = bpp;
tile->swap_num = 1;
tile->swap_offset = -1;
tile->tlink = NULL;
tile->next = tile->prev = NULL;
tile->listhead = NULL;
tile->rowhint = NULL;
#ifdef USE_PTHREADS
{
pthread_mutex_init(&tile->mutex, NULL);
}
tile_count++;
#endif
}
int tile_ref_count = 0;
int tile_share_count = 0;
int tile_active_count = 0;
#ifdef HINTS_SANITY
int tile_exist_peak = 0;
int tile_exist_count = 0;
#endif
void
tile_lock (Tile *tile)
{
/* Increment the global reference count.
*/
tile_ref_count += 1;
/* Increment this tile's reference count.
*/
TILE_MUTEX_LOCK (tile);
tile->ref_count += 1;
if (tile->ref_count == 1)
{
if (tile->listhead)
{
/* remove from cache, move to main store */
tile_cache_flush (tile);
}
tile_active_count ++;
}
if (tile->data == NULL)
{
/* There is no data, so the tile must be swapped out */
tile_swap_in (tile);
}
TILE_MUTEX_UNLOCK (tile);
/* Call 'tile_manager_validate' if the tile was invalid.
*/
if (!tile->valid)
{
/* an invalid tile should never be shared, so this should work */
tile_manager_validate ((TileManager*) tile->tlink->tm, tile);
}
}
void
tile_release (Tile *tile, int dirty)
{
/* Decrement the global reference count.
*/
tile_ref_count -= 1;
TILE_MUTEX_LOCK(tile);
/* Decrement this tile's reference count.
*/
tile->ref_count -= 1;
/* Decrement write ref count if dirtying
*/
if (dirty)
{
int y;
tile->write_count -= 1;
if (tile->rowhint)
{
for (y = 0; y < tile->eheight; y++)
{
tile->rowhint[y] = TILEROWHINT_UNKNOWN;
}
}
}
if (tile->ref_count == 0)
{
tile_active_count--;
if (tile->share_count == 0)
{
/* tile is truly dead */
tile_destroy (tile);
return; /* skip terminal unlock */
}
else
{
/* last reference was just released, so move the tile to the
tile cache */
tile_cache_insert (tile);
}
}
TILE_MUTEX_UNLOCK (tile);
}
void
tile_alloc (Tile *tile)
{
if (tile->data)
return;
/* Allocate the data for the tile.
*/
tile->data = g_new (guchar, tile_size (tile));
#ifdef HINTS_SANITY
tile_exist_count++;
if (tile_exist_count > tile_exist_peak)
tile_exist_peak = tile_exist_count;
#endif
}
static void
tile_destroy (Tile *tile)
{
if (tile->ref_count)
{
g_warning ("tried to destroy a ref'd tile");
return;
}
if (tile->share_count)
{
g_warning ("tried to destroy an attached tile");
return;
}
if (tile->data)
{
g_free (tile->data);
tile->data = NULL;
}
if (tile->rowhint)
{
g_free (tile->rowhint);
tile->rowhint = NULL;
}
if (tile->swap_offset != -1)
{
/* If the tile is on disk, then delete its
* presence there.
*/
tile_swap_delete (tile);
}
if (tile->listhead)
tile_cache_flush (tile);
TILE_MUTEX_UNLOCK (tile);
g_free (tile);
tile_count --;
#ifdef HINTS_SANITY
tile_exist_count--;
#endif
}
int
tile_size (Tile *tile)
{
int size;
/* Return the actual size of the tile data.
* (Based on its effective width and height).
*/
size = tile->ewidth * tile->eheight * tile->bpp;
return size;
}
int
tile_ewidth (Tile *tile)
{
return tile->ewidth;
}
int
tile_eheight (Tile *tile)
{
return tile->eheight;
}
int
tile_bpp (Tile *tile)
{
return tile->bpp;
}
int
tile_is_valid (Tile *tile)
{
return tile->valid;
}
void
tile_mark_valid (Tile *tile)
{
TILE_MUTEX_LOCK (tile);
tile->valid = TRUE;
TILE_MUTEX_UNLOCK (tile);
}
void
tile_attach (Tile *tile, void *tm, int tile_num)
{
TileLink *tmp;
if ((tile->share_count > 0) && (!tile->valid))
{
/* trying to share invalid tiles is problematic, not to mention silly */
tile_manager_validate ((TileManager*) tile->tlink->tm, tile);
}
tile->share_count++;
tile_share_count++;
#ifdef TILE_DEBUG
g_print("tile_attach: %p -> (%p,%d) *%d\n", tile, tm, tile_num, tile->share_count);
#endif
/* link this tile into the tile's tilelink chain */
tmp = g_new (TileLink, 1);
tmp->tm = tm;
tmp->tile_num = tile_num;
tmp->next = tile->tlink;
tile->tlink = tmp;
}
void
tile_detach (Tile *tile, void *tm, int tile_num)
{
TileLink **link;
TileLink *tmp;
#ifdef TILE_DEBUG
g_print("tile_detach: %p ~> (%p,%d) r%d *%d\n", tile, tm, tile_num,
tile->ref_count, tile->share_count);
#endif
for (link = &tile->tlink;
*link != NULL;
link = &(*link)->next)
{
if (((*link)->tm == tm) && ((*link)->tile_num == tile_num))
break;
}
if (*link == NULL)
{
g_warning ("Tried to detach a nonattached tile -- TILE BUG!");
return;
}
tmp = *link;
*link = tmp->next;
g_free (tmp);
tile_share_count--;
tile->share_count--;
if (tile->share_count == 0 && tile->ref_count == 0)
{
tile_destroy (tile);
return;
}
TILE_MUTEX_UNLOCK (tile);
}
void *
tile_data_pointer (Tile *tile, int xoff, int yoff)
{
int offset = yoff * tile->ewidth + xoff;
return (void *)(tile->data + offset * tile->bpp);
}

View File

@@ -1,88 +0,0 @@
#ifndef __TILE_H__
#define __TILE_H__
#define TILE_WIDTH 64
#define TILE_HEIGHT 64
/* Uncomment for verbose debugging on copy-on-write logic
#define TILE_DEBUG
*/
/* sanity checking on new tile hinting code */
/* #define HINTS_SANITY */
#include <sys/types.h>
#include <glib.h>
#include "config.h"
typedef struct _Tile Tile;
/* explicit guchar type rather than enum since gcc chooses an int
* representation but arrays of TileRowHints are quite space-critical
* in GIMP.
*/
typedef guchar TileRowHint;
#define TILEROWHINT_BROKEN 0
#define TILEROWHINT_OPAQUE 1
#define TILEROWHINT_TRANSPARENT 2
#define TILEROWHINT_MIXED 3
#define TILEROWHINT_OUTOFRANGE 4
#define TILEROWHINT_UNDEFINED 5
#define TILEROWHINT_UNKNOWN 6
/* Initializes the fields of a tile to "good" values.
*/
void tile_init (Tile *tile,
int bpp);
/*
* tile_lock locks a tile into memory. This does what tile_ref used
* to do. It is the responsibility of the tile manager to take care
* of the copy-on-write semantics. Locks stack; a tile remains locked
* in memory as long as it's been locked more times than it has been
* released. tile_release needs to know whether the release was for
* write access. (This is a hack, and should be handled better.)
*/
void tile_lock (Tile *);
void tile_release (Tile *, int);
/* Allocate the data for the tile.
*/
void tile_alloc (Tile *tile);
/* Return the size in bytes of the tiles data.
*/
int tile_size (Tile *tile);
int tile_ewidth (Tile *tile);
int tile_eheight (Tile *tile);
int tile_bpp (Tile *tile);
int tile_is_valid (Tile *tile);
void tile_mark_valid (Tile *tile);
/* DOCUMENT ME -- adm */
TileRowHint tile_get_rowhint (Tile *tile, int yoff);
void tile_set_rowhint (Tile *tile, int yoff, TileRowHint rowhint);
void tile_sanitize_rowhints (Tile *tile);
void *tile_data_pointer (Tile *tile, int xoff, int yoff);
/* tile_attach attaches a tile to a tile manager: this function
* increments the tile's share count and inserts a tilelink into the
* tile's link list. tile_detach reverses the process.
* If a tile's share count is zero after a tile_detach, the tile is
* discarded.
*/
void tile_attach (Tile *tile, void *tm, int tile_num);
void tile_detach (Tile *tile, void *tm, int tile_num);
#endif /* __TILE_H__ */

View File

@@ -346,7 +346,7 @@ bezier_draw_curve (BezierSelect *bezier_sel,
{ {
do { do {
point_counts = count_points_on_curve(points); point_counts = count_points_on_curve(points);
if(point_counts >= 4) if (point_counts >= 4)
{ {
do { do {
bezier_draw_segment (bezier_sel, points, bezier_draw_segment (bezier_sel, points,
@@ -354,7 +354,7 @@ bezier_draw_curve (BezierSelect *bezier_sel,
func, func,
udata); udata);
points = next_anchor(points,&next_curve); points = next_anchor (points, &next_curve);
/* g_print ("next_anchor = %p\n",points); */ /* g_print ("next_anchor = %p\n",points); */
} while (points != start_pt && points); } while (points != start_pt && points);
if(cnt) if(cnt)
@@ -366,7 +366,7 @@ bezier_draw_curve (BezierSelect *bezier_sel,
break; /* must be last curve since only this one is allowed < 4 break; /* must be last curve since only this one is allowed < 4
* points. * points.
*/ */
} while(next_curve); } while (next_curve);
} }
} }
@@ -3213,17 +3213,17 @@ bezier_gen_points(BezierSelect *bezier_sel,
points = bezier_sel->points; points = bezier_sel->points;
start_pt = bezier_sel->points; start_pt = bezier_sel->points;
if(bezier_sel->num_points >= 4) if (bezier_sel->num_points >= 4)
{ {
do { do {
point_counts = count_points_on_curve(points); point_counts = count_points_on_curve (points);
if(point_counts < 4) if (point_counts < 4)
return(TRUE); return(TRUE);
do { do {
bezier_draw_segment (bezier_sel, points, bezier_draw_segment (bezier_sel, points,
SUBDIVIDE, AA_IMAGE_COORDS, SUBDIVIDE, AA_IMAGE_COORDS,
bezier_stack_points, bezier_stack_points,
(gpointer)next_rpnts); (gpointer) next_rpnts);
points = next_anchor(points,&next_curve); points = next_anchor(points,&next_curve);
} while (points != start_pt && points); } while (points != start_pt && points);
@@ -3231,7 +3231,7 @@ bezier_gen_points(BezierSelect *bezier_sel,
points = next_curve; points = next_curve;
if(next_curve) if(next_curve)
{ {
next_rpnts->next_curve = g_new0(BezierRenderPnts,1); next_rpnts->next_curve = g_new0 (BezierRenderPnts, 1);
next_rpnts = next_rpnts->next_curve; next_rpnts = next_rpnts->next_curve;
} }
} while (next_curve); } while (next_curve);
@@ -3247,55 +3247,65 @@ bezier_stroke (BezierSelect *bezier_sel,
int open_path) int open_path)
{ {
Argument *return_vals; Argument *return_vals;
int nreturn_vals;
BezierRenderPnts *next_rpnts; BezierRenderPnts *next_rpnts;
BezierRenderPnts *rpnts = g_new0(BezierRenderPnts,1); BezierRenderPnts *rpnts;
GimpDrawable *drawable;
gint offset_x, offset_y;
gint nreturn_vals;
drawable = gimage_active_drawable (gdisp->gimage);
if (!drawable)
return;
rpnts = g_new0 (BezierRenderPnts, 1);
gimp_drawable_offsets (drawable, &offset_x, &offset_y);
/* Start an undo group */ /* Start an undo group */
undo_push_group_start (gdisp->gimage, PAINT_CORE_UNDO); undo_push_group_start (gdisp->gimage, PAINT_CORE_UNDO);
bezier_gen_points(bezier_sel,open_path,rpnts); bezier_gen_points (bezier_sel, open_path, rpnts);
do do
{ {
if (rpnts->stroke_points) if (rpnts->stroke_points)
{ {
GimpDrawable *drawable; gdouble *ptr;
int offset_x, offset_y;
gdouble *ptr; ptr = rpnts->stroke_points;
while (ptr < rpnts->stroke_points + (rpnts->num_stroke_points * 2))
drawable = gimage_active_drawable (gdisp->gimage); {
gimp_drawable_offsets (drawable, &offset_x, &offset_y); *ptr /= SUPERSAMPLE;
*ptr++ -= offset_x;
*ptr /= SUPERSAMPLE;
*ptr++ -= offset_y;
}
/* Stroke with the correct tool */
return_vals =
procedural_db_run_proc (tool_active_PDB_string(),
&nreturn_vals,
PDB_DRAWABLE, drawable_ID (drawable),
PDB_INT32, (gint32) rpnts->num_stroke_points * 2,
PDB_FLOATARRAY, rpnts->stroke_points,
PDB_END);
if (return_vals && return_vals[0].value.pdb_int != PDB_SUCCESS)
g_message (_("Paintbrush operation failed."));
procedural_db_destroy_args (return_vals, nreturn_vals);
g_free (rpnts->stroke_points);
}
ptr = rpnts->stroke_points; next_rpnts = rpnts->next_curve;
while (ptr < rpnts->stroke_points + (rpnts->num_stroke_points * 2)) rpnts->stroke_points = NULL;
{ rpnts->len_stroke_points = rpnts->num_stroke_points = 0;
*ptr /= SUPERSAMPLE; g_free (rpnts);
*ptr++ -= offset_x; rpnts = next_rpnts;
*ptr /= SUPERSAMPLE;
*ptr++ -= offset_y;
}
/* Stroke with the correct tool */
return_vals = procedural_db_run_proc (tool_active_PDB_string(),
&nreturn_vals,
PDB_DRAWABLE, drawable_ID (drawable),
PDB_INT32, (gint32) rpnts->num_stroke_points * 2,
PDB_FLOATARRAY, rpnts->stroke_points,
PDB_END);
if (return_vals && return_vals[0].value.pdb_int != PDB_SUCCESS)
g_message (_("Paintbrush operation failed."));
procedural_db_destroy_args (return_vals, nreturn_vals);
g_free (rpnts->stroke_points);
} }
next_rpnts = rpnts->next_curve; while (rpnts);
rpnts->stroke_points = NULL;
rpnts->len_stroke_points = rpnts->num_stroke_points = 0;
g_free(rpnts);
rpnts = next_rpnts;
} while (rpnts);
/* End an undo group */ /* End an undo group */
undo_push_group_end (gdisp->gimage); undo_push_group_end (gdisp->gimage);
gdisplays_flush (); gdisplays_flush ();

View File

@@ -447,7 +447,8 @@ blend_button_press (Tool *tool,
/* Keep the coordinates of the target */ /* Keep the coordinates of the target */
gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, gdisplay_untransform_coords (gdisp, bevent->x, bevent->y,
&blend_tool->startx, &blend_tool->starty, FALSE, 1); &blend_tool->startx, &blend_tool->starty,
FALSE, TRUE);
blend_tool->endx = blend_tool->startx; blend_tool->endx = blend_tool->startx;
blend_tool->endy = blend_tool->starty; blend_tool->endy = blend_tool->starty;
@@ -576,7 +577,8 @@ blend_motion (Tool *tool,
/* Get the current coordinates */ /* Get the current coordinates */
gdisplay_untransform_coords (gdisp, mevent->x, mevent->y, gdisplay_untransform_coords (gdisp, mevent->x, mevent->y,
&blend_tool->endx, &blend_tool->endy, FALSE, 1); &blend_tool->endx, &blend_tool->endy,
FALSE, TRUE);
/* Restrict to multiples of 15 degrees if ctrl is pressed */ /* Restrict to multiples of 15 degrees if ctrl is pressed */
@@ -671,9 +673,9 @@ blend_draw (Tool *tool)
blend_tool = (BlendTool *) tool->private; blend_tool = (BlendTool *) tool->private;
gdisplay_transform_coords (gdisp, blend_tool->startx, blend_tool->starty, gdisplay_transform_coords (gdisp, blend_tool->startx, blend_tool->starty,
&tx1, &ty1, 1); &tx1, &ty1, TRUE);
gdisplay_transform_coords (gdisp, blend_tool->endx, blend_tool->endy, gdisplay_transform_coords (gdisp, blend_tool->endx, blend_tool->endy,
&tx2, &ty2, 1); &tx2, &ty2, TRUE);
/* Draw start target */ /* Draw start target */
gdk_draw_line (blend_tool->core->win, blend_tool->core->gc, gdk_draw_line (blend_tool->core->win, blend_tool->core->gc,

View File

@@ -65,8 +65,9 @@ struct _BrightnessContrastDialog
gdouble contrast; gdouble contrast;
gboolean preview; gboolean preview;
GimpLut *lut; GimpLut *lut;
glong conn_id;
}; };
@@ -170,6 +171,12 @@ tools_free_brightness_contrast (Tool *tool)
void void
brightness_contrast_initialize (GDisplay *gdisp) brightness_contrast_initialize (GDisplay *gdisp)
{ {
if (gimp_image_is_empty (gdisp->gimage))
{
g_message (_("The image has no drawables."));
return;
}
if (drawable_indexed (gimage_active_drawable (gdisp->gimage))) if (drawable_indexed (gimage_active_drawable (gdisp->gimage)))
{ {
g_message (_("Brightness-Contrast does not operate on indexed drawables.")); g_message (_("Brightness-Contrast does not operate on indexed drawables."));
@@ -191,6 +198,13 @@ brightness_contrast_initialize (GDisplay *gdisp)
image_map_create (gdisp, brightness_contrast_dialog->drawable); image_map_create (gdisp, brightness_contrast_dialog->drawable);
brightness_contrast_update (brightness_contrast_dialog, ALL); brightness_contrast_update (brightness_contrast_dialog, ALL);
/* Merge-related undo release signal */
brightness_contrast_dialog->conn_id =
gtk_signal_connect (GTK_OBJECT (gdisp->gimage), "layer_merge",
GTK_SIGNAL_FUNC (brightness_contrast_cancel_callback),
brightness_contrast_dialog);
} }
/********************************/ /********************************/
@@ -427,6 +441,12 @@ brightness_contrast_cancel_callback (GtkWidget *widget,
gdisplays_flush (); gdisplays_flush ();
} }
if (bcd->conn_id != 0)
{
gtk_signal_disconnect (GTK_OBJECT (gimp_drawable_gimage (bcd->drawable)), bcd->conn_id);
bcd->conn_id = 0;
}
active_tool->gdisp_ptr = NULL; active_tool->gdisp_ptr = NULL;
active_tool->drawable = NULL; active_tool->drawable = NULL;
} }

View File

@@ -18,6 +18,8 @@
/* NOTE: This file is autogenerated by pdbgen.pl. */ /* NOTE: This file is autogenerated by pdbgen.pl. */
#include "config.h"
#include "procedural_db.h" #include "procedural_db.h"
#include <string.h> #include <string.h>

View File

@@ -18,6 +18,8 @@
/* NOTE: This file is autogenerated by pdbgen.pl. */ /* NOTE: This file is autogenerated by pdbgen.pl. */
#include "config.h"
#include "procedural_db.h" #include "procedural_db.h"
#include <string.h> #include <string.h>

View File

@@ -142,7 +142,7 @@ bucket_options_new (void)
gtk_widget_show (label); gtk_widget_show (label);
options->threshold_w = options->threshold_w =
gtk_adjustment_new (default_threshold, 1.0, 255.0, 1.0, 1.0, 0.0); gtk_adjustment_new (default_threshold, 0.0, 255.0, 1.0, 1.0, 0.0);
scale = gtk_hscale_new (GTK_ADJUSTMENT (options->threshold_w)); scale = gtk_hscale_new (GTK_ADJUSTMENT (options->threshold_w));
gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP); gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);

View File

@@ -18,6 +18,8 @@
#include "config.h" #include "config.h"
#include <stdlib.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h> #include <gdk/gdkkeysyms.h>
@@ -392,7 +394,7 @@ by_color_select_button_release (Tool *tool,
gint x, y; gint x, y;
GimpDrawable *drawable; GimpDrawable *drawable;
guchar *color; guchar *color;
gint use_offsets; gboolean use_offsets;
gdisp = (GDisplay *) gdisp_ptr; gdisp = (GDisplay *) gdisp_ptr;
by_color_sel = (ByColorSelect *) tool->private; by_color_sel = (ByColorSelect *) tool->private;
@@ -784,13 +786,13 @@ by_color_select_dialog_new (void)
gimp_radio_group_new2 (TRUE, _("Selection Mode"), gimp_radio_group_new2 (TRUE, _("Selection Mode"),
gimp_radio_button_update, gimp_radio_button_update,
&bcd->operation, &bcd->operation,
(gpointer) bcd->operation, GINT_TO_POINTER (bcd->operation),
_("Replace"), (gpointer) SELECTION_REPLACE, _("Replace"), GINT_TO_POINTER (SELECTION_REPLACE),
&bcd->replace_button, &bcd->replace_button,
_("Add"), (gpointer) SELECTION_ADD, NULL, _("Add"), GINT_TO_POINTER (SELECTION_ADD), NULL,
_("Subtract"), (gpointer) SELECTION_SUB, NULL, _("Subtract"), GINT_TO_POINTER (SELECTION_SUB), NULL,
_("Intersect"), (gpointer) SELECTION_INTERSECT, NULL, _("Intersect"), GINT_TO_POINTER (SELECTION_INTERSECT), NULL,
NULL); NULL);

View File

@@ -293,7 +293,12 @@ channel_get_ID (gint ID)
void void
channel_delete (Channel *channel) channel_delete (Channel *channel)
{ {
gtk_object_unref (GTK_OBJECT (channel)); /* Channels are normally deleted by removing them from the associated
image. The only case where channel_delete() is useful is if you want
to remove a floating channel object that has not been added to an
image yet. We use gtk_object_sink() for this reason here.
*/
gtk_object_sink (GTK_OBJECT (channel));
} }
static void static void
@@ -1346,7 +1351,7 @@ channel_feather (Channel *input,
gaussian_blur_region (&srcPR, radius_x, radius_y); gaussian_blur_region (&srcPR, radius_x, radius_y);
if (input != output) if (input != output)
channel_combine_mask (output, input, op, 0, 0); channel_combine_mask (output, input, op, off_x, off_y);
output->bounds_known = FALSE; output->bounds_known = FALSE;
} }
@@ -1460,6 +1465,8 @@ channel_sharpen (Channel *mask)
pixel_regions_process_parallel ((p_func) gimp_lut_process_inline, pixel_regions_process_parallel ((p_func) gimp_lut_process_inline,
lut, 1, &maskPR); lut, 1, &maskPR);
gimp_lut_free (lut); gimp_lut_free (lut);
mask->bounds_known = FALSE;
} }
void void

View File

@@ -18,6 +18,8 @@
/* NOTE: This file is autogenerated by pdbgen.pl. */ /* NOTE: This file is autogenerated by pdbgen.pl. */
#include "config.h"
#include "procedural_db.h" #include "procedural_db.h"
#include "channel.h" #include "channel.h"
@@ -255,7 +257,7 @@ static ProcRecord channel_delete_proc =
{ {
"gimp_channel_delete", "gimp_channel_delete",
"Delete a channel.", "Delete a channel.",
"This procedure deletes the specified channel. This does not need to be done if a gimage containing this channel was already deleted.", "This procedure deletes the specified channel. This must not be done if the gimage containing this channel was already deleted or if the channel was already removed from the image. The only case in which this procedure is useful is if you want to get rid of a channel which has not yet been added to an image.",
"Spencer Kimball & Peter Mattis", "Spencer Kimball & Peter Mattis",
"Spencer Kimball & Peter Mattis", "Spencer Kimball & Peter Mattis",
"1995-1996", "1995-1996",

View File

@@ -777,7 +777,8 @@ duplicate_projection (GimpImage *oldgimage, GimpImage *newgimage,
fprintf (stderr, " [pointers: %p, %p ] ", oldgimage, gdisp->gimage); fprintf (stderr, " [pointers: %p, %p ] ", oldgimage, gdisp->gimage);
gdisplay_untransform_coords (gdisp, 0, 0, &x1, &y1, FALSE, FALSE); gdisplay_untransform_coords (gdisp, 0, 0, &x1, &y1, FALSE, FALSE);
gdisplay_untransform_coords (gdisp, gdisp->disp_width, gdisp->disp_height, gdisplay_untransform_coords (gdisp,
gdisp->disp_width, gdisp->disp_height,
&x2, &y2, FALSE, FALSE); &x2, &y2, FALSE, FALSE);
fprintf(stderr," <%dx%d %dx%d %d,%d->%d,%d> ", fprintf(stderr," <%dx%d %dx%d %d,%d->%d,%d> ",

View File

@@ -18,6 +18,8 @@
/* NOTE: This file is autogenerated by pdbgen.pl. */ /* NOTE: This file is autogenerated by pdbgen.pl. */
#include "config.h"
#include "procedural_db.h" #include "procedural_db.h"
#include "channel_ops.h" #include "channel_ops.h"

View File

@@ -302,9 +302,24 @@ clone_paint_func (PaintCore *paint_core,
active_tool); active_tool);
else if (state == POSTTRACE_PAINT) else if (state == POSTTRACE_PAINT)
{ {
gint off_x, off_y;
if (clone_options->type == PATTERN_CLONE || src_drawable_ == NULL)
{
off_x = 0;
off_y = 0;
}
else
{
gimp_drawable_offsets (src_drawable_, &off_x, &off_y);
}
/* Find the target cursor's location onscreen */ /* Find the target cursor's location onscreen */
gdisplay_transform_coords (src_gdisp, src_x, src_y, gdisplay_transform_coords (src_gdisp,
&trans_tx, &trans_ty, 1); src_x + off_x,
src_y + off_y,
&trans_tx, &trans_ty,
FALSE);
draw_core_resume (paint_core->core, active_tool); draw_core_resume (paint_core->core, active_tool);
} }
return NULL; return NULL;

View File

@@ -212,6 +212,12 @@ color_balance_initialize (GDisplay *gdisp)
{ {
gint i; gint i;
if (gimp_image_is_empty (gdisp->gimage))
{
g_message (_("The image has no drawables."));
return;
}
if (! drawable_color (gimage_active_drawable (gdisp->gimage))) if (! drawable_color (gimage_active_drawable (gdisp->gimage)))
{ {
g_message (_("Color balance operates only on RGB color drawables.")); g_message (_("Color balance operates only on RGB color drawables."));
@@ -237,6 +243,13 @@ color_balance_initialize (GDisplay *gdisp)
image_map_create (gdisp, color_balance_dialog->drawable); image_map_create (gdisp, color_balance_dialog->drawable);
color_balance_update (color_balance_dialog, ALL); color_balance_update (color_balance_dialog, ALL);
/* Merge-related undo release signal */
color_balance_dialog->conn_id =
gtk_signal_connect (GTK_OBJECT (gdisp->gimage), "layer_merge",
GTK_SIGNAL_FUNC (color_balance_cancel_callback),
color_balance_dialog);
} }
/**************************/ /**************************/
@@ -424,7 +437,7 @@ color_balance_dialog_new (void)
group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio_button)); group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio_button));
gtk_box_pack_start (GTK_BOX (hbox), radio_button, TRUE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), radio_button, TRUE, FALSE, 0);
gtk_object_set_user_data (GTK_OBJECT (radio_button), (gpointer) i); gtk_object_set_user_data (GTK_OBJECT (radio_button), GINT_TO_POINTER (i));
gtk_signal_connect (GTK_OBJECT (radio_button), "toggled", gtk_signal_connect (GTK_OBJECT (radio_button), "toggled",
GTK_SIGNAL_FUNC (color_balance_range_callback), GTK_SIGNAL_FUNC (color_balance_range_callback),
cbd); cbd);
@@ -618,6 +631,12 @@ color_balance_cancel_callback (GtkWidget *widget,
cbd->image_map = NULL; cbd->image_map = NULL;
} }
if (cbd->conn_id != 0)
{
gtk_signal_disconnect (GTK_OBJECT (gimp_drawable_gimage (cbd->drawable)), cbd->conn_id);
cbd->conn_id = 0;
}
active_tool->gdisp_ptr = NULL; active_tool->gdisp_ptr = NULL;
active_tool->drawable = NULL; active_tool->drawable = NULL;
} }

View File

@@ -54,6 +54,8 @@ struct _ColorBalanceDialog
gboolean preserve_luminosity; gboolean preserve_luminosity;
gboolean preview; gboolean preview;
TransferMode application_mode; TransferMode application_mode;
glong conn_id;
}; };
Tool * tools_new_color_balance (void); Tool * tools_new_color_balance (void);

View File

@@ -18,6 +18,8 @@
/* NOTE: This file is autogenerated by pdbgen.pl. */ /* NOTE: This file is autogenerated by pdbgen.pl. */
#include "config.h"
#include "procedural_db.h" #include "procedural_db.h"
#include "color_balance.h" #include "color_balance.h"
@@ -556,7 +558,7 @@ curves_spline_invoker (Argument *args)
success = FALSE; success = FALSE;
num_points = args[2].value.pdb_int; num_points = args[2].value.pdb_int;
if (num_points <= 3 || num_points > 32) if (num_points <= 3 || num_points > 34)
success = FALSE; success = FALSE;
control_pts = (guint8 *) args[3].value.pdb_pointer; control_pts = (guint8 *) args[3].value.pdb_pointer;
@@ -630,7 +632,7 @@ static ProcArg curves_spline_inargs[] =
{ {
PDB_INT32, PDB_INT32,
"num_points", "num_points",
"The number of values in the control point array (3 < num_points <= 32)" "The number of values in the control point array (3 < num_points <= 34)"
}, },
{ {
PDB_INT8ARRAY, PDB_INT8ARRAY,
@@ -964,6 +966,8 @@ histogram_invoker (Argument *args)
/* Calculate the statistics */ /* Calculate the statistics */
histogram_tool_histogram_range (htd.histogram, start_range, end_range, histogram_tool_histogram_range (htd.histogram, start_range, end_range,
&htd); &htd);
gimp_histogram_free (htd.hist);
} }
} }
@@ -1011,7 +1015,7 @@ static ProcArg histogram_outargs[] =
{ {
PDB_FLOAT, PDB_FLOAT,
"mean", "mean",
"Mean itensity value" "Mean intensity value"
}, },
{ {
PDB_FLOAT, PDB_FLOAT,
@@ -1021,7 +1025,7 @@ static ProcArg histogram_outargs[] =
{ {
PDB_FLOAT, PDB_FLOAT,
"median", "median",
"Median itensity value" "Median intensity value"
}, },
{ {
PDB_FLOAT, PDB_FLOAT,

View File

@@ -198,7 +198,8 @@ color_panel_draw (ColorPanel *color_panel)
color_panel->color[2]); color_panel->color[2]);
gdk_gc_set_foreground (private->gc, &fg); gdk_gc_set_foreground (private->gc, &fg);
gdk_draw_rectangle (widget->window, private->gc, 1, 0, 0, gdk_draw_rectangle (widget->window, private->gc, TRUE,
0, 0,
widget->allocation.width, widget->allocation.height); widget->allocation.width, widget->allocation.height);
} }

View File

@@ -308,7 +308,8 @@ color_picker_button_press (Tool *tool,
/* Keep the coordinates of the target */ /* Keep the coordinates of the target */
gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, gdisplay_untransform_coords (gdisp, bevent->x, bevent->y,
&cp_tool->centerx, &cp_tool->centery, FALSE, 1); &cp_tool->centerx, &cp_tool->centery,
FALSE, TRUE);
gdk_pointer_grab (gdisp->canvas->window, FALSE, gdk_pointer_grab (gdisp->canvas->window, FALSE,
(GDK_POINTER_MOTION_HINT_MASK | (GDK_POINTER_MOTION_HINT_MASK |

View File

@@ -373,7 +373,7 @@ select_shrink_cmd_callback (GtkWidget *widget,
return_if_no_display (gdisp); return_if_no_display (gdisp);
shrink_dialog = shrink_dialog =
gimp_query_size_box (N_("Shrink Selection"), gimp_query_size_box (_("Shrink Selection"),
gimp_standard_help_func, gimp_standard_help_func,
"dialogs/shrink_selection.html", "dialogs/shrink_selection.html",
_("Shrink Selection by:"), _("Shrink Selection by:"),
@@ -1345,9 +1345,9 @@ static void
image_scale_callback (GtkWidget *widget, image_scale_callback (GtkWidget *widget,
gpointer client_data) gpointer client_data)
{ {
ImageResize *image_scale = NULL; ImageResize *image_scale = (ImageResize *) client_data;
g_assert ((image_scale = (ImageResize *) client_data) != NULL); g_assert (image_scale != NULL);
g_assert (image_scale->gimage != NULL); g_assert (image_scale->gimage != NULL);
gtk_widget_set_sensitive (image_scale->resize->resize_shell, FALSE); gtk_widget_set_sensitive (image_scale->resize->resize_shell, FALSE);

View File

@@ -25,6 +25,11 @@
*/ */
/* /*
* 2001-06-29 - GIMP 1.2 branch only: Make it even harder to
* trigger those impossible-to-reach assertions, and handle things
* more gracefully when we do reach them. :P Also removed some
* redundant calculations and crufty structure elements. [Adam]
*
* 2000/01/30 - Use palette_selector instead of option_menu for custom * 2000/01/30 - Use palette_selector instead of option_menu for custom
* palette. Use libgimp callback functions. [Sven] * palette. Use libgimp callback functions. [Sven]
* *
@@ -369,11 +374,6 @@ typedef struct
/* The volume (actually 2-norm) of the box */ /* The volume (actually 2-norm) of the box */
int volume; int volume;
/* The number of nonzero histogram cells within this box */
long colorcount;
/* The sum of the weighted error within this box */
guint64 error;
/* The sum of the unweighted error within this box */ /* The sum of the unweighted error within this box */
guint64 rerror; guint64 rerror;
guint64 gerror; guint64 gerror;
@@ -1865,16 +1865,6 @@ find_split_candidate (boxptr boxlist,
} }
#if 0
static boxptr
find_biggest_color_pop (boxptr boxlist,
int numboxes)
/* Find the splittable box with the largest color population */
/* Returns NULL if no splittable boxes remain */
{
}
#endif
static boxptr static boxptr
find_biggest_volume (boxptr boxlist, find_biggest_volume (boxptr boxlist,
@@ -1907,7 +1897,6 @@ update_box_gray (CFHistogram histogram,
/* and recompute its volume and population */ /* and recompute its volume and population */
{ {
int i, min, max, dist; int i, min, max, dist;
long ccount;
min = boxp->Rmin; min = boxp->Rmin;
max = boxp->Rmax; max = boxp->Rmax;
@@ -1942,14 +1931,6 @@ update_box_gray (CFHistogram histogram,
*/ */
dist = max - min; dist = max - min;
boxp->volume = dist * dist; boxp->volume = dist * dist;
/* Now scan remaining volume of box and compute population */
ccount = 0;
for (i = min; i <= max; i++)
if (histogram[i] != 0)
ccount++;
boxp->colorcount = ccount;
} }
static void static void
@@ -1962,7 +1943,6 @@ update_box_rgb (CFHistogram histogram,
int R,G,B; int R,G,B;
int Rmin,Rmax,Gmin,Gmax,Bmin,Bmax; int Rmin,Rmax,Gmin,Gmax,Bmin,Bmax;
int dist0,dist1,dist2; int dist0,dist1,dist2;
long ccount;
guint64 tempRerror; guint64 tempRerror;
guint64 tempGerror; guint64 tempGerror;
guint64 tempBerror; guint64 tempBerror;
@@ -2071,8 +2051,6 @@ update_box_rgb (CFHistogram histogram,
fflush(stdout);*/ fflush(stdout);*/
/* Now scan remaining volume of box and compute population */ /* Now scan remaining volume of box and compute population */
ccount = 0;
boxp->error = 0;
boxp->rerror = 0; boxp->rerror = 0;
boxp->gerror = 0; boxp->gerror = 0;
boxp->berror = 0; boxp->berror = 0;
@@ -2097,13 +2075,6 @@ update_box_rgb (CFHistogram histogram,
boxp->rerror += (*histp) * re*re; boxp->rerror += (*histp) * re*re;
boxp->gerror += (*histp) * ge*ge; boxp->gerror += (*histp) * ge*ge;
boxp->berror += (*histp) * be*be; boxp->berror += (*histp) * be*be;
boxp->error += (*histp) *
(
re*re*R_SCALE + ge*ge*G_SCALE + be*be*B_SCALE
);
ccount += *histp;
} }
} }
@@ -2198,26 +2169,7 @@ update_box_rgb (CFHistogram histogram,
} }
} }
finished_axesscan: finished_axesscan:
;
/*
boxp->Rhalferror = (Rmin+Rmax)/2;
boxp->Ghalferror = (Gmin+Gmax)/2;
boxp->Bhalferror = (Bmin+Bmax)/2;
*/
/*boxp->error = (sqrt((double)(boxp->error/ccount)));*/
/* boxp->rerror = (sqrt((double)((boxp->rerror)/ccount)));
boxp->gerror = (sqrt((double)((boxp->gerror)/ccount)));
boxp->berror = (sqrt((double)((boxp->berror)/ccount)));*/
/*printf(":%lld / %ld: ", boxp->error, ccount);
printf("(%d-%d-%d)(%d-%d-%d)(%d-%d-%d)\n",
Rmin, boxp->Rhalferror, Rmax,
Gmin, boxp->Ghalferror, Gmax,
Bmin, boxp->Bhalferror, Bmax
);
fflush(stdout);*/
boxp->colorcount = ccount;
} }
@@ -2236,13 +2188,6 @@ median_cut_gray (CFHistogram histogram,
/* Select box to split. /* Select box to split.
* Current algorithm: by population for first half, then by volume. * Current algorithm: by population for first half, then by volume.
*/ */
#if 0
if (numboxes*2 <= desired_colors)
{
b1 = find_biggest_color_pop (boxlist, numboxes);
}
else
#endif
{ {
b1 = find_biggest_volume (boxlist, numboxes); b1 = find_biggest_volume (boxlist, numboxes);
} }
@@ -2285,25 +2230,15 @@ median_cut_rgb (CFHistogram histogram,
boxptr b1,b2; boxptr b1,b2;
while (numboxes < desired_colors) { while (numboxes < desired_colors) {
#if 0
/* Select box to split.
* Current algorithm: by population for first half, then by volume.
*/
if (1 || numboxes*2 <= desired_colors)
{
g_print ("O ");
b1 = find_biggest_color_pop (boxlist, numboxes);
}
else
{
g_print (". ");
b1 = find_biggest_volume (boxlist, numboxes);
}
#endif
b1 = find_split_candidate (boxlist, numboxes); b1 = find_split_candidate (boxlist, numboxes);
if (b1 == NULL) /* no splittable boxes left! */ if (b1 == NULL) /* no splittable boxes left! */
break; {
/* g_warning ("No splittable boxes left."); */
break;
}
b2 = boxlist + numboxes; /* where new box will go */ b2 = boxlist + numboxes; /* where new box will go */
/* Copy the color bounds to the new box. */ /* Copy the color bounds to the new box. */
b2->Rmax = b1->Rmax; b2->Gmax = b1->Gmax; b2->Bmax = b1->Bmax; b2->Rmax = b1->Rmax; b2->Gmax = b1->Gmax; b2->Bmax = b1->Bmax;
@@ -2311,14 +2246,9 @@ median_cut_rgb (CFHistogram histogram,
/* Choose which axis to split the box on. /* Choose which axis to split the box on.
* See notes in update_box about scaling distances. * See notes in update_box about scaling distances.
*/ */
/* R = R_SCALE * b1->rerror;
R = ((b1->Rmax - b1->Rmin) << R_SHIFT) * R_SCALE; G = G_SCALE * b1->gerror;
G = ((b1->Gmax - b1->Gmin) << G_SHIFT) * G_SCALE; B = B_SCALE * b1->berror;
B = ((b1->Bmax - b1->Bmin) << B_SHIFT) * B_SCALE;
*/
R = R_SCALE*b1->rerror;/* * (((b1->Rmax - b1->Rmin) << R_SHIFT)) * R_SCALE; */
G = G_SCALE*b1->gerror;/* * (((b1->Gmax - b1->Gmin) << G_SHIFT)) * G_SCALE; */
B = B_SCALE*b1->berror;/* * (((b1->Bmax - b1->Bmin) << B_SHIFT)) * B_SCALE; */
/* We want to break any ties in favor of green, then red, blue last. /* We want to break any ties in favor of green, then red, blue last.
*/ */
cmax = G; n = 1; cmax = G; n = 1;
@@ -2331,31 +2261,63 @@ median_cut_rgb (CFHistogram histogram,
switch (n) switch (n)
{ {
case 0: case 0:
lb = b1->Rhalferror;/* *0 + (b1->Rmax + b1->Rmin) / 2; */ lb = b1->Rhalferror;
if (lb < b1->Rmin)
{
g_warning ("nope: b1->Rmax >= b1->Rmin");
b1->rerror = 0;
goto cut_again;
}
if (b2->Rmax < lb+1)
{
g_warning ("nope: b2->Rmax >= b2->Rmin");
b1->rerror = 0;
goto cut_again;
}
b1->Rmax = lb; b1->Rmax = lb;
b2->Rmin = lb+1; b2->Rmin = lb+1;
g_assert(b1->Rmax >= b1->Rmin);
g_assert(b2->Rmax >= b2->Rmin);
break; break;
case 1: case 1:
lb = b1->Ghalferror;/* *0 + (b1->Gmax + b1->Gmin) / 2; */ lb = b1->Ghalferror;
if (lb < b1->Gmin)
{
g_warning ("nope: b1->Gmax >= b1->Gmin");
b1->gerror = 0;
goto cut_again;
}
if (b2->Gmax < lb+1)
{
g_warning ("nope: b2->Gmax >= b2->Gmin");
b1->gerror = 0;
goto cut_again;
}
b1->Gmax = lb; b1->Gmax = lb;
b2->Gmin = lb+1; b2->Gmin = lb+1;
g_assert(b1->Gmax >= b1->Gmin);
g_assert(b2->Gmax >= b2->Gmin);
break; break;
case 2: case 2:
lb = b1->Bhalferror;/* *0 + (b1->Bmax + b1->Bmin) / 2; */ lb = b1->Bhalferror;
if (lb < b1->Bmin)
{
g_warning ("nope: b1->Bmax >= b1->Bmin");
b1->berror = 0;
goto cut_again;
}
if (b2->Bmax < lb+1)
{
g_warning ("nope: b2->Bmax >= b2->Bmin");
b1->berror = 0;
goto cut_again;
}
b1->Bmax = lb; b1->Bmax = lb;
b2->Bmin = lb+1; b2->Bmin = lb+1;
g_assert(b1->Bmax >= b1->Bmin);
g_assert(b2->Bmax >= b2->Bmin);
break; break;
} }
/* Update stats for boxes */ /* Update stats for boxes */
update_box_rgb (histogram, b1); update_box_rgb (histogram, b1);
update_box_rgb (histogram, b2); update_box_rgb (histogram, b2);
numboxes++; numboxes++;
cut_again:
;
} }
return numboxes; return numboxes;
} }
@@ -2960,12 +2922,13 @@ custompal_pass1 (QuantizeObj *quantobj)
GSList *list; GSList *list;
PaletteEntry *entry; PaletteEntry *entry;
/* fprintf(stderr, "custompal_pass1: using (theCustomPalette %s) from (file %s)\n", /* fprintf (stderr,
theCustomPalette->name, theCustomPalette->filename); */ "custompal_pass1: using (theCustomPalette %s) from (file %s)\n",
theCustomPalette->name, theCustomPalette->filename); */
for (i=0,list=theCustomPalette->colors; for (i = 0,list = theCustomPalette->colors;
list; i < 256 && list;
i++,list=g_slist_next(list)) i++, list = g_slist_next (list))
{ {
entry = (PaletteEntry *) list->data; entry = (PaletteEntry *) list->data;
quantobj->cmap[i].red = entry->color[0]; quantobj->cmap[i].red = entry->color[0];

View File

@@ -18,6 +18,8 @@
/* NOTE: This file is autogenerated by pdbgen.pl. */ /* NOTE: This file is autogenerated by pdbgen.pl. */
#include "config.h"
#include "procedural_db.h" #include "procedural_db.h"
#include <string.h> #include <string.h>

View File

@@ -1,941 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdlib.h>
#include <glib.h>
#include "apptypes.h"
#include "appenv.h"
#include "drawable.h"
#include "image_new.h"
#include "floating_sel.h"
#include "gdisplay.h"
#include "gimage.h"
#include "gimage_mask.h"
#include "gimpui.h"
#include "global_edit.h"
#include "layer.h"
#include "paint_funcs.h"
#include "tools.h"
#include "undo.h"
#include "libgimp/gimpintl.h"
#include "tile_manager_pvt.h"
#include "drawable_pvt.h"
typedef enum
{
PASTE,
PASTE_INTO,
PASTE_AS_NEW
} PasteAction;
/* The named paste dialog */
typedef struct _PasteNamedDlg PasteNamedDlg;
struct _PasteNamedDlg
{
GtkWidget *shell;
GtkWidget *list;
GDisplay *gdisp;
PasteAction action;
};
/* The named buffer structure... */
typedef struct _named_buffer NamedBuffer;
struct _named_buffer
{
TileManager *buf;
gchar *name;
};
/* The named buffer list */
static GSList *named_buffers = NULL;
/* The global edit buffer */
TileManager *global_buf = NULL;
/* Crop the buffer to the size of pixels with non-zero transparency */
TileManager *
crop_buffer (TileManager *tiles,
gboolean border)
{
PixelRegion PR;
TileManager *new_tiles;
gint bytes, alpha;
guchar *data;
gint empty;
gint x1, y1, x2, y2;
gint x, y;
gint ex, ey;
gint found;
void *pr;
guchar black[MAX_CHANNELS] = { 0, 0, 0, 0 };
bytes = tiles->bpp;
alpha = bytes - 1;
/* go through and calculate the bounds */
x1 = tiles->width;
y1 = tiles->height;
x2 = 0;
y2 = 0;
pixel_region_init (&PR, tiles, 0, 0, x1, y1, FALSE);
for (pr = pixel_regions_register (1, &PR); pr != NULL; pr = pixel_regions_process (pr))
{
data = PR.data + alpha;
ex = PR.x + PR.w;
ey = PR.y + PR.h;
for (y = PR.y; y < ey; y++)
{
found = FALSE;
for (x = PR.x; x < ex; x++, data+=bytes)
if (*data)
{
if (x < x1)
x1 = x;
if (x > x2)
x2 = x;
found = TRUE;
}
if (found)
{
if (y < y1)
y1 = y;
if (y > y2)
y2 = y;
}
}
}
x2 = CLAMP (x2 + 1, 0, tiles->width);
y2 = CLAMP (y2 + 1, 0, tiles->height);
empty = (x1 == tiles->width && y1 == tiles->height);
/* If there are no visible pixels, return NULL */
if (empty)
new_tiles = NULL;
/* If no cropping, return original buffer */
else if (x1 == 0 && y1 == 0 && x2 == tiles->width &&
y2 == tiles->height && border == 0)
new_tiles = tiles;
/* Otherwise, crop the original area */
else
{
PixelRegion srcPR, destPR;
int new_width, new_height;
new_width = (x2 - x1) + border * 2;
new_height = (y2 - y1) + border * 2;
new_tiles = tile_manager_new (new_width, new_height, bytes);
/* If there is a border, make sure to clear the new tiles first */
if (border)
{
pixel_region_init (&destPR, new_tiles, 0, 0, new_width, border, TRUE);
color_region (&destPR, black);
pixel_region_init (&destPR, new_tiles, 0, border, border, (y2 - y1), TRUE);
color_region (&destPR, black);
pixel_region_init (&destPR, new_tiles, new_width - border, border, border, (y2 - y1), TRUE);
color_region (&destPR, black);
pixel_region_init (&destPR, new_tiles, 0, new_height - border, new_width, border, TRUE);
color_region (&destPR, black);
}
pixel_region_init (&srcPR, tiles, x1, y1, (x2 - x1), (y2 - y1), FALSE);
pixel_region_init (&destPR, new_tiles, border, border, (x2 - x1), (y2 - y1), TRUE);
copy_region (&srcPR, &destPR);
new_tiles->x = x1;
new_tiles->y = y1;
}
return new_tiles;
}
TileManager *
edit_cut (GImage *gimage,
GimpDrawable *drawable)
{
TileManager *cut;
TileManager *cropped_cut;
gint empty;
if (!gimage || drawable == NULL)
return NULL;
/* Start a group undo */
undo_push_group_start (gimage, EDIT_CUT_UNDO);
/* See if the gimage mask is empty */
empty = gimage_mask_is_empty (gimage);
/* Next, cut the mask portion from the gimage */
cut = gimage_mask_extract (gimage, drawable, TRUE, FALSE, TRUE);
/* Only crop if the gimage mask wasn't empty */
if (cut && empty == FALSE)
{
cropped_cut = crop_buffer (cut, 0);
if (cropped_cut != cut)
tile_manager_destroy (cut);
}
else if (cut)
cropped_cut = cut;
else
cropped_cut = NULL;
if (cut)
image_new_reset_current_cut_buffer ();
/* end the group undo */
undo_push_group_end (gimage);
if (cropped_cut)
{
/* Free the old global edit buffer */
if (global_buf)
tile_manager_destroy (global_buf);
/* Set the global edit buffer */
global_buf = cropped_cut;
return cropped_cut;
}
else
return NULL;
}
TileManager *
edit_copy (GImage *gimage,
GimpDrawable *drawable)
{
TileManager *copy;
TileManager *cropped_copy;
gint empty;
if (!gimage || drawable == NULL)
return NULL;
/* See if the gimage mask is empty */
empty = gimage_mask_is_empty (gimage);
/* First, copy the masked portion of the gimage */
copy = gimage_mask_extract (gimage, drawable, FALSE, FALSE, TRUE);
/* Only crop if the gimage mask wasn't empty */
if (copy && empty == FALSE)
{
cropped_copy = crop_buffer (copy, 0);
if (cropped_copy != copy)
tile_manager_destroy (copy);
}
else if (copy)
cropped_copy = copy;
else
cropped_copy = NULL;
if(copy)
image_new_reset_current_cut_buffer();
if (cropped_copy)
{
/* Free the old global edit buffer */
if (global_buf)
tile_manager_destroy (global_buf);
/* Set the global edit buffer */
global_buf = cropped_copy;
return cropped_copy;
}
else
return NULL;
}
GimpLayer *
edit_paste (GImage *gimage,
GimpDrawable *drawable,
TileManager *paste,
gboolean paste_into)
{
Layer *layer;
gint x1, y1, x2, y2;
gint cx, cy;
/* Make a new layer: iff drawable == NULL,
* user is pasting into an empty display.
*/
if (drawable != NULL)
layer = layer_new_from_tiles (gimage,
gimp_drawable_type_with_alpha (drawable),
paste,
_("Pasted Layer"),
OPAQUE_OPACITY, NORMAL_MODE);
else
layer = layer_new_from_tiles (gimage,
gimp_image_base_type_with_alpha (gimage),
paste,
_("Pasted Layer"),
OPAQUE_OPACITY, NORMAL_MODE);
if (layer)
{
/* Start a group undo */
undo_push_group_start (gimage, EDIT_PASTE_UNDO);
/* Set the offsets to the center of the image */
if (drawable != NULL)
{
drawable_offsets (drawable, &cx, &cy);
drawable_mask_bounds (drawable, &x1, &y1, &x2, &y2);
cx += (x1 + x2) >> 1;
cy += (y1 + y2) >> 1;
}
else
{
cx = gimage->width >> 1;
cy = gimage->height >> 1;
}
GIMP_DRAWABLE (layer)->offset_x = cx - (GIMP_DRAWABLE (layer)->width >> 1);
GIMP_DRAWABLE (layer)->offset_y = cy - (GIMP_DRAWABLE (layer)->height >> 1);
/* If there is a selection mask clear it--
* this might not always be desired, but in general,
* it seems like the correct behavior.
*/
if (! gimage_mask_is_empty (gimage) && !paste_into)
channel_clear (gimage_get_mask (gimage));
/* if there's a drawable, add a new floating selection */
if (drawable != NULL)
{
floating_sel_attach (layer, drawable);
}
else
{
gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage);
gimage_add_layer (gimage, layer, 0);
}
/* end the group undo */
undo_push_group_end (gimage);
return layer;
}
return NULL;
}
gboolean
edit_paste_as_new (GImage *invoke,
TileManager *paste)
{
GImage *gimage;
Layer *layer;
GDisplay *gdisp;
if (!global_buf)
return FALSE;
/* create a new image (always of type RGB) */
gimage = gimage_new (paste->width, paste->height, RGB);
gimage_disable_undo (gimage);
gimp_image_set_resolution (gimage, invoke->xresolution, invoke->yresolution);
gimp_image_set_unit (gimage, invoke->unit);
layer = layer_new_from_tiles (gimage,
gimp_image_base_type_with_alpha (gimage),
paste,
_("Pasted Layer"),
OPAQUE_OPACITY, NORMAL_MODE);
if (layer)
{
/* add the new layer to the image */
gimp_drawable_set_gimage (GIMP_DRAWABLE (layer), gimage);
gimage_add_layer (gimage, layer, 0);
gimage_enable_undo (gimage);
gdisp = gdisplay_new (gimage, 0x0101);
gimp_context_set_display (gimp_context_get_user (), gdisp);
return TRUE;
}
return FALSE;
}
gboolean
edit_clear (GImage *gimage,
GimpDrawable *drawable)
{
TileManager *buf_tiles;
PixelRegion bufPR;
gint x1, y1, x2, y2;
guchar col[MAX_CHANNELS];
if (!gimage || drawable == NULL)
return FALSE;
gimage_get_background (gimage, drawable, col);
if (drawable_has_alpha (drawable))
col [drawable_bytes (drawable) - 1] = OPAQUE_OPACITY;
drawable_mask_bounds (drawable, &x1, &y1, &x2, &y2);
if (!(x2 - x1) || !(y2 - y1))
return TRUE; /* nothing to do, but the clear succeded */
buf_tiles = tile_manager_new ((x2 - x1), (y2 - y1), drawable_bytes (drawable));
pixel_region_init (&bufPR, buf_tiles, 0, 0, (x2 - x1), (y2 - y1), TRUE);
color_region (&bufPR, col);
pixel_region_init (&bufPR, buf_tiles, 0, 0, (x2 - x1), (y2 - y1), FALSE);
gimage_apply_image (gimage, drawable, &bufPR, 1, OPAQUE_OPACITY,
ERASE_MODE, NULL, x1, y1);
/* update the image */
drawable_update (drawable, x1, y1, (x2 - x1), (y2 - y1));
/* free the temporary tiles */
tile_manager_destroy (buf_tiles);
return TRUE;
}
gboolean
edit_fill (GImage *gimage,
GimpDrawable *drawable,
GimpFillType fill_type)
{
TileManager *buf_tiles;
PixelRegion bufPR;
gint x1, y1, x2, y2;
guchar col[MAX_CHANNELS];
if (!gimage || drawable == NULL)
return FALSE;
if (drawable_has_alpha (drawable))
col [drawable_bytes (drawable) - 1] = OPAQUE_OPACITY;
switch (fill_type)
{
case FOREGROUND_FILL:
gimage_get_foreground (gimage, drawable, col);
break;
case BACKGROUND_FILL:
gimage_get_background (gimage, drawable, col);
break;
case WHITE_FILL:
col[RED_PIX] = 255;
col[GREEN_PIX] = 255;
col[BLUE_PIX] = 255;
break;
case TRANSPARENT_FILL:
col[RED_PIX] = 0;
col[GREEN_PIX] = 0;
col[BLUE_PIX] = 0;
if (drawable_has_alpha (drawable))
col [drawable_bytes (drawable) - 1] = TRANSPARENT_OPACITY;
break;
case NO_FILL:
return TRUE; /* nothing to do, but the fill succeded */
default:
g_warning ("unknown fill type");
gimage_get_background (gimage, drawable, col);
break;
}
drawable_mask_bounds (drawable, &x1, &y1, &x2, &y2);
if (!(x2 - x1) || !(y2 - y1))
return TRUE; /* nothing to do, but the fill succeded */
buf_tiles = tile_manager_new ((x2 - x1), (y2 - y1), drawable_bytes (drawable));
pixel_region_init (&bufPR, buf_tiles, 0, 0, (x2 - x1), (y2 - y1), TRUE);
color_region (&bufPR, col);
pixel_region_init (&bufPR, buf_tiles, 0, 0, (x2 - x1), (y2 - y1), FALSE);
gimage_apply_image (gimage, drawable, &bufPR, 1, OPAQUE_OPACITY,
NORMAL_MODE, NULL, x1, y1);
/* update the image */
drawable_update (drawable, x1, y1, (x2 - x1), (y2 - y1));
/* free the temporary tiles */
tile_manager_destroy (buf_tiles);
return TRUE;
}
gboolean
global_edit_cut (GDisplay *gdisp)
{
/* stop any active tool */
active_tool_control (HALT, gdisp);
if (!edit_cut (gdisp->gimage, gimage_active_drawable (gdisp->gimage)))
return FALSE;
/* flush the display */
gdisplays_flush ();
return TRUE;
}
gboolean
global_edit_copy (GDisplay *gdisp)
{
if (!edit_copy (gdisp->gimage, gimage_active_drawable (gdisp->gimage)))
return FALSE;
return TRUE;
}
gboolean
global_edit_paste (GDisplay *gdisp,
gboolean paste_into)
{
/* stop any active tool */
active_tool_control (HALT, gdisp);
if (!edit_paste (gdisp->gimage, gimage_active_drawable (gdisp->gimage),
global_buf, paste_into))
return FALSE;
/* flush the display */
gdisplays_update_title (gdisp->gimage);
gdisplays_flush ();
return TRUE;
}
gboolean
global_edit_paste_as_new (GDisplay *gdisp)
{
if (!global_buf)
return FALSE;
/* stop any active tool */
active_tool_control (HALT, gdisp);
return edit_paste_as_new (gdisp->gimage, global_buf);
}
void
global_edit_free (void)
{
if (global_buf)
tile_manager_destroy (global_buf);
global_buf = NULL;
}
/*********************************************/
/* Named buffer operations */
static void
set_list_of_named_buffers (GtkWidget *list_widget)
{
GSList *list;
NamedBuffer *nb;
GtkWidget *list_item;
gtk_list_clear_items (GTK_LIST (list_widget), 0, -1);
for (list = named_buffers; list; list = g_slist_next (list))
{
nb = (NamedBuffer *) list->data;
list_item = gtk_list_item_new_with_label (nb->name);
gtk_container_add (GTK_CONTAINER (list_widget), list_item);
gtk_object_set_user_data (GTK_OBJECT (list_item), (gpointer) nb);
gtk_widget_show (list_item);
}
}
static void
named_buffer_paste_foreach (GtkWidget *widget,
gpointer data)
{
PasteNamedDlg *pn_dlg;
NamedBuffer *nb;
if (widget->state == GTK_STATE_SELECTED)
{
pn_dlg = (PasteNamedDlg *) data;
nb = (NamedBuffer *) gtk_object_get_user_data (GTK_OBJECT (widget));
switch (pn_dlg->action)
{
case PASTE:
edit_paste (pn_dlg->gdisp->gimage,
gimage_active_drawable (pn_dlg->gdisp->gimage),
nb->buf, FALSE);
break;
case PASTE_INTO:
edit_paste (pn_dlg->gdisp->gimage,
gimage_active_drawable (pn_dlg->gdisp->gimage),
nb->buf, TRUE);
break;
case PASTE_AS_NEW:
edit_paste_as_new (pn_dlg->gdisp->gimage, nb->buf);
break;
default:
break;
}
}
}
static void
named_buffer_paste_callback (GtkWidget *widget,
gpointer data)
{
PasteNamedDlg *pn_dlg;
pn_dlg = (PasteNamedDlg *) data;
pn_dlg->action = PASTE_INTO;
gtk_container_foreach ((GtkContainer *) pn_dlg->list,
named_buffer_paste_foreach, data);
/* Destroy the box */
gtk_widget_destroy (pn_dlg->shell);
g_free (pn_dlg);
/* flush the display */
gdisplays_flush ();
}
static void
named_buffer_paste_into_callback (GtkWidget *widget,
gpointer data)
{
PasteNamedDlg *pn_dlg;
pn_dlg = (PasteNamedDlg *) data;
pn_dlg->action = PASTE_INTO;
gtk_container_foreach ((GtkContainer *) pn_dlg->list,
named_buffer_paste_foreach, data);
/* Destroy the box */
gtk_widget_destroy (pn_dlg->shell);
g_free (pn_dlg);
/* flush the display */
gdisplays_flush ();
}
static void
named_buffer_paste_as_new_callback (GtkWidget *widget,
gpointer data)
{
PasteNamedDlg *pn_dlg;
pn_dlg = (PasteNamedDlg *) data;
pn_dlg->action = PASTE_AS_NEW;
gtk_container_foreach ((GtkContainer *) pn_dlg->list,
named_buffer_paste_foreach, data);
/* Destroy the box */
gtk_widget_destroy (pn_dlg->shell);
g_free (pn_dlg);
/* flush the display */
gdisplays_flush ();
}
static void
named_buffer_delete_foreach (GtkWidget *widget,
gpointer data)
{
PasteNamedDlg *pn_dlg;
NamedBuffer *nb;
if (widget->state == GTK_STATE_SELECTED)
{
pn_dlg = (PasteNamedDlg *) data;
nb = (NamedBuffer *) gtk_object_get_user_data (GTK_OBJECT (widget));
named_buffers = g_slist_remove (named_buffers, (void *) nb);
g_free (nb->name);
tile_manager_destroy (nb->buf);
g_free (nb);
}
}
static void
named_buffer_delete_callback (GtkWidget *widget,
gpointer data)
{
PasteNamedDlg *pn_dlg;
pn_dlg = (PasteNamedDlg *) data;
gtk_container_foreach ((GtkContainer*) pn_dlg->list,
named_buffer_delete_foreach, data);
set_list_of_named_buffers (pn_dlg->list);
}
static void
named_buffer_cancel_callback (GtkWidget *widget,
gpointer data)
{
PasteNamedDlg *pn_dlg;
pn_dlg = (PasteNamedDlg *) data;
/* Destroy the box */
gtk_widget_destroy (pn_dlg->shell);
g_free (pn_dlg);
}
static void
paste_named_buffer (GDisplay *gdisp)
{
PasteNamedDlg *pn_dlg;
GtkWidget *vbox;
GtkWidget *label;
GtkWidget *listbox;
GtkWidget *bbox;
GtkWidget *button;
gint i;
static gchar *paste_action_labels[] =
{
N_("Paste"),
N_("Paste Into"),
N_("Paste as New"),
};
static GtkSignalFunc paste_action_functions[] =
{
named_buffer_paste_callback,
named_buffer_paste_into_callback,
named_buffer_paste_as_new_callback,
};
pn_dlg = g_new (PasteNamedDlg, 1);
pn_dlg->gdisp = gdisp;
pn_dlg->shell =
gimp_dialog_new (_("Paste Named Buffer"), "paste_named_buffer",
gimp_standard_help_func,
"dialogs/paste_named.html",
GTK_WIN_POS_MOUSE,
FALSE, TRUE, FALSE,
_("Delete"), named_buffer_delete_callback,
pn_dlg, NULL, NULL, FALSE, FALSE,
_("Cancel"), named_buffer_cancel_callback,
pn_dlg, NULL, NULL, TRUE, TRUE,
NULL);
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 1);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (pn_dlg->shell)->vbox), vbox);
gtk_widget_show (vbox);
label = gtk_label_new (_("Select a buffer to paste:"));
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
gtk_widget_show (label);
listbox = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (listbox),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_box_pack_start (GTK_BOX (vbox), listbox, TRUE, TRUE, 0);
gtk_widget_set_usize (listbox, 125, 150);
gtk_widget_show (listbox);
pn_dlg->list = gtk_list_new ();
gtk_list_set_selection_mode (GTK_LIST (pn_dlg->list), GTK_SELECTION_BROWSE);
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (listbox),
pn_dlg->list);
set_list_of_named_buffers (pn_dlg->list);
gtk_widget_show (pn_dlg->list);
bbox = gtk_hbutton_box_new ();
gtk_container_set_border_width (GTK_CONTAINER (bbox), 6);
gtk_button_box_set_spacing (GTK_BUTTON_BOX (bbox), 2);
gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, FALSE, 0);
for (i = 0; i < 3; i++)
{
button = gtk_button_new_with_label (gettext (paste_action_labels[i]));
gtk_container_add (GTK_CONTAINER (bbox), button);
gtk_signal_connect (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) paste_action_functions[i],
pn_dlg);
gtk_widget_show (button);
}
gtk_widget_show (bbox);
gtk_widget_show (pn_dlg->shell);
}
static void
new_named_buffer (TileManager *tiles,
gchar *name)
{
PixelRegion srcPR, destPR;
NamedBuffer *nb;
if (! tiles) return;
nb = (NamedBuffer *) g_malloc (sizeof (NamedBuffer));
nb->buf = tile_manager_new (tiles->width, tiles->height, tiles->bpp);
pixel_region_init (&srcPR, tiles, 0, 0, tiles->width, tiles->height, FALSE);
pixel_region_init (&destPR, nb->buf, 0, 0, tiles->width, tiles->height, TRUE);
copy_region (&srcPR, &destPR);
nb->name = g_strdup ((char *) name);
named_buffers = g_slist_append (named_buffers, (void *) nb);
}
static void
cut_named_buffer_callback (GtkWidget *widget,
gchar *name,
gpointer data)
{
TileManager *new_tiles;
GDisplay *gdisp;
gdisp = (GDisplay *) data;
new_tiles = edit_cut (gdisp->gimage, gimage_active_drawable (gdisp->gimage));
if (new_tiles)
new_named_buffer (new_tiles, name);
gdisplays_flush ();
}
gboolean
named_edit_cut (GDisplay *gdisp)
{
GtkWidget *qbox;
/* stop any active tool */
active_tool_control (HALT, gdisp);
qbox = gimp_query_string_box (_("Cut Named"),
gimp_standard_help_func,
"dialogs/cut_named.html",
_("Enter a name for this buffer"),
NULL,
GTK_OBJECT (gdisp->gimage), "destroy",
cut_named_buffer_callback, gdisp);
gtk_widget_show (qbox);
return TRUE;
}
static void
copy_named_buffer_callback (GtkWidget *widget,
gchar *name,
gpointer data)
{
TileManager *new_tiles;
GDisplay *gdisp;
gdisp = (GDisplay *) data;
new_tiles = edit_copy (gdisp->gimage, gimage_active_drawable (gdisp->gimage));
if (new_tiles)
new_named_buffer (new_tiles, name);
}
gboolean
named_edit_copy (GDisplay *gdisp)
{
GtkWidget *qbox;
qbox = gimp_query_string_box (_("Copy Named"),
gimp_standard_help_func,
"dialogs/copy_named.html",
_("Enter a name for this buffer"),
NULL,
GTK_OBJECT (gdisp->gimage), "destroy",
copy_named_buffer_callback, gdisp);
gtk_widget_show (qbox);
return TRUE;
}
gboolean
named_edit_paste (GDisplay *gdisp)
{
paste_named_buffer (gdisp);
gdisplays_flush ();
return TRUE;
}
void
named_buffers_free (void)
{
GSList *list;
NamedBuffer *nb;
for (list = named_buffers; list; list = g_slist_next (list))
{
nb = (NamedBuffer *) list->data;
tile_manager_destroy (nb->buf);
g_free (nb->name);
g_free (nb);
}
g_slist_free (named_buffers);
named_buffers = NULL;
}

View File

@@ -1,54 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __GLOBAL_EDIT_H__
#define __GLOBAL_EDIT_H__
#include "gimage.h"
TileManager * crop_buffer (TileManager *tiles,
gint border);
TileManager * edit_cut (GImage *gimage,
GimpDrawable *drawable);
TileManager * edit_copy (GImage *gimage,
GimpDrawable *drawable);
GimpLayer * edit_paste (GImage *gimage,
GimpDrawable *drawable,
TileManager *paste,
gboolean paste_into);
gboolean edit_paste_as_new (GImage *gimage,
TileManager *tiles);
gboolean edit_clear (GImage *gimage,
GimpDrawable *drawable);
gboolean edit_fill (GImage *gimage,
GimpDrawable *drawable,
GimpFillType fill_type);
gboolean global_edit_cut (GDisplay *gdisp);
gboolean global_edit_copy (GDisplay *gdisp);
gboolean global_edit_paste (GDisplay *gdisp,
gboolean paste_into);
gboolean global_edit_paste_as_new (GDisplay *gdisp);
void global_edit_free (void);
gboolean named_edit_cut (GDisplay *gdisp);
gboolean named_edit_copy (GDisplay *gdisp);
gboolean named_edit_paste (GDisplay *gdisp);
void named_buffers_free (void);
#endif /* __GLOBAL_EDIT_H__ */

View File

@@ -1,179 +0,0 @@
/* gimpparasite.c: Copyright 1998 Jay Cox <jaycox@earthlink.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <gtk/gtk.h>
#include <stdio.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include "apptypes.h"
#include "app_procs.h"
#include "parasitelist.h"
#include "gimpparasite.h"
#include "gimprc.h"
#include "libgimp/gimpparasite.h"
#include "libgimp/gimpenv.h"
static ParasiteList *parasites = NULL;
void
gimp_init_parasites (void)
{
g_return_if_fail (parasites == NULL);
parasites = parasite_list_new ();
gimp_parasiterc_load ();
}
void
gimp_parasite_attach (GimpParasite *p)
{
parasite_list_add (parasites, p);
}
void
gimp_parasite_detach (const gchar *name)
{
parasite_list_remove (parasites, name);
}
GimpParasite *
gimp_parasite_find (const gchar *name)
{
return parasite_list_find (parasites, name);
}
static void
list_func (gchar *key,
GimpParasite *p,
gchar ***cur)
{
*(*cur)++ = (char *) g_strdup (key);
}
gchar **
gimp_parasite_list (gint *count)
{
gchar **list;
gchar **cur;
*count = parasite_list_length (parasites);
cur = list = g_new (gchar *, *count);
parasite_list_foreach (parasites, (GHFunc) list_func, &cur);
return list;
}
static void
save_func (gchar *key,
GimpParasite *p,
FILE *fp)
{
if (gimp_parasite_is_persistent (p))
{
gchar *s;
guint32 l;
fprintf (fp, "(parasite \"%s\" %lu \"",
gimp_parasite_name (p), gimp_parasite_flags (p));
/*
* the current methodology is: never move the parasiterc from one
* system to another. If you want to do this you should probably
* write out parasites which contain any non-alphanumeric(+some)
* characters as \xHH sequences altogether.
*/
for (s = (gchar *) gimp_parasite_data (p), l = gimp_parasite_data_size (p);
l;
l--, s++)
{
switch (*s)
{
case '\\': fputs ("\\\\", fp); break;
case '\0': fputs ("\\0", fp); break;
case '"' : fputs ("\\\"", fp); break;
/* disabled, not portable! */
/* case '\n': fputs ("\\n", fp); break;*/
/* case '\r': fputs ("\\r", fp); break;*/
case 26 : fputs ("\\z", fp); break;
default : fputc (*s, fp); break;
}
}
fputs ("\")\n\n", fp);
}
}
void
gimp_parasiterc_save (void)
{
gchar *filename;
FILE *fp;
filename = gimp_personal_rc_file ("#parasiterc.tmp~");
fp = fopen (filename, "w");
g_free (filename);
if (!fp)
return;
fprintf (fp,
"# GIMP parasiterc\n"
"# This file will be entirely rewritten every time you "
"quit the gimp.\n\n");
parasite_list_foreach (parasites, (GHFunc)save_func, fp);
fclose (fp);
#if defined(G_OS_WIN32) || defined(__EMX__)
/* First rename the old parasiterc out of the way */
unlink (gimp_personal_rc_file ("parasiterc.bak"));
rename (gimp_personal_rc_file ("parasiterc"),
gimp_personal_rc_file ("parasiterc.bak"));
#endif
if (rename (gimp_personal_rc_file ("#parasiterc.tmp~"),
gimp_personal_rc_file ("parasiterc")) != 0)
{
#if defined(G_OS_WIN32) || defined(__EMX__)
/* Rename the old parasiterc back */
rename (gimp_personal_rc_file ("parasiterc.bak"),
gimp_personal_rc_file ("parasiterc"));
#endif
unlink (gimp_personal_rc_file ("#parasiterc.tmp~"));
}
}
void
gimp_parasiterc_load (void)
{
gchar *filename;
filename = gimp_personal_rc_file ("parasiterc");
app_init_update_status (NULL, filename, -1);
parse_gimprc_file (filename);
g_free (filename);
}

View File

@@ -1,33 +0,0 @@
/* gimpparasite.h: Copyright 1998 Jay Cox <jaycox@earthlink.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __APP_GIMP_PARASITE_H__
#define __APP_GIMP_PARASITE_H__
#include "libgimp/gimpparasite.h"
void gimp_init_parasites (void);
void gimp_parasite_attach (GimpParasite *parasite);
void gimp_parasite_detach (const gchar *name);
GimpParasite * gimp_parasite_find (const gchar *name);
gchar ** gimp_parasite_list (gint *count);
void gimp_parasiterc_save (void);
void gimp_parasiterc_load (void);
#endif /* __APP_GIMP_PARASITE_H__ */

View File

@@ -1,44 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __BRUSH_HEADER_H__
#define __BRUSH_HEADER_H__
#define GBRUSH_FILE_VERSION 2
#define GBRUSH_MAGIC (('G' << 24) + ('I' << 16) + ('M' << 8) + ('P' << 0))
/* All field entries are MSB */
typedef struct _BrushHeader BrushHeader;
struct _BrushHeader
{
guint header_size; /* header_size = sizeof (BrushHeader) + brush name */
guint version; /* brush file version # */
guint width; /* width of brush */
guint height; /* height of brush */
guint bytes; /* depth of brush in bytes--always 1 */
guint magic_number; /* GIMP brush magic number */
guint spacing; /* brush spacing */
};
/* In a brush file, next comes the brush name, null-terminated. After that
* comes the brush data--width * height * bytes bytes of it...
*/
#endif /* ! __BRUSH_HEADER_H__ */

View File

@@ -1,403 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <fcntl.h>
#ifdef G_OS_WIN32
#include <io.h>
#endif
#ifndef _O_BINARY
#define _O_BINARY 0
#endif
#include <gtk/gtk.h>
#include <stdio.h>
#include "apptypes.h"
#include "libgimp/gimpvector.h"
#include "brush_header.h"
#include "pattern_header.h"
#include "gimpbrush.h"
#include "gimpbrushlist.h"
#include "gimpsignal.h"
#include "gimprc.h"
#include "paint_core.h"
#include "temp_buf.h"
#include "libgimp/gimpintl.h"
enum
{
DIRTY,
RENAME,
LAST_SIGNAL
};
static GimpBrush * gimp_brush_select_brush (PaintCore *paint_core);
static gboolean gimp_brush_want_null_motion (PaintCore *paint_core);
static guint gimp_brush_signals[LAST_SIGNAL];
static GimpObjectClass *parent_class;
static void
gimp_brush_destroy (GtkObject *object)
{
GimpBrush *brush = GIMP_BRUSH (object);
g_free (brush->filename);
g_free (brush->name);
if (brush->mask)
temp_buf_free (brush->mask);
if (GTK_OBJECT_CLASS (parent_class)->destroy)
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
static void
gimp_brush_class_init (GimpBrushClass *klass)
{
GtkObjectClass *object_class;
GtkType type;
object_class = GTK_OBJECT_CLASS (klass);
parent_class = gtk_type_class (gimp_object_get_type ());
type = object_class->type;
object_class->destroy = gimp_brush_destroy;
klass->select_brush = gimp_brush_select_brush;
klass->want_null_motion = gimp_brush_want_null_motion;
gimp_brush_signals[DIRTY] =
gimp_signal_new ("dirty", GTK_RUN_FIRST, type, 0, gimp_sigtype_void);
gimp_brush_signals[RENAME] =
gimp_signal_new ("rename", GTK_RUN_FIRST, type, 0, gimp_sigtype_void);
gtk_object_class_add_signals (object_class, gimp_brush_signals, LAST_SIGNAL);
}
void
gimp_brush_init (GimpBrush *brush)
{
brush->filename = NULL;
brush->name = NULL;
brush->spacing = 20;
brush->x_axis.x = 15.0;
brush->x_axis.y = 0.0;
brush->y_axis.x = 0.0;
brush->y_axis.y = 15.0;
brush->mask = NULL;
brush->pixmap = NULL;
}
GtkType
gimp_brush_get_type (void)
{
static GtkType type = 0;
if (!type)
{
static const GtkTypeInfo info =
{
"GimpBrush",
sizeof (GimpBrush),
sizeof (GimpBrushClass),
(GtkClassInitFunc) gimp_brush_class_init,
(GtkObjectInitFunc) gimp_brush_init,
/* reserved_1 */ NULL,
/* reserved_2 */ NULL,
(GtkClassInitFunc) NULL
};
type = gtk_type_unique (gimp_object_get_type (), &info);
}
return type;
}
GimpBrush *
gimp_brush_load (gchar *filename)
{
GimpBrush *brush;
gint fd;
g_return_val_if_fail (filename != NULL, NULL);
fd = open (filename, O_RDONLY | _O_BINARY);
if (fd == -1)
return NULL;
brush = gimp_brush_load_brush (fd, filename);
close (fd);
brush->filename = g_strdup (filename);
/* Swap the brush to disk (if we're being stingy with memory) */
if (stingy_memory_use)
{
temp_buf_swap (brush->mask);
if (brush->pixmap)
temp_buf_swap (brush->pixmap);
}
return brush;
}
static GimpBrush *
gimp_brush_select_brush (PaintCore *paint_core)
{
return paint_core->brush;
}
static gboolean
gimp_brush_want_null_motion (PaintCore *paint_core)
{
return TRUE;
}
TempBuf *
gimp_brush_get_mask (GimpBrush *brush)
{
g_return_val_if_fail (brush != NULL, NULL);
g_return_val_if_fail (GIMP_IS_BRUSH (brush), NULL);
return brush->mask;
}
TempBuf *
gimp_brush_get_pixmap (GimpBrush *brush)
{
g_return_val_if_fail (brush != NULL, NULL);
g_return_val_if_fail (GIMP_IS_BRUSH (brush), NULL);
return brush->pixmap;
}
gchar *
gimp_brush_get_name (GimpBrush *brush)
{
g_return_val_if_fail (brush != NULL, NULL);
g_return_val_if_fail (GIMP_IS_BRUSH (brush), NULL);
return brush->name;
}
void
gimp_brush_set_name (GimpBrush *brush,
gchar *name)
{
g_return_if_fail (brush != NULL);
g_return_if_fail (GIMP_IS_BRUSH (brush));
if (strcmp (brush->name, name) == 0)
return;
if (brush->name)
g_free (brush->name);
brush->name = g_strdup (name);
gtk_signal_emit (GTK_OBJECT (brush), gimp_brush_signals[RENAME]);
}
gint
gimp_brush_get_spacing (GimpBrush *brush)
{
g_return_val_if_fail (brush != NULL, 0);
g_return_val_if_fail (GIMP_IS_BRUSH (brush), 0);
return brush->spacing;
}
void
gimp_brush_set_spacing (GimpBrush *brush,
gint spacing)
{
g_return_if_fail (brush != NULL);
g_return_if_fail (GIMP_IS_BRUSH (brush));
brush->spacing = spacing;
}
GimpBrush *
gimp_brush_load_brush (gint fd,
gchar *filename)
{
GimpBrush *brush;
GPattern *pattern;
gint bn_size;
BrushHeader header;
gchar *name;
gint i;
g_return_val_if_fail (filename != NULL, NULL);
g_return_val_if_fail (fd != -1, NULL);
/* Read in the header size */
if (read (fd, &header, sizeof (header)) != sizeof (header))
return NULL;
/* rearrange the bytes in each unsigned int */
header.header_size = g_ntohl (header.header_size);
header.version = g_ntohl (header.version);
header.width = g_ntohl (header.width);
header.height = g_ntohl (header.height);
header.bytes = g_ntohl (header.bytes);
header.magic_number = g_ntohl (header.magic_number);
header.spacing = g_ntohl (header.spacing);
/* Check for correct file format */
/* It looks as if version 1 did not have the same magic number. (neo) */
if (header.version != 1 &&
(header.magic_number != GBRUSH_MAGIC || header.version != 2))
{
g_message (_("Unknown brush format version #%d in \"%s\"."),
header.version, filename);
return NULL;
}
if (header.version == 1)
{
/* If this is a version 1 brush, set the fp back 8 bytes */
lseek (fd, -8, SEEK_CUR);
header.header_size += 8;
/* spacing is not defined in version 1 */
header.spacing = 25;
}
/* Read in the brush name */
if ((bn_size = (header.header_size - sizeof (header))))
{
name = g_new (gchar, bn_size);
if ((read (fd, name, bn_size)) < bn_size)
{
g_message (_("Error in GIMP brush file \"%s\"."), filename);
g_free (name);
return NULL;
}
}
else
{
name = g_strdup (_("Unnamed"));
}
switch (header.bytes)
{
case 1:
brush = GIMP_BRUSH (gtk_type_new (gimp_brush_get_type ()));
brush->mask = temp_buf_new (header.width, header.height, 1,
0, 0, NULL);
if (read (fd,
temp_buf_data (brush->mask), header.width * header.height) <
header.width * header.height)
{
g_message (_("GIMP brush file appears to be truncated: \"%s\"."),
filename);
g_free (name);
gtk_object_unref (GTK_OBJECT (brush));
return NULL;
}
/* For backwards-compatibility, check if a pattern follows.
The obsolete .gpb format did it this way. */
pattern = pattern_load (fd, filename);
if (pattern)
{
if (pattern->mask && pattern->mask->bytes == 3)
{
brush->pixmap = pattern->mask;
pattern->mask = NULL;
}
pattern_free (pattern);
}
else
{
/* rewind to make brush pipe loader happy */
if (lseek (fd, - sizeof (PatternHeader), SEEK_CUR) < 0)
{
g_message (_("GIMP brush file appears to be corrupted: \"%s\"."),
filename);
g_free (name);
gtk_object_unref (GTK_OBJECT (brush));
return NULL;
}
}
break;
case 4:
brush = GIMP_BRUSH (gtk_type_new (gimp_brush_get_type ()));
brush->mask = temp_buf_new (header.width, header.height, 1, 0, 0, NULL);
brush->pixmap = temp_buf_new (header.width, header.height, 3, 0, 0, NULL);
for (i = 0; i < header.width * header.height; i++)
{
if (read (fd, temp_buf_data (brush->pixmap)
+ i * 3, 3) != 3 ||
read (fd, temp_buf_data (brush->mask) + i, 1) != 1)
{
g_message (_("GIMP brush file appears to be truncated: \"%s\"."),
filename);
g_free (name);
gtk_object_unref (GTK_OBJECT (brush));
return NULL;
}
}
break;
default:
g_message ("Unsupported brush depth: %d\n in file \"%s\"\nGIMP Brushes must be GRAY or RGBA\n",
header.bytes, filename);
g_free (name);
return NULL;
}
brush->name = name;
brush->spacing = header.spacing;
brush->x_axis.x = header.width / 2.0;
brush->x_axis.y = 0.0;
brush->y_axis.x = 0.0;
brush->y_axis.y = header.height / 2.0;
return brush;
}

View File

@@ -1,403 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <fcntl.h>
#ifdef G_OS_WIN32
#include <io.h>
#endif
#ifndef _O_BINARY
#define _O_BINARY 0
#endif
#include <gtk/gtk.h>
#include <stdio.h>
#include "apptypes.h"
#include "libgimp/gimpvector.h"
#include "brush_header.h"
#include "pattern_header.h"
#include "gimpbrush.h"
#include "gimpbrushlist.h"
#include "gimpsignal.h"
#include "gimprc.h"
#include "paint_core.h"
#include "temp_buf.h"
#include "libgimp/gimpintl.h"
enum
{
DIRTY,
RENAME,
LAST_SIGNAL
};
static GimpBrush * gimp_brush_select_brush (PaintCore *paint_core);
static gboolean gimp_brush_want_null_motion (PaintCore *paint_core);
static guint gimp_brush_signals[LAST_SIGNAL];
static GimpObjectClass *parent_class;
static void
gimp_brush_destroy (GtkObject *object)
{
GimpBrush *brush = GIMP_BRUSH (object);
g_free (brush->filename);
g_free (brush->name);
if (brush->mask)
temp_buf_free (brush->mask);
if (GTK_OBJECT_CLASS (parent_class)->destroy)
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
static void
gimp_brush_class_init (GimpBrushClass *klass)
{
GtkObjectClass *object_class;
GtkType type;
object_class = GTK_OBJECT_CLASS (klass);
parent_class = gtk_type_class (gimp_object_get_type ());
type = object_class->type;
object_class->destroy = gimp_brush_destroy;
klass->select_brush = gimp_brush_select_brush;
klass->want_null_motion = gimp_brush_want_null_motion;
gimp_brush_signals[DIRTY] =
gimp_signal_new ("dirty", GTK_RUN_FIRST, type, 0, gimp_sigtype_void);
gimp_brush_signals[RENAME] =
gimp_signal_new ("rename", GTK_RUN_FIRST, type, 0, gimp_sigtype_void);
gtk_object_class_add_signals (object_class, gimp_brush_signals, LAST_SIGNAL);
}
void
gimp_brush_init (GimpBrush *brush)
{
brush->filename = NULL;
brush->name = NULL;
brush->spacing = 20;
brush->x_axis.x = 15.0;
brush->x_axis.y = 0.0;
brush->y_axis.x = 0.0;
brush->y_axis.y = 15.0;
brush->mask = NULL;
brush->pixmap = NULL;
}
GtkType
gimp_brush_get_type (void)
{
static GtkType type = 0;
if (!type)
{
static const GtkTypeInfo info =
{
"GimpBrush",
sizeof (GimpBrush),
sizeof (GimpBrushClass),
(GtkClassInitFunc) gimp_brush_class_init,
(GtkObjectInitFunc) gimp_brush_init,
/* reserved_1 */ NULL,
/* reserved_2 */ NULL,
(GtkClassInitFunc) NULL
};
type = gtk_type_unique (gimp_object_get_type (), &info);
}
return type;
}
GimpBrush *
gimp_brush_load (gchar *filename)
{
GimpBrush *brush;
gint fd;
g_return_val_if_fail (filename != NULL, NULL);
fd = open (filename, O_RDONLY | _O_BINARY);
if (fd == -1)
return NULL;
brush = gimp_brush_load_brush (fd, filename);
close (fd);
brush->filename = g_strdup (filename);
/* Swap the brush to disk (if we're being stingy with memory) */
if (stingy_memory_use)
{
temp_buf_swap (brush->mask);
if (brush->pixmap)
temp_buf_swap (brush->pixmap);
}
return brush;
}
static GimpBrush *
gimp_brush_select_brush (PaintCore *paint_core)
{
return paint_core->brush;
}
static gboolean
gimp_brush_want_null_motion (PaintCore *paint_core)
{
return TRUE;
}
TempBuf *
gimp_brush_get_mask (GimpBrush *brush)
{
g_return_val_if_fail (brush != NULL, NULL);
g_return_val_if_fail (GIMP_IS_BRUSH (brush), NULL);
return brush->mask;
}
TempBuf *
gimp_brush_get_pixmap (GimpBrush *brush)
{
g_return_val_if_fail (brush != NULL, NULL);
g_return_val_if_fail (GIMP_IS_BRUSH (brush), NULL);
return brush->pixmap;
}
gchar *
gimp_brush_get_name (GimpBrush *brush)
{
g_return_val_if_fail (brush != NULL, NULL);
g_return_val_if_fail (GIMP_IS_BRUSH (brush), NULL);
return brush->name;
}
void
gimp_brush_set_name (GimpBrush *brush,
gchar *name)
{
g_return_if_fail (brush != NULL);
g_return_if_fail (GIMP_IS_BRUSH (brush));
if (strcmp (brush->name, name) == 0)
return;
if (brush->name)
g_free (brush->name);
brush->name = g_strdup (name);
gtk_signal_emit (GTK_OBJECT (brush), gimp_brush_signals[RENAME]);
}
gint
gimp_brush_get_spacing (GimpBrush *brush)
{
g_return_val_if_fail (brush != NULL, 0);
g_return_val_if_fail (GIMP_IS_BRUSH (brush), 0);
return brush->spacing;
}
void
gimp_brush_set_spacing (GimpBrush *brush,
gint spacing)
{
g_return_if_fail (brush != NULL);
g_return_if_fail (GIMP_IS_BRUSH (brush));
brush->spacing = spacing;
}
GimpBrush *
gimp_brush_load_brush (gint fd,
gchar *filename)
{
GimpBrush *brush;
GPattern *pattern;
gint bn_size;
BrushHeader header;
gchar *name;
gint i;
g_return_val_if_fail (filename != NULL, NULL);
g_return_val_if_fail (fd != -1, NULL);
/* Read in the header size */
if (read (fd, &header, sizeof (header)) != sizeof (header))
return NULL;
/* rearrange the bytes in each unsigned int */
header.header_size = g_ntohl (header.header_size);
header.version = g_ntohl (header.version);
header.width = g_ntohl (header.width);
header.height = g_ntohl (header.height);
header.bytes = g_ntohl (header.bytes);
header.magic_number = g_ntohl (header.magic_number);
header.spacing = g_ntohl (header.spacing);
/* Check for correct file format */
/* It looks as if version 1 did not have the same magic number. (neo) */
if (header.version != 1 &&
(header.magic_number != GBRUSH_MAGIC || header.version != 2))
{
g_message (_("Unknown brush format version #%d in \"%s\"."),
header.version, filename);
return NULL;
}
if (header.version == 1)
{
/* If this is a version 1 brush, set the fp back 8 bytes */
lseek (fd, -8, SEEK_CUR);
header.header_size += 8;
/* spacing is not defined in version 1 */
header.spacing = 25;
}
/* Read in the brush name */
if ((bn_size = (header.header_size - sizeof (header))))
{
name = g_new (gchar, bn_size);
if ((read (fd, name, bn_size)) < bn_size)
{
g_message (_("Error in GIMP brush file \"%s\"."), filename);
g_free (name);
return NULL;
}
}
else
{
name = g_strdup (_("Unnamed"));
}
switch (header.bytes)
{
case 1:
brush = GIMP_BRUSH (gtk_type_new (gimp_brush_get_type ()));
brush->mask = temp_buf_new (header.width, header.height, 1,
0, 0, NULL);
if (read (fd,
temp_buf_data (brush->mask), header.width * header.height) <
header.width * header.height)
{
g_message (_("GIMP brush file appears to be truncated: \"%s\"."),
filename);
g_free (name);
gtk_object_unref (GTK_OBJECT (brush));
return NULL;
}
/* For backwards-compatibility, check if a pattern follows.
The obsolete .gpb format did it this way. */
pattern = pattern_load (fd, filename);
if (pattern)
{
if (pattern->mask && pattern->mask->bytes == 3)
{
brush->pixmap = pattern->mask;
pattern->mask = NULL;
}
pattern_free (pattern);
}
else
{
/* rewind to make brush pipe loader happy */
if (lseek (fd, - sizeof (PatternHeader), SEEK_CUR) < 0)
{
g_message (_("GIMP brush file appears to be corrupted: \"%s\"."),
filename);
g_free (name);
gtk_object_unref (GTK_OBJECT (brush));
return NULL;
}
}
break;
case 4:
brush = GIMP_BRUSH (gtk_type_new (gimp_brush_get_type ()));
brush->mask = temp_buf_new (header.width, header.height, 1, 0, 0, NULL);
brush->pixmap = temp_buf_new (header.width, header.height, 3, 0, 0, NULL);
for (i = 0; i < header.width * header.height; i++)
{
if (read (fd, temp_buf_data (brush->pixmap)
+ i * 3, 3) != 3 ||
read (fd, temp_buf_data (brush->mask) + i, 1) != 1)
{
g_message (_("GIMP brush file appears to be truncated: \"%s\"."),
filename);
g_free (name);
gtk_object_unref (GTK_OBJECT (brush));
return NULL;
}
}
break;
default:
g_message ("Unsupported brush depth: %d\n in file \"%s\"\nGIMP Brushes must be GRAY or RGBA\n",
header.bytes, filename);
g_free (name);
return NULL;
}
brush->name = name;
brush->spacing = header.spacing;
brush->x_axis.x = header.width / 2.0;
brush->x_axis.y = 0.0;
brush->y_axis.x = 0.0;
brush->y_axis.y = header.height / 2.0;
return brush;
}

View File

@@ -1,75 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __GIMP_BRUSH_H__
#define __GIMP_BRUSH_H__
#include "gimpobject.h"
#include "temp_buf.h"
#include "libgimp/gimpvector.h"
typedef struct _GimpBrushClass GimpBrushClass;
struct _GimpBrush
{
GimpObject gobject;
gchar *filename; /* actual filename--brush's location on disk */
gchar *name; /* brush's name--for brush selection dialog */
gint spacing; /* brush's spacing */
GimpVector2 x_axis; /* for calculating brush spacing */
GimpVector2 y_axis; /* for calculating brush spacing */
TempBuf *mask; /* the actual mask */
TempBuf *pixmap; /* optional pixmap data */
};
struct _GimpBrushClass
{
GimpObjectClass parent_class;
GimpBrush * (* select_brush) (PaintCore *paint_core);
gboolean (* want_null_motion) (PaintCore *paint_core);
};
#define GIMP_BRUSH_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, gimp_brush_get_type(), GimpBrushClass)
#define GIMP_TYPE_BRUSH (gimp_brush_get_type ())
#define GIMP_BRUSH(obj) (GTK_CHECK_CAST ((obj), GIMP_TYPE_BRUSH, GimpBrush))
#define GIMP_IS_BRUSH(obj) (GTK_CHECK_TYPE ((obj), GIMP_TYPE_BRUSH))
GtkType gimp_brush_get_type (void);
GimpBrush * gimp_brush_load (gchar *filename);
GimpBrush * gimp_brush_load_brush (gint fd,
gchar *filename);
TempBuf * gimp_brush_get_mask (GimpBrush *brush);
TempBuf * gimp_brush_get_pixmap (GimpBrush *brush);
gchar * gimp_brush_get_name (GimpBrush *brush);
void gimp_brush_set_name (GimpBrush *brush,
gchar *name);
gint gimp_brush_get_spacing (GimpBrush *brush);
void gimp_brush_set_spacing (GimpBrush *brush,
gint spacing);
#endif /* __GIMP_BRUSH_H__ */

View File

@@ -1,528 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimp_brush_generated module Copyright 1998 Jay Cox <jaycox@earthlink.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdio.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <glib.h>
#include "apptypes.h"
#include "appenv.h"
#include "gimpbrushgenerated.h"
#include "paint_core.h"
#include "gimprc.h"
#include "gimpbrush.h"
#include "libgimp/gimpmath.h"
#define OVERSAMPLING 5
static void gimp_brush_generated_generate (GimpBrushGenerated *brush);
static GimpObjectClass *parent_class = NULL;
static void
gimp_brush_generated_destroy (GtkObject *object)
{
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
static void
gimp_brush_generated_class_init (GimpBrushGeneratedClass *klass)
{
GtkObjectClass *object_class;
object_class = GTK_OBJECT_CLASS (klass);
parent_class = gtk_type_class (GIMP_TYPE_BRUSH);
object_class->destroy = gimp_brush_generated_destroy;
}
static void
gimp_brush_generated_init (GimpBrushGenerated *brush)
{
brush->radius = 5.0;
brush->hardness = 0.0;
brush->angle = 0.0;
brush->aspect_ratio = 1.0;
brush->freeze = 0;
}
guint
gimp_brush_generated_get_type (void)
{
static GtkType type = 0;
if (!type)
{
GtkTypeInfo info =
{
"GimpBrushGenerated",
sizeof (GimpBrushGenerated),
sizeof (GimpBrushGeneratedClass),
(GtkClassInitFunc) gimp_brush_generated_class_init,
(GtkObjectInitFunc) gimp_brush_generated_init,
/* reserved_1 */ NULL,
/* reserved_2 */ NULL,
(GtkClassInitFunc) NULL
};
type = gtk_type_unique (GIMP_TYPE_BRUSH, &info);
}
return type;
}
GimpBrush *
gimp_brush_generated_new (gfloat radius,
gfloat hardness,
gfloat angle,
gfloat aspect_ratio)
{
GimpBrushGenerated *brush;
/* set up normal brush data */
brush =
GIMP_BRUSH_GENERATED (gtk_type_new (gimp_brush_generated_get_type ()));
GIMP_BRUSH (brush)->name = g_strdup ("Untitled");
GIMP_BRUSH (brush)->spacing = 20;
/* set up gimp_brush_generated data */
brush->radius = radius;
brush->hardness = hardness;
brush->angle = angle;
brush->aspect_ratio = aspect_ratio;
/* render brush mask */
gimp_brush_generated_generate (brush);
return GIMP_BRUSH (brush);
}
GimpBrush *
gimp_brush_generated_load (const gchar *file_name)
{
GimpBrushGenerated *brush;
FILE *fp;
gchar string[256];
gfloat fl;
gfloat version;
if ((fp = fopen (file_name, "rb")) == NULL)
return NULL;
/* make sure the file we are reading is the right type */
fgets (string, 255, fp);
if (strncmp (string, "GIMP-VBR", 8) != 0)
return NULL;
/* make sure we are reading a compatible version */
fgets (string, 255, fp);
sscanf (string, "%f", &version);
g_return_val_if_fail (version < 2.0, NULL);
/* create new brush */
brush =
GIMP_BRUSH_GENERATED (gtk_type_new (gimp_brush_generated_get_type ()));
GIMP_BRUSH (brush)->filename = g_strdup (file_name);
gimp_brush_generated_freeze (brush);
/* read name */
fgets (string, 255, fp);
if (string[strlen (string) - 1] == '\n')
string[strlen (string) - 1] = 0;
GIMP_BRUSH (brush)->name = g_strdup (string);
/* read brush spacing */
fscanf (fp, "%f", &fl);
GIMP_BRUSH (brush)->spacing = fl;
/* read brush radius */
fscanf (fp, "%f", &fl);
gimp_brush_generated_set_radius (brush, fl);
/* read brush hardness */
fscanf (fp, "%f", &fl);
gimp_brush_generated_set_hardness (brush, fl);
/* read brush aspect_ratio */
fscanf (fp, "%f", &fl);
gimp_brush_generated_set_aspect_ratio (brush, fl);
/* read brush angle */
fscanf (fp, "%f", &fl);
gimp_brush_generated_set_angle (brush, fl);
fclose (fp);
gimp_brush_generated_thaw (brush);
if (stingy_memory_use)
temp_buf_swap (GIMP_BRUSH (brush)->mask);
return GIMP_BRUSH (brush);
}
void
gimp_brush_generated_save (GimpBrushGenerated *brush,
const gchar *file_name)
{
FILE *fp;
if ((fp = fopen (file_name, "wb")) == NULL)
{
g_warning ("Unable to save file %s", file_name);
return;
}
/* write magic header */
fprintf (fp, "GIMP-VBR\n");
/* write version */
fprintf (fp, "1.0\n");
/* write name */
fprintf (fp, "%.255s\n", GIMP_BRUSH (brush)->name);
/* write brush spacing */
fprintf (fp, "%f\n", (float) GIMP_BRUSH (brush)->spacing);
/* write brush radius */
fprintf (fp, "%f\n", brush->radius);
/* write brush hardness */
fprintf (fp, "%f\n", brush->hardness);
/* write brush aspect_ratio */
fprintf (fp, "%f\n", brush->aspect_ratio);
/* write brush angle */
fprintf (fp, "%f\n", brush->angle);
fclose (fp);
}
void
gimp_brush_generated_delete (GimpBrushGenerated *brush)
{
if (GIMP_BRUSH (brush)->filename)
{
unlink (GIMP_BRUSH (brush)->filename);
}
}
void
gimp_brush_generated_freeze (GimpBrushGenerated *brush)
{
g_return_if_fail (brush != NULL);
g_return_if_fail (GIMP_IS_BRUSH_GENERATED (brush));
brush->freeze++;
}
void
gimp_brush_generated_thaw (GimpBrushGenerated *brush)
{
g_return_if_fail (brush != NULL);
g_return_if_fail (GIMP_IS_BRUSH_GENERATED (brush));
if (brush->freeze > 0)
brush->freeze--;
if (brush->freeze == 0)
gimp_brush_generated_generate (brush);
}
static double
gauss (gdouble f)
{
/* this aint' a real gauss function */
if (f < -.5)
{
f = -1.0 - f;
return (2.0 * f*f);
}
if (f < .5)
return (1.0 - 2.0 * f*f);
f = 1.0 -f;
return (2.0 * f*f);
}
void
gimp_brush_generated_generate (GimpBrushGenerated *brush)
{
register GimpBrush *gbrush = NULL;
register gint x, y;
register guchar *centerp;
register gdouble d;
register gdouble exponent;
register guchar a;
register gint length;
register guchar *lookup;
register gdouble sum, c, s, tx, ty;
gdouble buffer[OVERSAMPLING];
gint width, height;
g_return_if_fail (brush != NULL);
g_return_if_fail (GIMP_IS_BRUSH_GENERATED (brush));
if (brush->freeze) /* if we are frozen defer rerendering till later */
return;
gbrush = GIMP_BRUSH (brush);
if (stingy_memory_use && gbrush->mask)
temp_buf_unswap (gbrush->mask);
if (gbrush->mask)
{
temp_buf_free(gbrush->mask);
}
/* compute the range of the brush. should do a better job than this? */
s = sin (gimp_deg_to_rad (brush->angle));
c = cos (gimp_deg_to_rad (brush->angle));
tx = MAX (fabs (c*ceil (brush->radius) - s*ceil (brush->radius)
/ brush->aspect_ratio),
fabs (c*ceil (brush->radius) + s*ceil (brush->radius)
/ brush->aspect_ratio));
ty = MAX (fabs (s*ceil (brush->radius) + c*ceil (brush->radius)
/ brush->aspect_ratio),
fabs (s*ceil (brush->radius) - c*ceil (brush->radius)
/ brush->aspect_ratio));
if (brush->radius > tx)
width = ceil (tx);
else
width = ceil (brush->radius);
if (brush->radius > ty)
height = ceil (ty);
else
height = ceil (brush->radius);
/* compute the axis for spacing */
GIMP_BRUSH (brush)->x_axis.x = c * brush->radius;
GIMP_BRUSH (brush)->x_axis.y = -1.0 * s * brush->radius;
GIMP_BRUSH (brush)->y_axis.x = (s * brush->radius / brush->aspect_ratio);
GIMP_BRUSH (brush)->y_axis.y = (c * brush->radius / brush->aspect_ratio);
gbrush->mask = temp_buf_new (width * 2 + 1,
height * 2 + 1,
1, width, height, 0);
centerp = &gbrush->mask->data[height * gbrush->mask->width + width];
if ((1.0 - brush->hardness) < 0.000001)
exponent = 1000000;
else
exponent = 1/(1.0 - brush->hardness);
/* set up lookup table */
length = ceil (sqrt (2 * ceil (brush->radius+1) * ceil (brush->radius+1))+1) * OVERSAMPLING;
lookup = g_malloc (length);
sum = 0.0;
for (x = 0; x < OVERSAMPLING; x++)
{
d = fabs ((x + 0.5) / OVERSAMPLING - 0.5);
if (d > brush->radius)
buffer[x] = 0.0;
else
/* buffer[x] = (1.0 - pow (d/brush->radius, exponent)); */
buffer[x] = gauss (pow (d/brush->radius, exponent));
sum += buffer[x];
}
for (x = 0; d < brush->radius || sum > 0.00001; d += 1.0 / OVERSAMPLING)
{
sum -= buffer[x % OVERSAMPLING];
if (d > brush->radius)
buffer[x % OVERSAMPLING] = 0.0;
else
/* buffer[x%OVERSAMPLING] = (1.0 - pow (d/brush->radius, exponent)); */
buffer[x % OVERSAMPLING] = gauss (pow (d/brush->radius, exponent));
sum += buffer[x%OVERSAMPLING];
lookup[x++] = RINT (sum * (255.0 / OVERSAMPLING));
}
while (x < length)
{
lookup[x++] = 0;
}
/* compute one half and mirror it */
for (y = 0; y <= height; y++)
{
for (x = -width; x <= width; x++)
{
tx = c*x - s*y;
ty = c*y + s*x;
ty *= brush->aspect_ratio;
d = sqrt (tx*tx + ty*ty);
if (d < brush->radius+1)
a = lookup[(gint) RINT (d * OVERSAMPLING)];
else
a = 0;
centerp[ y*gbrush->mask->width + x] = a;
centerp[-1*y*gbrush->mask->width - x] = a;
}
}
g_free (lookup);
gtk_signal_emit_by_name (GTK_OBJECT (brush), "dirty");
}
gfloat
gimp_brush_generated_set_radius (GimpBrushGenerated *brush,
gfloat radius)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
if (radius < 0.0)
radius = 0.0;
else if (radius > 32767.0)
radius = 32767.0;
if (radius == brush->radius)
return radius;
brush->radius = radius;
if (!brush->freeze)
gimp_brush_generated_generate (brush);
return brush->radius;
}
gfloat
gimp_brush_generated_set_hardness (GimpBrushGenerated *brush,
gfloat hardness)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
if (hardness < 0.0)
hardness = 0.0;
else if (hardness > 1.0)
hardness = 1.0;
if (brush->hardness == hardness)
return hardness;
brush->hardness = hardness;
if (!brush->freeze)
gimp_brush_generated_generate (brush);
return brush->hardness;
}
gfloat
gimp_brush_generated_set_angle (GimpBrushGenerated *brush,
gfloat angle)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
if (angle < 0.0)
angle = -1.0 * fmod (angle, 180.0);
else if (angle > 180.0)
angle = fmod (angle, 180.0);
if (brush->angle == angle)
return angle;
brush->angle = angle;
if (!brush->freeze)
gimp_brush_generated_generate (brush);
return brush->angle;
}
gfloat
gimp_brush_generated_set_aspect_ratio (GimpBrushGenerated *brush,
gfloat ratio)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
if (ratio < 1.0)
ratio = 1.0;
else if (ratio > 1000)
ratio = 1000;
if (brush->aspect_ratio == ratio)
return ratio;
brush->aspect_ratio = ratio;
if (!brush->freeze)
gimp_brush_generated_generate(brush);
return brush->aspect_ratio;
}
gfloat
gimp_brush_generated_get_radius (const GimpBrushGenerated *brush)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
return brush->radius;
}
gfloat
gimp_brush_generated_get_hardness (const GimpBrushGenerated *brush)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
return brush->hardness;
}
gfloat
gimp_brush_generated_get_angle (const GimpBrushGenerated *brush)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
return brush->angle;
}
gfloat
gimp_brush_generated_get_aspect_ratio (const GimpBrushGenerated *brush)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
return brush->aspect_ratio;
}

View File

@@ -1,528 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimp_brush_generated module Copyright 1998 Jay Cox <jaycox@earthlink.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdio.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <glib.h>
#include "apptypes.h"
#include "appenv.h"
#include "gimpbrushgenerated.h"
#include "paint_core.h"
#include "gimprc.h"
#include "gimpbrush.h"
#include "libgimp/gimpmath.h"
#define OVERSAMPLING 5
static void gimp_brush_generated_generate (GimpBrushGenerated *brush);
static GimpObjectClass *parent_class = NULL;
static void
gimp_brush_generated_destroy (GtkObject *object)
{
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
static void
gimp_brush_generated_class_init (GimpBrushGeneratedClass *klass)
{
GtkObjectClass *object_class;
object_class = GTK_OBJECT_CLASS (klass);
parent_class = gtk_type_class (GIMP_TYPE_BRUSH);
object_class->destroy = gimp_brush_generated_destroy;
}
static void
gimp_brush_generated_init (GimpBrushGenerated *brush)
{
brush->radius = 5.0;
brush->hardness = 0.0;
brush->angle = 0.0;
brush->aspect_ratio = 1.0;
brush->freeze = 0;
}
guint
gimp_brush_generated_get_type (void)
{
static GtkType type = 0;
if (!type)
{
GtkTypeInfo info =
{
"GimpBrushGenerated",
sizeof (GimpBrushGenerated),
sizeof (GimpBrushGeneratedClass),
(GtkClassInitFunc) gimp_brush_generated_class_init,
(GtkObjectInitFunc) gimp_brush_generated_init,
/* reserved_1 */ NULL,
/* reserved_2 */ NULL,
(GtkClassInitFunc) NULL
};
type = gtk_type_unique (GIMP_TYPE_BRUSH, &info);
}
return type;
}
GimpBrush *
gimp_brush_generated_new (gfloat radius,
gfloat hardness,
gfloat angle,
gfloat aspect_ratio)
{
GimpBrushGenerated *brush;
/* set up normal brush data */
brush =
GIMP_BRUSH_GENERATED (gtk_type_new (gimp_brush_generated_get_type ()));
GIMP_BRUSH (brush)->name = g_strdup ("Untitled");
GIMP_BRUSH (brush)->spacing = 20;
/* set up gimp_brush_generated data */
brush->radius = radius;
brush->hardness = hardness;
brush->angle = angle;
brush->aspect_ratio = aspect_ratio;
/* render brush mask */
gimp_brush_generated_generate (brush);
return GIMP_BRUSH (brush);
}
GimpBrush *
gimp_brush_generated_load (const gchar *file_name)
{
GimpBrushGenerated *brush;
FILE *fp;
gchar string[256];
gfloat fl;
gfloat version;
if ((fp = fopen (file_name, "rb")) == NULL)
return NULL;
/* make sure the file we are reading is the right type */
fgets (string, 255, fp);
if (strncmp (string, "GIMP-VBR", 8) != 0)
return NULL;
/* make sure we are reading a compatible version */
fgets (string, 255, fp);
sscanf (string, "%f", &version);
g_return_val_if_fail (version < 2.0, NULL);
/* create new brush */
brush =
GIMP_BRUSH_GENERATED (gtk_type_new (gimp_brush_generated_get_type ()));
GIMP_BRUSH (brush)->filename = g_strdup (file_name);
gimp_brush_generated_freeze (brush);
/* read name */
fgets (string, 255, fp);
if (string[strlen (string) - 1] == '\n')
string[strlen (string) - 1] = 0;
GIMP_BRUSH (brush)->name = g_strdup (string);
/* read brush spacing */
fscanf (fp, "%f", &fl);
GIMP_BRUSH (brush)->spacing = fl;
/* read brush radius */
fscanf (fp, "%f", &fl);
gimp_brush_generated_set_radius (brush, fl);
/* read brush hardness */
fscanf (fp, "%f", &fl);
gimp_brush_generated_set_hardness (brush, fl);
/* read brush aspect_ratio */
fscanf (fp, "%f", &fl);
gimp_brush_generated_set_aspect_ratio (brush, fl);
/* read brush angle */
fscanf (fp, "%f", &fl);
gimp_brush_generated_set_angle (brush, fl);
fclose (fp);
gimp_brush_generated_thaw (brush);
if (stingy_memory_use)
temp_buf_swap (GIMP_BRUSH (brush)->mask);
return GIMP_BRUSH (brush);
}
void
gimp_brush_generated_save (GimpBrushGenerated *brush,
const gchar *file_name)
{
FILE *fp;
if ((fp = fopen (file_name, "wb")) == NULL)
{
g_warning ("Unable to save file %s", file_name);
return;
}
/* write magic header */
fprintf (fp, "GIMP-VBR\n");
/* write version */
fprintf (fp, "1.0\n");
/* write name */
fprintf (fp, "%.255s\n", GIMP_BRUSH (brush)->name);
/* write brush spacing */
fprintf (fp, "%f\n", (float) GIMP_BRUSH (brush)->spacing);
/* write brush radius */
fprintf (fp, "%f\n", brush->radius);
/* write brush hardness */
fprintf (fp, "%f\n", brush->hardness);
/* write brush aspect_ratio */
fprintf (fp, "%f\n", brush->aspect_ratio);
/* write brush angle */
fprintf (fp, "%f\n", brush->angle);
fclose (fp);
}
void
gimp_brush_generated_delete (GimpBrushGenerated *brush)
{
if (GIMP_BRUSH (brush)->filename)
{
unlink (GIMP_BRUSH (brush)->filename);
}
}
void
gimp_brush_generated_freeze (GimpBrushGenerated *brush)
{
g_return_if_fail (brush != NULL);
g_return_if_fail (GIMP_IS_BRUSH_GENERATED (brush));
brush->freeze++;
}
void
gimp_brush_generated_thaw (GimpBrushGenerated *brush)
{
g_return_if_fail (brush != NULL);
g_return_if_fail (GIMP_IS_BRUSH_GENERATED (brush));
if (brush->freeze > 0)
brush->freeze--;
if (brush->freeze == 0)
gimp_brush_generated_generate (brush);
}
static double
gauss (gdouble f)
{
/* this aint' a real gauss function */
if (f < -.5)
{
f = -1.0 - f;
return (2.0 * f*f);
}
if (f < .5)
return (1.0 - 2.0 * f*f);
f = 1.0 -f;
return (2.0 * f*f);
}
void
gimp_brush_generated_generate (GimpBrushGenerated *brush)
{
register GimpBrush *gbrush = NULL;
register gint x, y;
register guchar *centerp;
register gdouble d;
register gdouble exponent;
register guchar a;
register gint length;
register guchar *lookup;
register gdouble sum, c, s, tx, ty;
gdouble buffer[OVERSAMPLING];
gint width, height;
g_return_if_fail (brush != NULL);
g_return_if_fail (GIMP_IS_BRUSH_GENERATED (brush));
if (brush->freeze) /* if we are frozen defer rerendering till later */
return;
gbrush = GIMP_BRUSH (brush);
if (stingy_memory_use && gbrush->mask)
temp_buf_unswap (gbrush->mask);
if (gbrush->mask)
{
temp_buf_free(gbrush->mask);
}
/* compute the range of the brush. should do a better job than this? */
s = sin (gimp_deg_to_rad (brush->angle));
c = cos (gimp_deg_to_rad (brush->angle));
tx = MAX (fabs (c*ceil (brush->radius) - s*ceil (brush->radius)
/ brush->aspect_ratio),
fabs (c*ceil (brush->radius) + s*ceil (brush->radius)
/ brush->aspect_ratio));
ty = MAX (fabs (s*ceil (brush->radius) + c*ceil (brush->radius)
/ brush->aspect_ratio),
fabs (s*ceil (brush->radius) - c*ceil (brush->radius)
/ brush->aspect_ratio));
if (brush->radius > tx)
width = ceil (tx);
else
width = ceil (brush->radius);
if (brush->radius > ty)
height = ceil (ty);
else
height = ceil (brush->radius);
/* compute the axis for spacing */
GIMP_BRUSH (brush)->x_axis.x = c * brush->radius;
GIMP_BRUSH (brush)->x_axis.y = -1.0 * s * brush->radius;
GIMP_BRUSH (brush)->y_axis.x = (s * brush->radius / brush->aspect_ratio);
GIMP_BRUSH (brush)->y_axis.y = (c * brush->radius / brush->aspect_ratio);
gbrush->mask = temp_buf_new (width * 2 + 1,
height * 2 + 1,
1, width, height, 0);
centerp = &gbrush->mask->data[height * gbrush->mask->width + width];
if ((1.0 - brush->hardness) < 0.000001)
exponent = 1000000;
else
exponent = 1/(1.0 - brush->hardness);
/* set up lookup table */
length = ceil (sqrt (2 * ceil (brush->radius+1) * ceil (brush->radius+1))+1) * OVERSAMPLING;
lookup = g_malloc (length);
sum = 0.0;
for (x = 0; x < OVERSAMPLING; x++)
{
d = fabs ((x + 0.5) / OVERSAMPLING - 0.5);
if (d > brush->radius)
buffer[x] = 0.0;
else
/* buffer[x] = (1.0 - pow (d/brush->radius, exponent)); */
buffer[x] = gauss (pow (d/brush->radius, exponent));
sum += buffer[x];
}
for (x = 0; d < brush->radius || sum > 0.00001; d += 1.0 / OVERSAMPLING)
{
sum -= buffer[x % OVERSAMPLING];
if (d > brush->radius)
buffer[x % OVERSAMPLING] = 0.0;
else
/* buffer[x%OVERSAMPLING] = (1.0 - pow (d/brush->radius, exponent)); */
buffer[x % OVERSAMPLING] = gauss (pow (d/brush->radius, exponent));
sum += buffer[x%OVERSAMPLING];
lookup[x++] = RINT (sum * (255.0 / OVERSAMPLING));
}
while (x < length)
{
lookup[x++] = 0;
}
/* compute one half and mirror it */
for (y = 0; y <= height; y++)
{
for (x = -width; x <= width; x++)
{
tx = c*x - s*y;
ty = c*y + s*x;
ty *= brush->aspect_ratio;
d = sqrt (tx*tx + ty*ty);
if (d < brush->radius+1)
a = lookup[(gint) RINT (d * OVERSAMPLING)];
else
a = 0;
centerp[ y*gbrush->mask->width + x] = a;
centerp[-1*y*gbrush->mask->width - x] = a;
}
}
g_free (lookup);
gtk_signal_emit_by_name (GTK_OBJECT (brush), "dirty");
}
gfloat
gimp_brush_generated_set_radius (GimpBrushGenerated *brush,
gfloat radius)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
if (radius < 0.0)
radius = 0.0;
else if (radius > 32767.0)
radius = 32767.0;
if (radius == brush->radius)
return radius;
brush->radius = radius;
if (!brush->freeze)
gimp_brush_generated_generate (brush);
return brush->radius;
}
gfloat
gimp_brush_generated_set_hardness (GimpBrushGenerated *brush,
gfloat hardness)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
if (hardness < 0.0)
hardness = 0.0;
else if (hardness > 1.0)
hardness = 1.0;
if (brush->hardness == hardness)
return hardness;
brush->hardness = hardness;
if (!brush->freeze)
gimp_brush_generated_generate (brush);
return brush->hardness;
}
gfloat
gimp_brush_generated_set_angle (GimpBrushGenerated *brush,
gfloat angle)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
if (angle < 0.0)
angle = -1.0 * fmod (angle, 180.0);
else if (angle > 180.0)
angle = fmod (angle, 180.0);
if (brush->angle == angle)
return angle;
brush->angle = angle;
if (!brush->freeze)
gimp_brush_generated_generate (brush);
return brush->angle;
}
gfloat
gimp_brush_generated_set_aspect_ratio (GimpBrushGenerated *brush,
gfloat ratio)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
if (ratio < 1.0)
ratio = 1.0;
else if (ratio > 1000)
ratio = 1000;
if (brush->aspect_ratio == ratio)
return ratio;
brush->aspect_ratio = ratio;
if (!brush->freeze)
gimp_brush_generated_generate(brush);
return brush->aspect_ratio;
}
gfloat
gimp_brush_generated_get_radius (const GimpBrushGenerated *brush)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
return brush->radius;
}
gfloat
gimp_brush_generated_get_hardness (const GimpBrushGenerated *brush)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
return brush->hardness;
}
gfloat
gimp_brush_generated_get_angle (const GimpBrushGenerated *brush)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
return brush->angle;
}
gfloat
gimp_brush_generated_get_aspect_ratio (const GimpBrushGenerated *brush)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
return brush->aspect_ratio;
}

View File

@@ -1,528 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimp_brush_generated module Copyright 1998 Jay Cox <jaycox@earthlink.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdio.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <glib.h>
#include "apptypes.h"
#include "appenv.h"
#include "gimpbrushgenerated.h"
#include "paint_core.h"
#include "gimprc.h"
#include "gimpbrush.h"
#include "libgimp/gimpmath.h"
#define OVERSAMPLING 5
static void gimp_brush_generated_generate (GimpBrushGenerated *brush);
static GimpObjectClass *parent_class = NULL;
static void
gimp_brush_generated_destroy (GtkObject *object)
{
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
static void
gimp_brush_generated_class_init (GimpBrushGeneratedClass *klass)
{
GtkObjectClass *object_class;
object_class = GTK_OBJECT_CLASS (klass);
parent_class = gtk_type_class (GIMP_TYPE_BRUSH);
object_class->destroy = gimp_brush_generated_destroy;
}
static void
gimp_brush_generated_init (GimpBrushGenerated *brush)
{
brush->radius = 5.0;
brush->hardness = 0.0;
brush->angle = 0.0;
brush->aspect_ratio = 1.0;
brush->freeze = 0;
}
guint
gimp_brush_generated_get_type (void)
{
static GtkType type = 0;
if (!type)
{
GtkTypeInfo info =
{
"GimpBrushGenerated",
sizeof (GimpBrushGenerated),
sizeof (GimpBrushGeneratedClass),
(GtkClassInitFunc) gimp_brush_generated_class_init,
(GtkObjectInitFunc) gimp_brush_generated_init,
/* reserved_1 */ NULL,
/* reserved_2 */ NULL,
(GtkClassInitFunc) NULL
};
type = gtk_type_unique (GIMP_TYPE_BRUSH, &info);
}
return type;
}
GimpBrush *
gimp_brush_generated_new (gfloat radius,
gfloat hardness,
gfloat angle,
gfloat aspect_ratio)
{
GimpBrushGenerated *brush;
/* set up normal brush data */
brush =
GIMP_BRUSH_GENERATED (gtk_type_new (gimp_brush_generated_get_type ()));
GIMP_BRUSH (brush)->name = g_strdup ("Untitled");
GIMP_BRUSH (brush)->spacing = 20;
/* set up gimp_brush_generated data */
brush->radius = radius;
brush->hardness = hardness;
brush->angle = angle;
brush->aspect_ratio = aspect_ratio;
/* render brush mask */
gimp_brush_generated_generate (brush);
return GIMP_BRUSH (brush);
}
GimpBrush *
gimp_brush_generated_load (const gchar *file_name)
{
GimpBrushGenerated *brush;
FILE *fp;
gchar string[256];
gfloat fl;
gfloat version;
if ((fp = fopen (file_name, "rb")) == NULL)
return NULL;
/* make sure the file we are reading is the right type */
fgets (string, 255, fp);
if (strncmp (string, "GIMP-VBR", 8) != 0)
return NULL;
/* make sure we are reading a compatible version */
fgets (string, 255, fp);
sscanf (string, "%f", &version);
g_return_val_if_fail (version < 2.0, NULL);
/* create new brush */
brush =
GIMP_BRUSH_GENERATED (gtk_type_new (gimp_brush_generated_get_type ()));
GIMP_BRUSH (brush)->filename = g_strdup (file_name);
gimp_brush_generated_freeze (brush);
/* read name */
fgets (string, 255, fp);
if (string[strlen (string) - 1] == '\n')
string[strlen (string) - 1] = 0;
GIMP_BRUSH (brush)->name = g_strdup (string);
/* read brush spacing */
fscanf (fp, "%f", &fl);
GIMP_BRUSH (brush)->spacing = fl;
/* read brush radius */
fscanf (fp, "%f", &fl);
gimp_brush_generated_set_radius (brush, fl);
/* read brush hardness */
fscanf (fp, "%f", &fl);
gimp_brush_generated_set_hardness (brush, fl);
/* read brush aspect_ratio */
fscanf (fp, "%f", &fl);
gimp_brush_generated_set_aspect_ratio (brush, fl);
/* read brush angle */
fscanf (fp, "%f", &fl);
gimp_brush_generated_set_angle (brush, fl);
fclose (fp);
gimp_brush_generated_thaw (brush);
if (stingy_memory_use)
temp_buf_swap (GIMP_BRUSH (brush)->mask);
return GIMP_BRUSH (brush);
}
void
gimp_brush_generated_save (GimpBrushGenerated *brush,
const gchar *file_name)
{
FILE *fp;
if ((fp = fopen (file_name, "wb")) == NULL)
{
g_warning ("Unable to save file %s", file_name);
return;
}
/* write magic header */
fprintf (fp, "GIMP-VBR\n");
/* write version */
fprintf (fp, "1.0\n");
/* write name */
fprintf (fp, "%.255s\n", GIMP_BRUSH (brush)->name);
/* write brush spacing */
fprintf (fp, "%f\n", (float) GIMP_BRUSH (brush)->spacing);
/* write brush radius */
fprintf (fp, "%f\n", brush->radius);
/* write brush hardness */
fprintf (fp, "%f\n", brush->hardness);
/* write brush aspect_ratio */
fprintf (fp, "%f\n", brush->aspect_ratio);
/* write brush angle */
fprintf (fp, "%f\n", brush->angle);
fclose (fp);
}
void
gimp_brush_generated_delete (GimpBrushGenerated *brush)
{
if (GIMP_BRUSH (brush)->filename)
{
unlink (GIMP_BRUSH (brush)->filename);
}
}
void
gimp_brush_generated_freeze (GimpBrushGenerated *brush)
{
g_return_if_fail (brush != NULL);
g_return_if_fail (GIMP_IS_BRUSH_GENERATED (brush));
brush->freeze++;
}
void
gimp_brush_generated_thaw (GimpBrushGenerated *brush)
{
g_return_if_fail (brush != NULL);
g_return_if_fail (GIMP_IS_BRUSH_GENERATED (brush));
if (brush->freeze > 0)
brush->freeze--;
if (brush->freeze == 0)
gimp_brush_generated_generate (brush);
}
static double
gauss (gdouble f)
{
/* this aint' a real gauss function */
if (f < -.5)
{
f = -1.0 - f;
return (2.0 * f*f);
}
if (f < .5)
return (1.0 - 2.0 * f*f);
f = 1.0 -f;
return (2.0 * f*f);
}
void
gimp_brush_generated_generate (GimpBrushGenerated *brush)
{
register GimpBrush *gbrush = NULL;
register gint x, y;
register guchar *centerp;
register gdouble d;
register gdouble exponent;
register guchar a;
register gint length;
register guchar *lookup;
register gdouble sum, c, s, tx, ty;
gdouble buffer[OVERSAMPLING];
gint width, height;
g_return_if_fail (brush != NULL);
g_return_if_fail (GIMP_IS_BRUSH_GENERATED (brush));
if (brush->freeze) /* if we are frozen defer rerendering till later */
return;
gbrush = GIMP_BRUSH (brush);
if (stingy_memory_use && gbrush->mask)
temp_buf_unswap (gbrush->mask);
if (gbrush->mask)
{
temp_buf_free(gbrush->mask);
}
/* compute the range of the brush. should do a better job than this? */
s = sin (gimp_deg_to_rad (brush->angle));
c = cos (gimp_deg_to_rad (brush->angle));
tx = MAX (fabs (c*ceil (brush->radius) - s*ceil (brush->radius)
/ brush->aspect_ratio),
fabs (c*ceil (brush->radius) + s*ceil (brush->radius)
/ brush->aspect_ratio));
ty = MAX (fabs (s*ceil (brush->radius) + c*ceil (brush->radius)
/ brush->aspect_ratio),
fabs (s*ceil (brush->radius) - c*ceil (brush->radius)
/ brush->aspect_ratio));
if (brush->radius > tx)
width = ceil (tx);
else
width = ceil (brush->radius);
if (brush->radius > ty)
height = ceil (ty);
else
height = ceil (brush->radius);
/* compute the axis for spacing */
GIMP_BRUSH (brush)->x_axis.x = c * brush->radius;
GIMP_BRUSH (brush)->x_axis.y = -1.0 * s * brush->radius;
GIMP_BRUSH (brush)->y_axis.x = (s * brush->radius / brush->aspect_ratio);
GIMP_BRUSH (brush)->y_axis.y = (c * brush->radius / brush->aspect_ratio);
gbrush->mask = temp_buf_new (width * 2 + 1,
height * 2 + 1,
1, width, height, 0);
centerp = &gbrush->mask->data[height * gbrush->mask->width + width];
if ((1.0 - brush->hardness) < 0.000001)
exponent = 1000000;
else
exponent = 1/(1.0 - brush->hardness);
/* set up lookup table */
length = ceil (sqrt (2 * ceil (brush->radius+1) * ceil (brush->radius+1))+1) * OVERSAMPLING;
lookup = g_malloc (length);
sum = 0.0;
for (x = 0; x < OVERSAMPLING; x++)
{
d = fabs ((x + 0.5) / OVERSAMPLING - 0.5);
if (d > brush->radius)
buffer[x] = 0.0;
else
/* buffer[x] = (1.0 - pow (d/brush->radius, exponent)); */
buffer[x] = gauss (pow (d/brush->radius, exponent));
sum += buffer[x];
}
for (x = 0; d < brush->radius || sum > 0.00001; d += 1.0 / OVERSAMPLING)
{
sum -= buffer[x % OVERSAMPLING];
if (d > brush->radius)
buffer[x % OVERSAMPLING] = 0.0;
else
/* buffer[x%OVERSAMPLING] = (1.0 - pow (d/brush->radius, exponent)); */
buffer[x % OVERSAMPLING] = gauss (pow (d/brush->radius, exponent));
sum += buffer[x%OVERSAMPLING];
lookup[x++] = RINT (sum * (255.0 / OVERSAMPLING));
}
while (x < length)
{
lookup[x++] = 0;
}
/* compute one half and mirror it */
for (y = 0; y <= height; y++)
{
for (x = -width; x <= width; x++)
{
tx = c*x - s*y;
ty = c*y + s*x;
ty *= brush->aspect_ratio;
d = sqrt (tx*tx + ty*ty);
if (d < brush->radius+1)
a = lookup[(gint) RINT (d * OVERSAMPLING)];
else
a = 0;
centerp[ y*gbrush->mask->width + x] = a;
centerp[-1*y*gbrush->mask->width - x] = a;
}
}
g_free (lookup);
gtk_signal_emit_by_name (GTK_OBJECT (brush), "dirty");
}
gfloat
gimp_brush_generated_set_radius (GimpBrushGenerated *brush,
gfloat radius)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
if (radius < 0.0)
radius = 0.0;
else if (radius > 32767.0)
radius = 32767.0;
if (radius == brush->radius)
return radius;
brush->radius = radius;
if (!brush->freeze)
gimp_brush_generated_generate (brush);
return brush->radius;
}
gfloat
gimp_brush_generated_set_hardness (GimpBrushGenerated *brush,
gfloat hardness)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
if (hardness < 0.0)
hardness = 0.0;
else if (hardness > 1.0)
hardness = 1.0;
if (brush->hardness == hardness)
return hardness;
brush->hardness = hardness;
if (!brush->freeze)
gimp_brush_generated_generate (brush);
return brush->hardness;
}
gfloat
gimp_brush_generated_set_angle (GimpBrushGenerated *brush,
gfloat angle)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
if (angle < 0.0)
angle = -1.0 * fmod (angle, 180.0);
else if (angle > 180.0)
angle = fmod (angle, 180.0);
if (brush->angle == angle)
return angle;
brush->angle = angle;
if (!brush->freeze)
gimp_brush_generated_generate (brush);
return brush->angle;
}
gfloat
gimp_brush_generated_set_aspect_ratio (GimpBrushGenerated *brush,
gfloat ratio)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
if (ratio < 1.0)
ratio = 1.0;
else if (ratio > 1000)
ratio = 1000;
if (brush->aspect_ratio == ratio)
return ratio;
brush->aspect_ratio = ratio;
if (!brush->freeze)
gimp_brush_generated_generate(brush);
return brush->aspect_ratio;
}
gfloat
gimp_brush_generated_get_radius (const GimpBrushGenerated *brush)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
return brush->radius;
}
gfloat
gimp_brush_generated_get_hardness (const GimpBrushGenerated *brush)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
return brush->hardness;
}
gfloat
gimp_brush_generated_get_angle (const GimpBrushGenerated *brush)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
return brush->angle;
}
gfloat
gimp_brush_generated_get_aspect_ratio (const GimpBrushGenerated *brush)
{
g_return_val_if_fail (GIMP_IS_BRUSH_GENERATED (brush), -1.0);
return brush->aspect_ratio;
}

View File

@@ -1,84 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* brush_generated module Copyright 1998 Jay Cox <jaycox@earthlink.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __GIMP_BRUSH_GENERATED_H__
#define __GIMP_BRUSH_GENERATED_H__
#include "gimpbrush.h"
#define GIMP_TYPE_BRUSH_GENERATED (gimp_brush_generated_get_type ())
#define GIMP_BRUSH_GENERATED(obj) (GTK_CHECK_CAST ((obj), GIMP_TYPE_BRUSH_GENERATED, GimpBrushGenerated))
#define GIMP_IS_BRUSH_GENERATED(obj) (GTK_CHECK_TYPE ((obj), GIMP_TYPE_BRUSH_GENERATED))
typedef struct _GimpBrushGenerated GimpBrushGenerated;
typedef struct _GimpBrushGeneratedClass GimpBrushGeneratedClass;
struct _GimpBrushGenerated
{
GimpBrush gbrush;
gfloat radius;
gfloat hardness; /* 0.0 - 1.0 */
gfloat angle; /* in degrees */
gfloat aspect_ratio; /* y/x */
gint freeze;
/*GSpline *profile_curve */ /* Some lazy day... */
};
struct _GimpBrushGeneratedClass
{
GimpBrushClass parent_class;
};
GtkType gimp_brush_generated_get_type (void);
GimpBrush * gimp_brush_generated_new (gfloat radius,
gfloat hardness,
gfloat angle,
gfloat aspect_ratio);
GimpBrush * gimp_brush_generated_load (const gchar *file_name);
void gimp_brush_generated_save (GimpBrushGenerated *brush,
const gchar *file_name);
void gimp_brush_generated_delete (GimpBrushGenerated *brush);
void gimp_brush_generated_freeze (GimpBrushGenerated *brush);
void gimp_brush_generated_thaw (GimpBrushGenerated *brush);
gfloat gimp_brush_generated_set_radius (GimpBrushGenerated *brush,
gfloat radius);
gfloat gimp_brush_generated_set_hardness (GimpBrushGenerated *brush,
gfloat hardness);
gfloat gimp_brush_generated_set_angle (GimpBrushGenerated *brush,
gfloat angle);
gfloat gimp_brush_generated_set_aspect_ratio (GimpBrushGenerated *brush,
gfloat ratio);
gfloat gimp_brush_generated_get_radius (const GimpBrushGenerated *brush);
gfloat gimp_brush_generated_get_hardness (const GimpBrushGenerated *brush);
gfloat gimp_brush_generated_get_angle (const GimpBrushGenerated *brush);
gfloat gimp_brush_generated_get_aspect_ratio (const GimpBrushGenerated *brush);
#endif /* __GIMP_BRUSH_GENERATED_H__ */

View File

@@ -1,409 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
* Copyright (C) 1999 Adrian Likins and Tor Lillqvist
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <fcntl.h>
#ifdef G_OS_WIN32
#include <io.h>
#endif
#ifndef _O_BINARY
#define _O_BINARY 0
#endif
#include <gtk/gtk.h>
#include "apptypes.h"
#include "appenv.h"
#include "brush_header.h"
#include "pattern_header.h"
#include "patterns.h"
#include "gimpbrush.h"
#include "gimpbrushpipe.h"
#include "paint_core.h"
#include "gimprc.h"
#include "libgimp/gimpmath.h"
#include "libgimp/gimpparasiteio.h"
#include "libgimp/gimpintl.h"
static GimpBrushClass *parent_class;
static GimpBrush * gimp_brush_pipe_select_brush (PaintCore *paint_core);
static gboolean gimp_brush_pipe_want_null_motion (PaintCore *paint_core);
static void gimp_brush_pipe_destroy (GtkObject *object);
static GimpBrush *
gimp_brush_pipe_select_brush (PaintCore *paint_core)
{
GimpBrushPipe *pipe;
gint i, brushix, ix;
gdouble angle;
g_return_val_if_fail (paint_core != NULL, NULL);
g_return_val_if_fail (GIMP_IS_BRUSH_PIPE (paint_core->brush), NULL);
pipe = GIMP_BRUSH_PIPE (paint_core->brush);
if (pipe->nbrushes == 1)
return GIMP_BRUSH (pipe->current);
brushix = 0;
for (i = 0; i < pipe->dimension; i++)
{
switch (pipe->select[i])
{
case PIPE_SELECT_INCREMENTAL:
ix = (pipe->index[i] + 1) % pipe->rank[i];
break;
case PIPE_SELECT_ANGULAR:
angle = atan2 (paint_core->cury - paint_core->lasty,
paint_core->curx - paint_core->lastx);
/* Offset angle to be compatible with PSP tubes */
angle += G_PI_2;
/* Map it to the [0..2*G_PI) interval */
if (angle < 0)
angle += 2.0 * G_PI;
else if (angle > 2.0 * G_PI)
angle -= 2.0 * G_PI;
ix = RINT (angle / (2.0 * G_PI) * pipe->rank[i]);
break;
case PIPE_SELECT_RANDOM:
/* This probably isn't the right way */
ix = rand () % pipe->rank[i];
break;
case PIPE_SELECT_PRESSURE:
ix = RINT (paint_core->curpressure * (pipe->rank[i] - 1));
break;
case PIPE_SELECT_TILT_X:
ix = RINT (paint_core->curxtilt / 2.0 * pipe->rank[i]) + pipe->rank[i]/2;
break;
case PIPE_SELECT_TILT_Y:
ix = RINT (paint_core->curytilt / 2.0 * pipe->rank[i]) + pipe->rank[i]/2;
break;
case PIPE_SELECT_CONSTANT:
default:
ix = pipe->index[i];
break;
}
pipe->index[i] = CLAMP (ix, 0, pipe->rank[i]-1);
brushix += pipe->stride[i] * pipe->index[i];
}
/* Make sure is inside bounds */
brushix = CLAMP (brushix, 0, pipe->nbrushes-1);
pipe->current = pipe->brushes[brushix];
return GIMP_BRUSH (pipe->current);
}
static gboolean
gimp_brush_pipe_want_null_motion (PaintCore *paint_core)
{
GimpBrushPipe *pipe;
gint i;
g_return_val_if_fail (paint_core != NULL, TRUE);
g_return_val_if_fail (GIMP_IS_BRUSH_PIPE (paint_core->brush), TRUE);
pipe = GIMP_BRUSH_PIPE (paint_core->brush);
if (pipe->nbrushes == 1)
return TRUE;
for (i = 0; i < pipe->dimension; i++)
if (pipe->select[i] == PIPE_SELECT_ANGULAR)
return FALSE;
return TRUE;
}
static void
gimp_brush_pipe_destroy (GtkObject *object)
{
GimpBrushPipe *pipe;
gint i;
g_return_if_fail (object != NULL);
g_return_if_fail (GIMP_IS_BRUSH_PIPE (object));
pipe = GIMP_BRUSH_PIPE (object);
g_free (pipe->rank);
g_free (pipe->stride);
for (i = 1; i < pipe->nbrushes; i++)
if (pipe->brushes[i])
gtk_object_unref (GTK_OBJECT (pipe->brushes[i]));
g_free (pipe->brushes);
g_free (pipe->select);
g_free (pipe->index);
if (GTK_OBJECT_CLASS (parent_class)->destroy)
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
static void
gimp_brush_pipe_class_init (GimpBrushPipeClass *klass)
{
GtkObjectClass *object_class;
GimpBrushClass *brush_class;
object_class = GTK_OBJECT_CLASS (klass);
brush_class = GIMP_BRUSH_CLASS (klass);
parent_class = gtk_type_class (GIMP_TYPE_BRUSH);
brush_class->select_brush = gimp_brush_pipe_select_brush;
brush_class->want_null_motion = gimp_brush_pipe_want_null_motion;
object_class->destroy = gimp_brush_pipe_destroy;
}
void
gimp_brush_pipe_init (GimpBrushPipe *pipe)
{
pipe->current = NULL;
pipe->dimension = 0;
pipe->rank = NULL;
pipe->stride = NULL;
pipe->nbrushes = 0;
pipe->brushes = NULL;
pipe->select = NULL;
pipe->index = NULL;
}
GtkType
gimp_brush_pipe_get_type (void)
{
static GtkType type = 0;
if (!type)
{
GtkTypeInfo info =
{
"GimpBrushPipe",
sizeof (GimpBrushPipe),
sizeof (GimpBrushPipeClass),
(GtkClassInitFunc) gimp_brush_pipe_class_init,
(GtkObjectInitFunc) gimp_brush_pipe_init,
/* reserved_1 */ NULL,
/* reserved_2 */ NULL,
(GtkClassInitFunc) NULL
};
type = gtk_type_unique (GIMP_TYPE_BRUSH, &info);
}
return type;
}
#include <errno.h>
GimpBrush *
gimp_brush_pipe_load (gchar *filename)
{
GimpBrushPipe *pipe = NULL;
GimpPixPipeParams params;
gint i;
gint num_of_brushes = 0;
gint totalcells;
gchar *paramstring;
GString *buffer;
gchar c;
gint fd;
g_return_val_if_fail (filename != NULL, NULL);
fd = open (filename, O_RDONLY | _O_BINARY);
if (fd == -1)
{
g_message ("Couldn't open file '%s'", filename);
return NULL;
}
/* The file format starts with a painfully simple text header */
/* get the name */
buffer = g_string_new (NULL);
while (read (fd, &c, 1) == 1 && c != '\n' && buffer->len < 1024)
g_string_append_c (buffer, c);
if (buffer->len > 0 && buffer->len < 1024)
{
pipe = GIMP_BRUSH_PIPE (gtk_type_new (GIMP_TYPE_BRUSH_PIPE));
GIMP_BRUSH (pipe)->name = buffer->str;
}
g_string_free (buffer, FALSE);
if (!pipe)
{
g_message ("Couldn't read name for brush pipe from file '%s'\n",
filename);
close (fd);
return NULL;
}
/* get the number of brushes */
buffer = g_string_new (NULL);
while (read (fd, &c, 1) == 1 && c != '\n' && buffer->len < 1024)
g_string_append_c (buffer, c);
if (buffer->len > 0 && buffer->len < 1024)
{
num_of_brushes = strtol (buffer->str, &paramstring, 10);
}
if (num_of_brushes < 1)
{
g_message (_("Brush pipes should have at least one brush:\n\"%s\""),
filename);
close (fd);
gtk_object_sink (GTK_OBJECT (pipe));
g_string_free (buffer, TRUE);
return NULL;
}
while (*paramstring && isspace (*paramstring))
paramstring++;
if (*paramstring)
{
gimp_pixpipe_params_init (&params);
gimp_pixpipe_params_parse (paramstring, &params);
pipe->dimension = params.dim;
pipe->rank = g_new0 (gint, pipe->dimension);
pipe->select = g_new0 (PipeSelectModes, pipe->dimension);
pipe->index = g_new0 (gint, pipe->dimension);
/* placement is not used at all ?? */
if (params.free_placement_string)
g_free (params.placement);
for (i = 0; i < pipe->dimension; i++)
{
pipe->rank[i] = params.rank[i];
if (strcmp (params.selection[i], "incremental") == 0)
pipe->select[i] = PIPE_SELECT_INCREMENTAL;
else if (strcmp (params.selection[i], "angular") == 0)
pipe->select[i] = PIPE_SELECT_ANGULAR;
else if (strcmp (params.selection[i], "velocity") == 0)
pipe->select[i] = PIPE_SELECT_VELOCITY;
else if (strcmp (params.selection[i], "random") == 0)
pipe->select[i] = PIPE_SELECT_RANDOM;
else if (strcmp (params.selection[i], "pressure") == 0)
pipe->select[i] = PIPE_SELECT_PRESSURE;
else if (strcmp (params.selection[i], "xtilt") == 0)
pipe->select[i] = PIPE_SELECT_TILT_X;
else if (strcmp (params.selection[i], "ytilt") == 0)
pipe->select[i] = PIPE_SELECT_TILT_Y;
else
pipe->select[i] = PIPE_SELECT_CONSTANT;
if (params.free_selection_string)
g_free (params.selection[i]);
pipe->index[i] = 0;
}
}
else
{
pipe->dimension = 1;
pipe->rank = g_new (gint, 1);
pipe->rank[0] = num_of_brushes;
pipe->select = g_new (PipeSelectModes, 1);
pipe->select[0] = PIPE_SELECT_INCREMENTAL;
pipe->index = g_new (gint, 1);
pipe->index[0] = 0;
}
g_string_free (buffer, TRUE);
totalcells = 1; /* Not all necessarily present, maybe */
for (i = 0; i < pipe->dimension; i++)
totalcells *= pipe->rank[i];
pipe->stride = g_new0 (gint, pipe->dimension);
for (i = 0; i < pipe->dimension; i++)
{
if (i == 0)
pipe->stride[i] = totalcells / pipe->rank[i];
else
pipe->stride[i] = pipe->stride[i-1] / pipe->rank[i];
}
g_assert (pipe->stride[pipe->dimension-1] == 1);
pipe->brushes = g_new0 (GimpBrush *, num_of_brushes);
while (pipe->nbrushes < num_of_brushes)
{
pipe->brushes[pipe->nbrushes] = gimp_brush_load_brush (fd, filename);
if (pipe->brushes[pipe->nbrushes])
{
gtk_object_ref (GTK_OBJECT (pipe->brushes[pipe->nbrushes]));
gtk_object_sink (GTK_OBJECT (pipe->brushes[pipe->nbrushes]));
g_free (GIMP_BRUSH (pipe->brushes[pipe->nbrushes])->name);
GIMP_BRUSH (pipe->brushes[pipe->nbrushes])->name = NULL;
}
else
{
g_message (_("Failed to load one of the brushes in the brush pipe\n\"%s\""),
filename);
close (fd);
gtk_object_sink (GTK_OBJECT (pipe));
return NULL;
}
pipe->nbrushes++;
}
/* Current brush is the first one. */
pipe->current = pipe->brushes[0];
/* just to satisfy the code that relies on this crap */
GIMP_BRUSH (pipe)->filename = g_strdup (filename);
GIMP_BRUSH (pipe)->spacing = pipe->current->spacing;
GIMP_BRUSH (pipe)->x_axis = pipe->current->x_axis;
GIMP_BRUSH (pipe)->y_axis = pipe->current->y_axis;
GIMP_BRUSH (pipe)->mask = pipe->current->mask;
GIMP_BRUSH (pipe)->pixmap = pipe->current->pixmap;
close (fd);
return GIMP_BRUSH (pipe);
}

View File

@@ -1,409 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
* Copyright (C) 1999 Adrian Likins and Tor Lillqvist
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <fcntl.h>
#ifdef G_OS_WIN32
#include <io.h>
#endif
#ifndef _O_BINARY
#define _O_BINARY 0
#endif
#include <gtk/gtk.h>
#include "apptypes.h"
#include "appenv.h"
#include "brush_header.h"
#include "pattern_header.h"
#include "patterns.h"
#include "gimpbrush.h"
#include "gimpbrushpipe.h"
#include "paint_core.h"
#include "gimprc.h"
#include "libgimp/gimpmath.h"
#include "libgimp/gimpparasiteio.h"
#include "libgimp/gimpintl.h"
static GimpBrushClass *parent_class;
static GimpBrush * gimp_brush_pipe_select_brush (PaintCore *paint_core);
static gboolean gimp_brush_pipe_want_null_motion (PaintCore *paint_core);
static void gimp_brush_pipe_destroy (GtkObject *object);
static GimpBrush *
gimp_brush_pipe_select_brush (PaintCore *paint_core)
{
GimpBrushPipe *pipe;
gint i, brushix, ix;
gdouble angle;
g_return_val_if_fail (paint_core != NULL, NULL);
g_return_val_if_fail (GIMP_IS_BRUSH_PIPE (paint_core->brush), NULL);
pipe = GIMP_BRUSH_PIPE (paint_core->brush);
if (pipe->nbrushes == 1)
return GIMP_BRUSH (pipe->current);
brushix = 0;
for (i = 0; i < pipe->dimension; i++)
{
switch (pipe->select[i])
{
case PIPE_SELECT_INCREMENTAL:
ix = (pipe->index[i] + 1) % pipe->rank[i];
break;
case PIPE_SELECT_ANGULAR:
angle = atan2 (paint_core->cury - paint_core->lasty,
paint_core->curx - paint_core->lastx);
/* Offset angle to be compatible with PSP tubes */
angle += G_PI_2;
/* Map it to the [0..2*G_PI) interval */
if (angle < 0)
angle += 2.0 * G_PI;
else if (angle > 2.0 * G_PI)
angle -= 2.0 * G_PI;
ix = RINT (angle / (2.0 * G_PI) * pipe->rank[i]);
break;
case PIPE_SELECT_RANDOM:
/* This probably isn't the right way */
ix = rand () % pipe->rank[i];
break;
case PIPE_SELECT_PRESSURE:
ix = RINT (paint_core->curpressure * (pipe->rank[i] - 1));
break;
case PIPE_SELECT_TILT_X:
ix = RINT (paint_core->curxtilt / 2.0 * pipe->rank[i]) + pipe->rank[i]/2;
break;
case PIPE_SELECT_TILT_Y:
ix = RINT (paint_core->curytilt / 2.0 * pipe->rank[i]) + pipe->rank[i]/2;
break;
case PIPE_SELECT_CONSTANT:
default:
ix = pipe->index[i];
break;
}
pipe->index[i] = CLAMP (ix, 0, pipe->rank[i]-1);
brushix += pipe->stride[i] * pipe->index[i];
}
/* Make sure is inside bounds */
brushix = CLAMP (brushix, 0, pipe->nbrushes-1);
pipe->current = pipe->brushes[brushix];
return GIMP_BRUSH (pipe->current);
}
static gboolean
gimp_brush_pipe_want_null_motion (PaintCore *paint_core)
{
GimpBrushPipe *pipe;
gint i;
g_return_val_if_fail (paint_core != NULL, TRUE);
g_return_val_if_fail (GIMP_IS_BRUSH_PIPE (paint_core->brush), TRUE);
pipe = GIMP_BRUSH_PIPE (paint_core->brush);
if (pipe->nbrushes == 1)
return TRUE;
for (i = 0; i < pipe->dimension; i++)
if (pipe->select[i] == PIPE_SELECT_ANGULAR)
return FALSE;
return TRUE;
}
static void
gimp_brush_pipe_destroy (GtkObject *object)
{
GimpBrushPipe *pipe;
gint i;
g_return_if_fail (object != NULL);
g_return_if_fail (GIMP_IS_BRUSH_PIPE (object));
pipe = GIMP_BRUSH_PIPE (object);
g_free (pipe->rank);
g_free (pipe->stride);
for (i = 1; i < pipe->nbrushes; i++)
if (pipe->brushes[i])
gtk_object_unref (GTK_OBJECT (pipe->brushes[i]));
g_free (pipe->brushes);
g_free (pipe->select);
g_free (pipe->index);
if (GTK_OBJECT_CLASS (parent_class)->destroy)
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
static void
gimp_brush_pipe_class_init (GimpBrushPipeClass *klass)
{
GtkObjectClass *object_class;
GimpBrushClass *brush_class;
object_class = GTK_OBJECT_CLASS (klass);
brush_class = GIMP_BRUSH_CLASS (klass);
parent_class = gtk_type_class (GIMP_TYPE_BRUSH);
brush_class->select_brush = gimp_brush_pipe_select_brush;
brush_class->want_null_motion = gimp_brush_pipe_want_null_motion;
object_class->destroy = gimp_brush_pipe_destroy;
}
void
gimp_brush_pipe_init (GimpBrushPipe *pipe)
{
pipe->current = NULL;
pipe->dimension = 0;
pipe->rank = NULL;
pipe->stride = NULL;
pipe->nbrushes = 0;
pipe->brushes = NULL;
pipe->select = NULL;
pipe->index = NULL;
}
GtkType
gimp_brush_pipe_get_type (void)
{
static GtkType type = 0;
if (!type)
{
GtkTypeInfo info =
{
"GimpBrushPipe",
sizeof (GimpBrushPipe),
sizeof (GimpBrushPipeClass),
(GtkClassInitFunc) gimp_brush_pipe_class_init,
(GtkObjectInitFunc) gimp_brush_pipe_init,
/* reserved_1 */ NULL,
/* reserved_2 */ NULL,
(GtkClassInitFunc) NULL
};
type = gtk_type_unique (GIMP_TYPE_BRUSH, &info);
}
return type;
}
#include <errno.h>
GimpBrush *
gimp_brush_pipe_load (gchar *filename)
{
GimpBrushPipe *pipe = NULL;
GimpPixPipeParams params;
gint i;
gint num_of_brushes = 0;
gint totalcells;
gchar *paramstring;
GString *buffer;
gchar c;
gint fd;
g_return_val_if_fail (filename != NULL, NULL);
fd = open (filename, O_RDONLY | _O_BINARY);
if (fd == -1)
{
g_message ("Couldn't open file '%s'", filename);
return NULL;
}
/* The file format starts with a painfully simple text header */
/* get the name */
buffer = g_string_new (NULL);
while (read (fd, &c, 1) == 1 && c != '\n' && buffer->len < 1024)
g_string_append_c (buffer, c);
if (buffer->len > 0 && buffer->len < 1024)
{
pipe = GIMP_BRUSH_PIPE (gtk_type_new (GIMP_TYPE_BRUSH_PIPE));
GIMP_BRUSH (pipe)->name = buffer->str;
}
g_string_free (buffer, FALSE);
if (!pipe)
{
g_message ("Couldn't read name for brush pipe from file '%s'\n",
filename);
close (fd);
return NULL;
}
/* get the number of brushes */
buffer = g_string_new (NULL);
while (read (fd, &c, 1) == 1 && c != '\n' && buffer->len < 1024)
g_string_append_c (buffer, c);
if (buffer->len > 0 && buffer->len < 1024)
{
num_of_brushes = strtol (buffer->str, &paramstring, 10);
}
if (num_of_brushes < 1)
{
g_message (_("Brush pipes should have at least one brush:\n\"%s\""),
filename);
close (fd);
gtk_object_sink (GTK_OBJECT (pipe));
g_string_free (buffer, TRUE);
return NULL;
}
while (*paramstring && isspace (*paramstring))
paramstring++;
if (*paramstring)
{
gimp_pixpipe_params_init (&params);
gimp_pixpipe_params_parse (paramstring, &params);
pipe->dimension = params.dim;
pipe->rank = g_new0 (gint, pipe->dimension);
pipe->select = g_new0 (PipeSelectModes, pipe->dimension);
pipe->index = g_new0 (gint, pipe->dimension);
/* placement is not used at all ?? */
if (params.free_placement_string)
g_free (params.placement);
for (i = 0; i < pipe->dimension; i++)
{
pipe->rank[i] = params.rank[i];
if (strcmp (params.selection[i], "incremental") == 0)
pipe->select[i] = PIPE_SELECT_INCREMENTAL;
else if (strcmp (params.selection[i], "angular") == 0)
pipe->select[i] = PIPE_SELECT_ANGULAR;
else if (strcmp (params.selection[i], "velocity") == 0)
pipe->select[i] = PIPE_SELECT_VELOCITY;
else if (strcmp (params.selection[i], "random") == 0)
pipe->select[i] = PIPE_SELECT_RANDOM;
else if (strcmp (params.selection[i], "pressure") == 0)
pipe->select[i] = PIPE_SELECT_PRESSURE;
else if (strcmp (params.selection[i], "xtilt") == 0)
pipe->select[i] = PIPE_SELECT_TILT_X;
else if (strcmp (params.selection[i], "ytilt") == 0)
pipe->select[i] = PIPE_SELECT_TILT_Y;
else
pipe->select[i] = PIPE_SELECT_CONSTANT;
if (params.free_selection_string)
g_free (params.selection[i]);
pipe->index[i] = 0;
}
}
else
{
pipe->dimension = 1;
pipe->rank = g_new (gint, 1);
pipe->rank[0] = num_of_brushes;
pipe->select = g_new (PipeSelectModes, 1);
pipe->select[0] = PIPE_SELECT_INCREMENTAL;
pipe->index = g_new (gint, 1);
pipe->index[0] = 0;
}
g_string_free (buffer, TRUE);
totalcells = 1; /* Not all necessarily present, maybe */
for (i = 0; i < pipe->dimension; i++)
totalcells *= pipe->rank[i];
pipe->stride = g_new0 (gint, pipe->dimension);
for (i = 0; i < pipe->dimension; i++)
{
if (i == 0)
pipe->stride[i] = totalcells / pipe->rank[i];
else
pipe->stride[i] = pipe->stride[i-1] / pipe->rank[i];
}
g_assert (pipe->stride[pipe->dimension-1] == 1);
pipe->brushes = g_new0 (GimpBrush *, num_of_brushes);
while (pipe->nbrushes < num_of_brushes)
{
pipe->brushes[pipe->nbrushes] = gimp_brush_load_brush (fd, filename);
if (pipe->brushes[pipe->nbrushes])
{
gtk_object_ref (GTK_OBJECT (pipe->brushes[pipe->nbrushes]));
gtk_object_sink (GTK_OBJECT (pipe->brushes[pipe->nbrushes]));
g_free (GIMP_BRUSH (pipe->brushes[pipe->nbrushes])->name);
GIMP_BRUSH (pipe->brushes[pipe->nbrushes])->name = NULL;
}
else
{
g_message (_("Failed to load one of the brushes in the brush pipe\n\"%s\""),
filename);
close (fd);
gtk_object_sink (GTK_OBJECT (pipe));
return NULL;
}
pipe->nbrushes++;
}
/* Current brush is the first one. */
pipe->current = pipe->brushes[0];
/* just to satisfy the code that relies on this crap */
GIMP_BRUSH (pipe)->filename = g_strdup (filename);
GIMP_BRUSH (pipe)->spacing = pipe->current->spacing;
GIMP_BRUSH (pipe)->x_axis = pipe->current->x_axis;
GIMP_BRUSH (pipe)->y_axis = pipe->current->y_axis;
GIMP_BRUSH (pipe)->mask = pipe->current->mask;
GIMP_BRUSH (pipe)->pixmap = pipe->current->pixmap;
close (fd);
return GIMP_BRUSH (pipe);
}

View File

@@ -1,85 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
* Copyright (C) 1999 Adrian Likins and Tor Lillqvist
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __GIMP_BRUSH_PIPE_H__
#define __GIMP_BRUSH_PIPE_H__
#include "tools.h"
#include "paint_core.h"
#include "gimpbrush.h"
#include "temp_buf.h"
typedef struct _GimpBrushPipe GimpBrushPipe;
#define GIMP_TYPE_BRUSH_PIPE (gimp_brush_pipe_get_type ())
#define GIMP_BRUSH_PIPE(obj) (GTK_CHECK_CAST ((obj), GIMP_TYPE_BRUSH_PIPE, GimpBrushPipe))
#define GIMP_IS_BRUSH_PIPE(obj) (GTK_CHECK_TYPE ((obj), GIMP_TYPE_BRUSH_PIPE))
typedef enum
{
PIPE_SELECT_CONSTANT,
PIPE_SELECT_INCREMENTAL,
PIPE_SELECT_ANGULAR,
PIPE_SELECT_VELOCITY,
PIPE_SELECT_RANDOM,
PIPE_SELECT_PRESSURE,
PIPE_SELECT_TILT_X,
PIPE_SELECT_TILT_Y
} PipeSelectModes;
struct _GimpBrushPipe
{
GimpBrush gbrush; /* Also itself a brush */
gint dimension;
gint *rank; /* Size in each dimension */
gint *stride; /* Aux for indexing */
PipeSelectModes *select; /* One mode per dimension */
gint *index; /* Current index for incremental dimensions */
gint nbrushes; /* Might be less than the product of the
* ranks in some odd special case */
GimpBrush **brushes;
GimpBrush *current; /* Currently selected brush */
};
typedef struct _GimpBrushPipeClass GimpBrushPipeClass;
struct _GimpBrushPipeClass
{
GimpBrushClass parent_class;
};
GtkType gimp_brush_pixmap_get_type (void);
GtkType gimp_brush_pipe_get_type (void);
GimpBrush * gimp_brush_pipe_load (gchar *filename);
#endif /* __GIMP_BRUSH_PIPE_H__ */

File diff suppressed because it is too large Load Diff

View File

@@ -1,210 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __CHANNEL_H__
#define __CHANNEL_H__
#include "apptypes.h"
#include "drawable.h"
#include "boundary.h"
#include "temp_buf.h"
#include "tile_manager.h"
/* OPERATIONS */
typedef enum
{
ADD,
SUB,
REPLACE,
INTERSECT
} ChannelOps;
/* Half way point where a region is no longer visible in a selection */
#define HALF_WAY 127
/* structure declarations */
#define GIMP_TYPE_CHANNEL (gimp_channel_get_type ())
#define GIMP_CHANNEL(obj) (GTK_CHECK_CAST ((obj), GIMP_TYPE_CHANNEL, GimpChannel))
#define GIMP_CHANNEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GIMP_TYPE_CHANNEL, GimpChannelClass))
#define GIMP_IS_CHANNEL(obj) (GTK_CHECK_TYPE ((obj), GIMP_TYPE_CHANNEL))
#define GIMP_IS_CHANNEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_CHANNEL))
GtkType gimp_channel_get_type (void);
/* Special undo type */
typedef struct _ChannelUndo ChannelUndo;
struct _ChannelUndo
{
Channel *channel; /* the actual channel */
gint prev_position; /* former position in list */
Channel *prev_channel; /* previous active channel */
};
/* Special undo type */
typedef struct _MaskUndo MaskUndo;
struct _MaskUndo
{
TileManager *tiles; /* the actual mask */
gint x, y; /* offsets */
};
/* function declarations */
Channel * channel_new (GimpImage *gimage,
gint width,
gint height,
gchar *name,
gint opacity,
guchar *col);
Channel * channel_copy (Channel *channel);
Channel * channel_ref (Channel *channel);
void channel_unref (Channel *channel);
gchar * channel_get_name (Channel *channel);
void channel_set_name (Channel *channel,
gchar *name);
gint channel_get_opacity (Channel *channel);
void channel_set_opacity (Channel *channel,
gint opacity);
guchar * channel_get_color (Channel *channel);
void channel_set_color (Channel *channel,
guchar *color);
Channel * channel_get_ID (gint ID);
void channel_delete (Channel *channel);
void channel_removed (Channel *channel,
gpointer data);
void channel_scale (Channel *channel,
gint new_width,
gint new_height);
void channel_resize (Channel *channel,
gint new_width,
gint new_height,
gint offx,
gint offy);
void channel_update (Channel *channel);
/* access functions */
gboolean channel_toggle_visibility (Channel *channel);
TempBuf * channel_preview (Channel *channel,
gint width,
gint height);
void channel_invalidate_previews (GimpImage *gimage);
Tattoo channel_get_tattoo (const Channel *channel);
void channel_set_tattoo (const Channel *channel,
Tattoo value);
/* selection mask functions */
Channel * channel_new_mask (GimpImage *gimage,
gint width,
gint height);
gboolean channel_boundary (Channel *mask,
BoundSeg **segs_in,
BoundSeg **segs_out,
gint *num_segs_in,
gint *num_segs_out,
gint x1,
gint y1,
gint x2,
gint y2);
gboolean channel_bounds (Channel *mask,
gint *x1,
gint *y1,
gint *x2,
gint *y2);
gint channel_value (Channel *mask,
gint x,
gint y);
gboolean channel_is_empty (Channel *mask);
void channel_add_segment (Channel *mask,
gint x,
gint y,
gint width,
gint value);
void channel_sub_segment (Channel *mask,
gint x,
gint y,
gint width,
gint value);
void channel_combine_rect (Channel *mask,
ChannelOps op,
gint x,
gint y,
gint w,
gint h);
void channel_combine_ellipse (Channel *mask,
ChannelOps op,
gint x,
gint y,
gint w,
gint h,
gboolean antialias);
void channel_combine_mask (Channel *mask,
Channel *add_on,
ChannelOps op,
gint off_x,
gint off_y);
void channel_feather (Channel *input,
Channel *output,
gdouble radius_x,
gdouble radius_y,
ChannelOps op,
gint off_x,
gint off_y);
void channel_push_undo (Channel *mask);
void channel_clear (Channel *mask);
void channel_invert (Channel *mask);
void channel_sharpen (Channel *mask);
void channel_all (Channel *mask);
void channel_border (Channel *mask,
gint radius_x,
gint radius_y);
void channel_grow (Channel *mask,
gint radius_x,
gint radius_y);
void channel_shrink (Channel *mask,
gint radius_x,
gint radius_y,
gboolean edge_lock);
void channel_translate (Channel *mask,
gint off_x,
gint off_y);
void channel_load (Channel *mask,
Channel *channel);
void channel_invalidate_bounds (Channel *channel);
#define drawable_channel GIMP_IS_CHANNEL
#endif /* __CHANNEL_H__ */

File diff suppressed because it is too large Load Diff

View File

@@ -1,210 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __CHANNEL_H__
#define __CHANNEL_H__
#include "apptypes.h"
#include "drawable.h"
#include "boundary.h"
#include "temp_buf.h"
#include "tile_manager.h"
/* OPERATIONS */
typedef enum
{
ADD,
SUB,
REPLACE,
INTERSECT
} ChannelOps;
/* Half way point where a region is no longer visible in a selection */
#define HALF_WAY 127
/* structure declarations */
#define GIMP_TYPE_CHANNEL (gimp_channel_get_type ())
#define GIMP_CHANNEL(obj) (GTK_CHECK_CAST ((obj), GIMP_TYPE_CHANNEL, GimpChannel))
#define GIMP_CHANNEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GIMP_TYPE_CHANNEL, GimpChannelClass))
#define GIMP_IS_CHANNEL(obj) (GTK_CHECK_TYPE ((obj), GIMP_TYPE_CHANNEL))
#define GIMP_IS_CHANNEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_CHANNEL))
GtkType gimp_channel_get_type (void);
/* Special undo type */
typedef struct _ChannelUndo ChannelUndo;
struct _ChannelUndo
{
Channel *channel; /* the actual channel */
gint prev_position; /* former position in list */
Channel *prev_channel; /* previous active channel */
};
/* Special undo type */
typedef struct _MaskUndo MaskUndo;
struct _MaskUndo
{
TileManager *tiles; /* the actual mask */
gint x, y; /* offsets */
};
/* function declarations */
Channel * channel_new (GimpImage *gimage,
gint width,
gint height,
gchar *name,
gint opacity,
guchar *col);
Channel * channel_copy (Channel *channel);
Channel * channel_ref (Channel *channel);
void channel_unref (Channel *channel);
gchar * channel_get_name (Channel *channel);
void channel_set_name (Channel *channel,
gchar *name);
gint channel_get_opacity (Channel *channel);
void channel_set_opacity (Channel *channel,
gint opacity);
guchar * channel_get_color (Channel *channel);
void channel_set_color (Channel *channel,
guchar *color);
Channel * channel_get_ID (gint ID);
void channel_delete (Channel *channel);
void channel_removed (Channel *channel,
gpointer data);
void channel_scale (Channel *channel,
gint new_width,
gint new_height);
void channel_resize (Channel *channel,
gint new_width,
gint new_height,
gint offx,
gint offy);
void channel_update (Channel *channel);
/* access functions */
gboolean channel_toggle_visibility (Channel *channel);
TempBuf * channel_preview (Channel *channel,
gint width,
gint height);
void channel_invalidate_previews (GimpImage *gimage);
Tattoo channel_get_tattoo (const Channel *channel);
void channel_set_tattoo (const Channel *channel,
Tattoo value);
/* selection mask functions */
Channel * channel_new_mask (GimpImage *gimage,
gint width,
gint height);
gboolean channel_boundary (Channel *mask,
BoundSeg **segs_in,
BoundSeg **segs_out,
gint *num_segs_in,
gint *num_segs_out,
gint x1,
gint y1,
gint x2,
gint y2);
gboolean channel_bounds (Channel *mask,
gint *x1,
gint *y1,
gint *x2,
gint *y2);
gint channel_value (Channel *mask,
gint x,
gint y);
gboolean channel_is_empty (Channel *mask);
void channel_add_segment (Channel *mask,
gint x,
gint y,
gint width,
gint value);
void channel_sub_segment (Channel *mask,
gint x,
gint y,
gint width,
gint value);
void channel_combine_rect (Channel *mask,
ChannelOps op,
gint x,
gint y,
gint w,
gint h);
void channel_combine_ellipse (Channel *mask,
ChannelOps op,
gint x,
gint y,
gint w,
gint h,
gboolean antialias);
void channel_combine_mask (Channel *mask,
Channel *add_on,
ChannelOps op,
gint off_x,
gint off_y);
void channel_feather (Channel *input,
Channel *output,
gdouble radius_x,
gdouble radius_y,
ChannelOps op,
gint off_x,
gint off_y);
void channel_push_undo (Channel *mask);
void channel_clear (Channel *mask);
void channel_invert (Channel *mask);
void channel_sharpen (Channel *mask);
void channel_all (Channel *mask);
void channel_border (Channel *mask,
gint radius_x,
gint radius_y);
void channel_grow (Channel *mask,
gint radius_x,
gint radius_y);
void channel_shrink (Channel *mask,
gint radius_x,
gint radius_y,
gboolean edge_lock);
void channel_translate (Channel *mask,
gint off_x,
gint off_y);
void channel_load (Channel *mask,
Channel *channel);
void channel_invalidate_bounds (Channel *channel);
#define drawable_channel GIMP_IS_CHANNEL
#endif /* __CHANNEL_H__ */

File diff suppressed because it is too large Load Diff

View File

@@ -1,290 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimpcontext.h: Copyright (C) 1999 Michael Natterer <mitch@gimp.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __GIMP_CONTEXT_H__
#define __GIMP_CONTEXT_H__
#include "apptypes.h"
#include "gdisplay.h"
#include "gradient.h"
#include "patterns.h"
#include "toolsF.h"
#define GIMP_TYPE_CONTEXT (gimp_context_get_type ())
#define GIMP_CONTEXT(obj) (GTK_CHECK_CAST ((obj), GIMP_TYPE_CONTEXT, GimpContext))
#define GIMP_CONTEXT_CLASS(klass) (GTK_CHECK_CLASS_CAST (klass, GIMP_TYPE_CONTEXT, GimpContextClass))
#define GIMP_IS_CONTEXT(obj) (GTK_CHECK_TYPE ((obj), GIMP_TYPE_CONTEXT))
#define GIMP_IS_CONTEXT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_CONTEXT))
typedef enum
{
GIMP_CONTEXT_ARG_IMAGE,
GIMP_CONTEXT_ARG_DISPLAY,
GIMP_CONTEXT_ARG_TOOL,
GIMP_CONTEXT_ARG_FOREGROUND,
GIMP_CONTEXT_ARG_BACKGROUND,
GIMP_CONTEXT_ARG_OPACITY,
GIMP_CONTEXT_ARG_PAINT_MODE,
GIMP_CONTEXT_ARG_BRUSH,
GIMP_CONTEXT_ARG_PATTERN,
GIMP_CONTEXT_ARG_GRADIENT,
GIMP_CONTEXT_NUM_ARGS
} GimpContextArgType;
typedef enum
{
GIMP_CONTEXT_IMAGE_MASK = 1 << 0,
GIMP_CONTEXT_DISPLAY_MASK = 1 << 1,
GIMP_CONTEXT_TOOL_MASK = 1 << 2,
GIMP_CONTEXT_FOREGROUND_MASK = 1 << 3,
GIMP_CONTEXT_BACKGROUND_MASK = 1 << 4,
GIMP_CONTEXT_OPACITY_MASK = 1 << 5,
GIMP_CONTEXT_PAINT_MODE_MASK = 1 << 6,
GIMP_CONTEXT_BRUSH_MASK = 1 << 7,
GIMP_CONTEXT_PATTERN_MASK = 1 << 8,
GIMP_CONTEXT_GRADIENT_MASK = 1 << 9,
/* aliases */
GIMP_CONTEXT_PAINT_ARGS_MASK = GIMP_CONTEXT_FOREGROUND_MASK |
GIMP_CONTEXT_BACKGROUND_MASK |
GIMP_CONTEXT_OPACITY_MASK |
GIMP_CONTEXT_PAINT_MODE_MASK |
GIMP_CONTEXT_BRUSH_MASK |
GIMP_CONTEXT_PATTERN_MASK |
GIMP_CONTEXT_GRADIENT_MASK,
GIMP_CONTEXT_ALL_ARGS_MASK = GIMP_CONTEXT_IMAGE_MASK |
GIMP_CONTEXT_DISPLAY_MASK |
GIMP_CONTEXT_TOOL_MASK |
GIMP_CONTEXT_PAINT_ARGS_MASK
} GimpContextArgMask;
typedef struct _GimpContext GimpContext;
typedef struct _GimpContextClass GimpContextClass;
struct _GimpContext
{
GimpObject object;
gchar *name;
GimpContext *parent;
guint32 defined_args;
GimpImage *image;
GDisplay *display;
ToolType tool;
guchar foreground[3];
guchar background[3];
gdouble opacity;
LayerModeEffects paint_mode;
GimpBrush *brush;
gchar *brush_name;
GPattern *pattern;
gchar *pattern_name;
gradient_t *gradient;
gchar *gradient_name;
};
struct _GimpContextClass
{
GimpObjectClass parent_class;
void (* image_changed) (GimpContext *context,
GimpImage *image);
void (* display_changed) (GimpContext *context,
GDisplay *display);
void (* tool_changed) (GimpContext *context,
ToolType tool);
void (* foreground_changed) (GimpContext *context,
gint r,
gint g,
gint b);
void (* background_changed) (GimpContext *context,
gint r,
gint g,
gint b);
void (* opacity_changed) (GimpContext *context,
gdouble opacity);
void (* paint_mode_changed) (GimpContext *context,
LayerModeEffects paint_mode);
void (* brush_changed) (GimpContext *context,
GimpBrush *brush);
void (* pattern_changed) (GimpContext *context,
GPattern *pattern);
void (* gradient_changed) (GimpContext *context,
gradient_t *gradient);
};
GtkType gimp_context_get_type (void);
GimpContext * gimp_context_new (const gchar *name,
GimpContext *template);
/* TODO: - gimp_context_find ()
*
* probably interacting with the context manager:
* - gimp_context_push () which will call gimp_context_set_parent()
* - gimp_context_push_new () to do a GL-style push
* - gimp_context_pop ()
*
* a proper mechanism to prevent silly operations like pushing
* the user context to some client stack etc.
*/
/* to be used by the context management system only
*/
void gimp_context_set_current (GimpContext *context);
void gimp_context_set_user (GimpContext *context);
void gimp_context_set_default (GimpContext *context);
/* these are always available
*/
GimpContext * gimp_context_get_current (void);
GimpContext * gimp_context_get_user (void);
GimpContext * gimp_context_get_default (void);
GimpContext * gimp_context_get_standard (void);
/* functions for manipulating a single context
*/
gchar * gimp_context_get_name (GimpContext *context);
void gimp_context_set_name (GimpContext *context,
const gchar *name);
GimpContext * gimp_context_get_parent (GimpContext *context);
void gimp_context_set_parent (GimpContext *context,
GimpContext *parent);
void gimp_context_unset_parent (GimpContext *context);
/* define / undefinine context arguments
*
* the value of an undefined argument will be taken from the parent context.
*/
void gimp_context_define_arg (GimpContext *context,
GimpContextArgType arg,
gboolean defined);
gboolean gimp_context_arg_defined (GimpContext *context,
GimpContextArgType arg);
void gimp_context_define_args (GimpContext *context,
GimpContextArgMask args_mask,
gboolean defined);
/* copying context arguments
*/
void gimp_context_copy_arg (GimpContext *src,
GimpContext *dest,
GimpContextArgType arg);
void gimp_context_copy_args (GimpContext *src,
GimpContext *dest,
GimpContextArgMask args_mask);
/* image */
GimpImage * gimp_context_get_image (GimpContext *context);
void gimp_context_set_image (GimpContext *context,
GimpImage *image);
void gimp_context_image_changed (GimpContext *context);
/* display */
GDisplay * gimp_context_get_display (GimpContext *context);
void gimp_context_set_display (GimpContext *context,
GDisplay *display);
void gimp_context_display_changed (GimpContext *context);
/* tool */
ToolType gimp_context_get_tool (GimpContext *context);
void gimp_context_set_tool (GimpContext *context,
ToolType tool_type);
void gimp_context_tool_changed (GimpContext *context);
/* foreground color */
void gimp_context_get_foreground (GimpContext *context,
guchar *r,
guchar *g,
guchar *b);
void gimp_context_set_foreground (GimpContext *context,
gint r,
gint g,
gint b);
void gimp_context_foreground_changed (GimpContext *context);
/* background color */
void gimp_context_get_background (GimpContext *context,
guchar *r,
guchar *g,
guchar *b);
void gimp_context_set_background (GimpContext *context,
gint r,
gint g,
gint b);
void gimp_context_background_changed (GimpContext *context);
/* color utility functions */
void gimp_context_set_default_colors (GimpContext *context);
void gimp_context_swap_colors (GimpContext *context);
/* opacity */
gdouble gimp_context_get_opacity (GimpContext *context);
void gimp_context_set_opacity (GimpContext *context,
gdouble opacity);
void gimp_context_opacity_changed (GimpContext *context);
/* paint mode */
LayerModeEffects gimp_context_get_paint_mode (GimpContext *context);
void gimp_context_set_paint_mode (GimpContext *context,
LayerModeEffects paint_mode);
void gimp_context_paint_mode_changed (GimpContext *context);
/* brush */
GimpBrush * gimp_context_get_brush (GimpContext *context);
void gimp_context_set_brush (GimpContext *context,
GimpBrush *brush);
void gimp_context_brush_changed (GimpContext *context);
void gimp_context_refresh_brushes (void);
/* pattern */
GPattern * gimp_context_get_pattern (GimpContext *context);
void gimp_context_set_pattern (GimpContext *context,
GPattern *pattern);
void gimp_context_pattern_changed (GimpContext *context);
void gimp_context_refresh_patterns (void);
void gimp_context_update_patterns (GPattern *pattern);
/* gradient */
gradient_t * gimp_context_get_gradient (GimpContext *context);
void gimp_context_set_gradient (GimpContext *context,
gradient_t *gradient);
void gimp_context_gradient_changed (GimpContext *context);
void gimp_context_refresh_gradients (void);
void gimp_context_update_gradients (gradient_t *gradient);
#endif /* __GIMP_CONTEXT_H__ */

Some files were not shown because too many files have changed in this diff Show More