GAP updates

--Sven
This commit is contained in:
Sven Neumann 1999-11-16 10:19:00 +00:00
parent 9d30e3594b
commit a9ce554f5a
6 changed files with 121 additions and 80 deletions

View File

@ -1,3 +1,12 @@
Tue Nov 16 11:16:41 MET 1999 Sven Neumann <sven@gimp.org>
* plug-ins/gap/README
* plug-ins/gap/gap_filter_iterators.c
* plug-ins/gap/gap_main.c
* plug-ins/gap/iter_ALT/mod/plug_in_nova_iter_ALT.inc
* plug-ins/gap/iter_ALT/old/plug_in_warp_iter_ALT.inc: applied a patch
from Wolfgang Hofer <hof@hotbot.com> with updates to the GAP
1999-11-15 Tor Lillqvist <tml@iki.fi>
* app/gimpcontext.c (gimp_context_copy_background): Fix copy&paste

View File

@ -263,14 +263,14 @@ WebTip: My GIMP-page http://pages.hotbot.com/arts/hof/index.html
Save your Image as XCF file. (File->Save as)
use a Name that ends up in _0001.xcf (or _0001.xcfgz)
Then duplicate your image (AnimFrames->Duplicate)
Then duplicate your image (Video->Duplicate)
You'll be asked how much Copies you need.
(Note: all copies are stored on disk immediate
without explicite save)
- from an existing (layeranimated) multilayer image
use
AnimFrames->Split Img to frames
Video->Split Img to frames
This will create Frames, a series of Images on disk,
with a Name that ends up in _0001.xcf).
@ -294,18 +294,18 @@ WebTip: My GIMP-page http://pages.hotbot.com/arts/hof/index.html
walk through the frames.
Here are my settings (excerpt from my $HOME/.gimp/menurc )
(menu-path "<Image>/AnimFrames/Goto First" "<control><alt>1")
(menu-path "<Image>/AnimFrames/Goto Prev" "<alt>1")
(menu-path "<Image>/AnimFrames/Goto Next" "<alt>2")
(menu-path "<Image>/AnimFrames/Goto Any" "<alt>3")
(menu-path "<Image>/AnimFrames/Goto Last" "<control><alt>2")
(menu-path "<Image>/Video/Goto First" "<control><alt>1")
(menu-path "<Image>/Video/Goto Prev" "<alt>1")
(menu-path "<Image>/Video/Goto Next" "<alt>2")
(menu-path "<Image>/Video/Goto Any" "<alt>3")
(menu-path "<Image>/Video/Goto Last" "<control><alt>2")
- Playback
playbak of multilayered image is not available.
(it would be very slow)
But you can convert your frames to one Multilayer Image
(AnimFrames->Frames to Image)
(Video->Frames to Image)
And then playback the newly created Image
(Filters->Animation->Playback)
@ -326,7 +326,7 @@ WebTip: My GIMP-page http://pages.hotbot.com/arts/hof/index.html
Invoke this Plugin from one of the frames:
(Menu: AnimFrames->Move Path)
(Menu: Video->Move Path)
The selected Layer(s) of the Source Image
is (are) copied into the selected range of frames.
@ -407,7 +407,7 @@ WebTip: My GIMP-page http://pages.hotbot.com/arts/hof/index.html
- Convert frames to one multilayered Image.
This can be done with
(AnimFrames->Frames to Image)
(Video->Frames to Image)
The selected Source Range of Frames is copied into one
new created multilayered destination Image.
@ -598,21 +598,21 @@ WebTip: My GIMP-page http://pages.hotbot.com/arts/hof/index.html
To Prepare for MPEG encoding:
- Use 'Frames Convert' from the AnimFrames Menu
- Use 'Frames Convert' from the Video Menu
to convert your AnimFrames to .ppm
(or another Fileformat that can be read directly by
your encoder)
- If you have a Layerstack-Animated Multilayer Image
You can use 'Split Img to Frames' from the AnimFrames Menu.
You can use 'Split Img to Frames' from the Video Menu.
- If you are using mpeg_encode and
height or width are not multiples of 16:
Use 'Frames Scale' or 'Frames Crop' from the AnimFrames Menu
Use 'Frames Scale' or 'Frames Crop' from the Video Menu
on the newly converted/created AnimFrames.
- Then use 'Frames MPEG2_encode' or 'Frames MPEG_encode'
from the AnimFrames Menu.
- Then use 'Encode/MPEG2 (mpeg2encode)' or 'Encode/MPEG1 (mpeg_encode)'
from the Video Menu.
(Invoked from one of the prepared AnimFrames)
Both encoders offer a lot of Parameter Settings for the experienced
@ -635,20 +635,20 @@ WebTip: My GIMP-page http://pages.hotbot.com/arts/hof/index.html
This can be done if you create a series of empty frames.
The Number of frames should be equal to the number of layers
in your multilayered image.
(File->New, AnimFrames->Duplicate)
(File->New, Video->Duplicate)
Then use the "Move Path" Plugin (AnimFrames->Move Path)
Then use the "Move Path" Plugin (Video->Move Path)
to copy the layers to all your frames.
Use 2 Points with both X=0, Y=0, Opacity=100%, Width=100%, Height=100%,
select the 1.st Layer of your multilayer Image as Source,
Handle=LeftTop, Mode=Normal, Stepmode=Loop
Finally you can delete the (empty) backround Layers
(AnimFrames->Frames LayerDel) with Layerstack Parameter >= 1
(Video->Frames LayerDel) with Layerstack Parameter >= 1
- Reverse the order of Layers within one multilayer Image
Convert one multilayer Image to a series of frames (see above)
then select AnimFrames->FramesToImage and use an invers Range
then select Video->FramesToImage and use an invers Range
from N to 1.
- Convert multiple frames from one Fileformat to another:
@ -656,7 +656,7 @@ WebTip: My GIMP-page http://pages.hotbot.com/arts/hof/index.html
(Example: img_0001.tif, img_0003.tif img_0004.tif)
then load the 1.st image into the gimp (File->Load)
and select (AnimFrames->Frames Convert)
and select (Video->Frames Convert)
In the following dialog window you can select
the desired destination filtype by its typical extension
(.jpg, .bmp or so on)
@ -680,14 +680,14 @@ WebTip: My GIMP-page http://pages.hotbot.com/arts/hof/index.html
- NO UNDO
There is no Undo for the AnimFrame Plugins.
Note: If you step to the next frame (AnimFrames->Goto Next)
Note: If you step to the next frame (Video->Goto Next)
the current frame is saved to disk and the next frame
is loaded into the image.
All Undo steps were cleared at this time.
Tip: "undo" for Move Path
You can Delete the Layers at desired Layerstackposition
(0 == on top) by (AnimFrames->Frames LayerDel)
(0 == on top) by (Video->Frames LayerDel)
So you can remove all the Layers inserted by "Move Path" plugin.
- About Locks
@ -710,12 +710,12 @@ WebTip: My GIMP-page http://pages.hotbot.com/arts/hof/index.html
In this constellation both gap plugins may concurrent
in save/load to/from the same file.
Example:
call from "img_0001.xcf" AnimFrames->Delete Frames (range 0001 to 0003)
call from "img_0001.xcf" Video->Delete Frames (range 0001 to 0003)
now img_0004.xcf is renamed to img_0001.xcf
img_0005.xcf is renamed to img_0002.xcf
then
call from "img_0002.xcf" AnimFrames->Goto First
call from "img_0002.xcf" Video->Goto First
the img_0002.xcf (its old content) is saved,
overwiting wht was img_0004.xcf before.
If you make the 2nd call while the 1st one is in progress,
@ -725,7 +725,7 @@ WebTip: My GIMP-page http://pages.hotbot.com/arts/hof/index.html
- Animated calls of Plug-In Filters:
First of all, you need a multilayered Image.
You can use "<Image>->AnimFrames->Frames to Image"
You can use "<Image>->Video->Frames to Image"
to create one from a series of Frames,
or Duplicate the backround Layer of a single Layered Image
(Press Ctrl-C within the layers_dialog Window N-times)
@ -848,62 +848,62 @@ plugin's included in release gap 0.99.00:
plug_in_gap_next
"This plugin exchanges current image with (next nubered) image from disk.",
"<Image>/AnimFrames/Goto Next",
"<Image>/Video/Goto Next",
plug_in_gap_prev
"This plugin exchanges current image with (previous nubered) image from disk.",
"<Image>/AnimFrames/Goto Prev",
"<Image>/Video/Goto Prev",
plug_in_gap_first
"This plugin exchanges current image with (lowest nubered) image from disk.",
"<Image>/AnimFrames/Goto First",
"<Image>/Video/Goto First",
plug_in_gap_last
"This plugin exchanges current image with (highest nubered) image from disk.",
"<Image>/AnimFrames/Goto Last",
"<Image>/Video/Goto Last",
plug_in_gap_goto
"This plugin exchanges current image with requested image (nr) from disk.",
"<Image>/AnimFrames/Goto Any",
"<Image>/Video/Goto Any",
plug_in_gap_del
"This plugin deltes the given number of frames from disk
including the current frame.",
"<Image>/AnimFrames/Delete Frames",
"<Image>/Video/Delete Frames",
plug_in_gap_dup
"This plugin duplicates the current frames on disk n-times.",
"<Image>/AnimFrames/Duplicate Frames",
"<Image>/Video/Duplicate Frames",
plug_in_gap_exchg
"This plugin exchanges content of the current with destination frame.",
"<Image>/AnimFrames/Exchange Frame",
"<Image>/Video/Exchange Frame",
plug_in_gap_move
"This plugin copies layer(s) from one sourceimage to multiple frames on disk,
varying position, size and opacity.",
"<Image>/AnimFrames/Move Path",
"<Image>/Video/Move Path",
plug_in_gap_range_to_multilayer
"This plugin creates a new image from the given range of frame-images.
Each frame is converted to one layer in the new image, according to flatten_mode.
(the frames on disk are not changed).",
"<Image>/AnimFrames/Frames to Image",
"<Image>/Video/Frames to Image",
plug_in_gap_range_flatten
"This plugin flattens the given range of frame-images (on disk)",
"<Image>/AnimFrames/Frames Flatten",
"<Image>/Video/Frames Flatten",
plug_in_gap_range_layer_del
"This plugin deletes one layer in the given range of frame-images (on disk).
exception: the last remaining layer of a frame is not deleted",
"<Image>/AnimFrames/Frames LayerDel",
"<Image>/Video/Frames LayerDel",
plug_in_gap_range_convert
"This plugin converts the given range of frame-images to other fileformats
(on disk) depending on extension",
"<Image>/AnimFrames/Frames Convert",
"<Image>/Video/Frames Convert",
plug_in_gap_layers_run_animfilter
"This plugin calls another plugin for each layer of an image,
@ -915,12 +915,12 @@ plugin's included in release gap 0.99.00:
plug_in_gap_anim_resize
"This plugin resizes all anim_frames (images on disk)
to the given new_width/new_height",
"<Image>/AnimFrames/Frames Resize",
"<Image>/Video/Frames Resize",
plug_in_gap_anim_crop
"This plugin crops all anim_frames (images on disk)
to the given new_width/new_height",
"<Image>/AnimFrames/Frames Crop",
"<Image>/Video/Frames Crop",
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_resize, nreturn_vals,
@ -929,35 +929,35 @@ plugin's included in release gap 0.99.00:
plug_in_gap_anim_scale
"This plugin scales all anim_frames (images on disk)
to the given new_width/new_height",
"<Image>/AnimFrames/Frames Scale",
"<Image>/Video/Frames Scale",
plug_in_gap_split
"This plugin splits the current image to anim frames (images on disk).
Each layer is saved as one frame",
"<Image>/AnimFrames/Split Img to Frames",
"<Image>/Video/Split Img to Frames",
plug_in_gap_mpeg_encode
"This plugin calls mpeg_encode to convert anim frames to MPEG1,
or just generates a param file for mpeg_encode.
(mpeg_encode must be installed on your system)",
"<Image>/AnimFrames/Frames MPEG_encode",
"<Image>/Video/Encode/MPEG1 (mpeg_encode)",
plug_in_gap_mpeg2encode
"This plugin calls mpeg2encode to convert anim frames to MPEG1 or MPEG2,
or just generates a param file for mpeg2encode.
(mpeg2encode must be installed on your system)",
"<Image>/AnimFrames/Frames MPEG2_encode",
"<Image>/Video/Encode/MPEG2 (mpeg2encode)",
plug_in_gap_shift
"This plugin Exchanges frames numbers in the given range.
(discfile frame_0001.xcf is renamed to frame_0002.xcf,
2->3, 3->4 ... n->1)",
"<Image>/AnimFrames/Framesequence Shift",
"<Image>/Video/Framesequence Shift",
plug_in_gap_modify
"This plugin performs a modifying action on each selected layer
in each selected framerange"
<Image>/AnimFrames/Frames Modify
<Image>/Video/Frames Modify
script-fu-selection-to-anim-image
"Create a multilayer image from current selection and

View File

@ -64,6 +64,7 @@
*/
/* Change Log:
* 1999.11.16 hof: added p_delta_gintdrawable
* 1999.06.21 hof: removed Colorify iterator
* 1999.03.14 hof: added iterators for gimp 1.1.3 prerelease
* iterator code reorganized in _iter_ALT.inc Files
@ -279,6 +280,16 @@ static void p_delta_drawable(gint32 *val, gint32 val_from, gint32 val_to, gint32
g_free (l_layers_list);
}
}
static void
p_delta_gintdrawable(gint *val, gint val_from, gint val_to, gint32 total_steps, gdouble current_step)
{
gint32 l_val, l_from, l_to;
l_val = *val;
l_from = val_from;
l_to = val_to;
p_delta_drawable(&l_val, l_from, l_to, total_steps, current_step);
*val = l_val;
}
/* ----------------------------------------------------------------------

View File

@ -5,7 +5,7 @@
*
* This Module contains:
* - MAIN of all GAP_Plugins
* - query registration of GAP Procedures (AnimFrames Menu) in the PDB
* - query registration of GAP Procedures (Video Menu) in the PDB
* - run invoke the selected GAP procedure by its PDB name
*
*
@ -38,9 +38,10 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
static char *gap_main_version = "1.1.10a; 1999/10/23";
static char *gap_main_version = "1.1.11a; 1999/11/16";
/* revision history:
* gimp 1.1.11a; 1999/11/15 hof: changed Menunames (AnimFrames to Video, Submenu Encode)
* gimp 1.1.10a; 1999/10/22 hof: extended dither options for gap_range_convert
* gimp 1.1.8a; 1999/08/31 hof: updated main version
* version 0.99.00; 1999/03/17 hof: updated main version
@ -346,7 +347,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Goto Next"),
_("<Image>/Video/Goto Next"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_std, nreturn_vals,
@ -358,7 +359,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Goto Prev"),
_("<Image>/Video/Goto Prev"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_std, nreturn_vals,
@ -370,7 +371,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Goto First"),
_("<Image>/Video/Goto First"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_std, nreturn_vals,
@ -382,7 +383,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Goto Last"),
_("<Image>/Video/Goto Last"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_std, nreturn_vals,
@ -394,7 +395,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Goto Any"),
_("<Image>/Video/Goto Any"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_goto, nreturn_vals,
@ -406,7 +407,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Delete Frames"),
_("<Image>/Video/Delete Frames"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_del, nreturn_vals,
@ -418,7 +419,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Duplicate Frames"),
_("<Image>/Video/Duplicate Frames"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_dup, nreturn_vals,
@ -430,7 +431,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Exchange Frame"),
_("<Image>/Video/Exchange Frame"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_exchg, nreturn_vals,
@ -442,7 +443,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Move Path"),
_("<Image>/Video/Move Path"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_mov, nreturn_vals,
@ -454,7 +455,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Frames to Image"),
_("<Image>/Video/Frames to Image"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_f2multi, nreturn_f2multi,
@ -466,7 +467,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Frames Flatten"),
_("<Image>/Video/Frames Flatten"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_rflatt, nreturn_vals,
@ -478,7 +479,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Frames LayerDel"),
_("<Image>/Video/Frames LayerDel"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_rlayerdel, nreturn_vals,
@ -502,7 +503,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Frames Convert"),
_("<Image>/Video/Frames Convert"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_rconv2, nreturn_vals,
@ -514,7 +515,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Frames Resize"),
_("<Image>/Video/Frames Resize"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_resize, nreturn_vals,
@ -526,7 +527,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Frames Crop"),
_("<Image>/Video/Frames Crop"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_resize, nreturn_vals,
@ -538,7 +539,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Frames Scale"),
_("<Image>/Video/Frames Scale"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_scale, nreturn_vals,
@ -550,7 +551,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Split Img to Frames"),
_("<Image>/Video/Split Img to Frames"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_split, nreturn_split,
@ -562,7 +563,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Frames MPEG1 encode"),
_("<Image>/Video/Encode/MPEG1"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_mpege, nreturn_vals,
@ -575,7 +576,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Frames MPEG2 encode"),
_("<Image>/Video/Encode/MPEG2 mpeg2encode)"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_mpege, nreturn_vals,
@ -588,7 +589,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Framesequence Shift"),
_("<Image>/Video/Framesequence Shift"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_shift, nreturn_vals,
@ -600,7 +601,7 @@ query ()
"Wolfgang Hofer (hof@hotbot.com)",
"Wolfgang Hofer",
gap_main_version,
_("<Image>/AnimFrames/Frames Modify"),
_("<Image>/Video/Frames Modify"),
"RGB*, INDEXED*, GRAY*",
PROC_PLUG_IN,
nargs_modify, nreturn_vals,

View File

@ -11,6 +11,7 @@ gint p_plug_in_nova_iter_ALT(GRunModeType run_mode, gint32 total_steps, gdouble
t_gint_color color;
gint radius;
gint nspoke;
gint randomhue;
} t_plug_in_nova_Vals;
t_plug_in_nova_Vals buf, *buf_from, *buf_to;
@ -34,6 +35,7 @@ gint p_plug_in_nova_iter_ALT(GRunModeType run_mode, gint32 total_steps, gdouble
p_delta_gint_color(&buf.color, &buf_from->color, &buf_to->color, total_steps, current_step);
p_delta_gint(&buf.radius, buf_from->radius, buf_to->radius, total_steps, current_step);
p_delta_gint(&buf.nspoke, buf_from->nspoke, buf_to->nspoke, total_steps, current_step);
p_delta_gint(&buf.randomhue, buf_from->randomhue, buf_to->randomhue, total_steps, current_step);
gimp_set_data("plug_in_nova", &buf, sizeof(buf));

View File

@ -6,14 +6,22 @@ gint p_plug_in_warp_iter_ALT(GRunModeType run_mode, gint32 total_steps, gdouble
{
typedef struct t_plug_in_warp_Vals
{
gdouble amount;
gdouble angle;
gdouble iter;
gdouble dither;
gint warp_map;
gint wrap_type;
gint mag_map;
gint mag_option;
gdouble amount;
gint warp_map;
gint iter;
gdouble dither;
gdouble angle;
gint wrap_type;
gint mag_map;
gint mag_use;
gint substeps;
gint grad_map;
gdouble grad_scale;
gint vector_map;
gdouble vector_scale;
gdouble vector_angle;
} t_plug_in_warp_Vals;
t_plug_in_warp_Vals buf, *buf_from, *buf_to;
@ -33,12 +41,22 @@ gint p_plug_in_warp_iter_ALT(GRunModeType run_mode, gint32 total_steps, gdouble
memcpy(&buf, buf_from, sizeof(buf));
p_delta_gdouble(&buf.amount, buf_from->amount, buf_to->amount, total_steps, current_step);
p_delta_gdouble(&buf.angle, buf_from->angle, buf_to->angle, total_steps, current_step);
p_delta_gdouble(&buf.iter, buf_from->iter, buf_to->iter, total_steps, current_step);
p_delta_gintdrawable(&buf.warp_map, buf_from->warp_map, buf_to->warp_map, total_steps, current_step);
p_delta_gint(&buf.iter, buf_from->iter, buf_to->iter, total_steps, current_step);
p_delta_gdouble(&buf.dither, buf_from->dither, buf_to->dither, total_steps, current_step);
p_delta_gdouble(&buf.angle, buf_from->angle, buf_to->angle, total_steps, current_step);
p_delta_gint(&buf.wrap_type, buf_from->wrap_type, buf_to->wrap_type, total_steps, current_step);
p_delta_gint(&buf.mag_option, buf_from->mag_option, buf_to->mag_option, total_steps, current_step);
p_delta_gintdrawable(&buf.mag_map, buf_from->mag_map, buf_to->mag_map, total_steps, current_step);
p_delta_gint(&buf.mag_use, buf_from->mag_use, buf_to->mag_use, total_steps, current_step);
p_delta_gint(&buf.substeps, buf_from->substeps, buf_to->substeps, total_steps, current_step);
p_delta_gintdrawable(&buf.grad_map, buf_from->grad_map, buf_to->grad_map, total_steps, current_step);
p_delta_gdouble(&buf.grad_scale, buf_from->grad_scale, buf_to->grad_scale, total_steps, current_step);
p_delta_gintdrawable(&buf.vector_map, buf_from->vector_map, buf_to->vector_map, total_steps, current_step);
p_delta_gdouble(&buf.vector_scale, buf_from->vector_scale, buf_to->vector_scale, total_steps, current_step);
p_delta_gdouble(&buf.vector_angle, buf_from->vector_angle, buf_to->vector_angle, total_steps, current_step);
gimp_set_data("plug_in_warp", &buf, sizeof(buf));
return 0; /* OK */