RSS/Atom feed Twitter
Site is read-only, email is disabled

How to make a gimp plugin a "animated" one

This discussion is connected to the gimp-developer-list.gnome.org mailing list which is provided by the GIMP developers and not related to gimpusers.com.

This is a read-only list on gimpusers.com so this discussion thread is read-only, too.

1 of 2 messages available
Toggle history

Please log in to manage your subscriptions.

mailman.5.1211137205.25956.... 07 Oct 20:26
  How to make a gimp plugin a "animated" one Alchemie foto\\grafiche 19 May 17:03
Alchemie foto\\grafiche
2008-05-19 17:03:08 UTC (almost 17 years ago)

How to make a gimp plugin a "animated" one

as was suggested here i try to follow the procedure indicated in "How to make a gimp plugin a "animated" one" contained in the GAP source code in docs

For commodity i upload that guide here http://www.gimptalk.com/forum/viewtopic.php?f=9&t=31050&p=229417#p229417

as i wrote on that linked page guide seems not fully correct and updated as example

2 # change to the directory, where you like to generate the >sourcecode cd /usr/local/gimp-0.99.17/plug-ins/whirlpinch

that path seems wrong i have nothing similar to that path and that reference to a gimp-0.99.17 seems quite outdated may be this the right path " /usr/lib/gimp/2.0/plug-ins"? (Note:seems that my distro, ubuntu install extra plugin with the other and not in the user plugin directory)

Then that reference to gimp -0.99 seems suspiciously outdated

more plugin are not directory so i could not do this cd /usr/local/gimp-0.99.17/plug-ins/whirlpinch

Anyway after some fiddling (for all detail please have a look to the link) i get some results.

Problem is that i get much more results of what i expected, instead then 4 files about 600 , 4 for each plugin was in the plugin folder.

Also that i wanted lqr-plugin_iter.c, more a _iter.c for resyntetyzer,refocus, greycstoration and so on

Well seems to nice to be true, more i never see a _iter.c file before and i will like to know if what i get is correct

this below is the _iter.c for Liquid Resize, do you think is correct and that i can go on to the next step?

below the line (or in last message here http://www.gimptalk.com/forum/viewtopic.php?f=9&t=31050&p=229417#p229417 ) #################################################

/* lqr_plugin_iter.c * generated by gap_filter_codegen.c * generation date: 19.05.108 01:36 *
* generation source Gimp PDB entry name: lqr_plugin * version : 2007 *
* The generated code will not work if the internal data stucture * (used to store and retrieve "LastValues") is different to the * PDB Calling Interface.
*
* In that case you will get an Error message like that: * ERROR: xxxx_Iterator stored Data missmatch in size N != M * if the Iterator is called.
* (via "Filter all Layers" using "Apply Varying" Button) *
* When you get this Error, you should change this generated code. *
*/

/* SYTEM (UNIX) includes */ #include
#include
#include

/* GIMP includes */
#include "gtk/gtk.h"
#include "libgimp/gimp.h"

typedef struct { guchar color[3]; } t_color; typedef struct { gint color[3]; } t_gint_color;

static void query(void); static void run(const gchar *name, gint nparam, const GimpParam *param, gint *nretvals, GimpParam **retvals);

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

/* ---------------------------------------------------------------------- * iterator functions for basic datatypes * ---------------------------------------------------------------------- */

static void p_delta_long(long *val, long val_from, long val_to, gint32 total_steps, gdouble current_step) {
double delta;

if(total_steps < 1) return;

delta = ((double)(val_to - val_from) / (double)total_steps) * ((double)total_steps - current_step); *val = val_from + delta;
}
static void p_delta_short(short *val, short val_from, short val_to, gint32 total_steps, gdouble current_step) {
double delta;

if(total_steps < 1) return;

delta = ((double)(val_to - val_from) / (double)total_steps) * ((double)total_steps - current_step); *val = val_from + delta;
}
static void p_delta_gint(gint *val, gint val_from, gint val_to, gint32 total_steps, gdouble current_step) {
double delta;

if(total_steps < 1) return;

delta = ((double)(val_to - val_from) / (double)total_steps) * ((double)total_steps - current_step); *val = val_from + delta;
}
static void p_delta_char(char *val, char val_from, char val_to, gint32 total_steps, gdouble current_step) {
double delta;

if(total_steps < 1) return;

delta = ((double)(val_to - val_from) / (double)total_steps) * ((double)total_steps - current_step); *val = val_from + delta;
}
static void p_delta_gdouble(double *val, double val_from, double val_to, gint32 total_steps, gdouble current_step) {
double delta;

if(total_steps < 1) return;

delta = ((double)(val_to - val_from) / (double)total_steps) * ((double)total_steps - current_step); *val = val_from + delta;
}
static void p_delta_float(float *val, float val_from, float val_to, gint32 total_steps, gdouble current_step) {
double delta;

if(total_steps < 1) return;

delta = ((double)(val_to - val_from) / (double)total_steps) * ((double)total_steps - current_step); *val = val_from + delta;
}
static void p_delta_color(t_color *val, t_color *val_from, t_color *val_to, gint32 total_steps, gdouble current_step) {
double delta;
int l_idx;

if(total_steps < 1) return;

for(l_idx = 0; l_idx < 3; l_idx++) {
delta = ((double)(val_to->color[l_idx] - val_from->color[l_idx]) / (double)total_steps) * ((double)total_steps - current_step); val->color[l_idx] = val_from->color[l_idx] + delta; }
}
static void p_delta_gint_color(t_gint_color *val, t_gint_color *val_from, t_gint_color *val_to, gint32 total_steps, gdouble current_step) {
double delta;
int l_idx;

if(total_steps < 1) return;

for(l_idx = 0; l_idx < 3; l_idx++) {
delta = ((double)(val_to->color[l_idx] - val_from->color[l_idx]) / (double)total_steps) * ((double)total_steps - current_step); val->color[l_idx] = val_from->color[l_idx] + delta; }
}
static void p_delta_drawable(gint32 *val, gint32 val_from, gint32 val_to, gint32 total_steps, gdouble current_step) {
gint l_nlayers;
gint32 *l_layers_list;
gint32 l_tmp_image_id;
gint l_idx, l_idx_from, l_idx_to;

l_tmp_image_id = gimp_drawable_get_image(val_from);

/* check if from and to values are both valid drawables within the same image */ if ((l_tmp_image_id > 0)
&& (l_tmp_image_id = gimp_drawable_get_image(val_to))) {
l_idx_from = -1;
l_idx_to = -1;

/* check the layerstack index of from and to drawable */ l_layers_list = gimp_image_get_layers(l_tmp_image_id, &l_nlayers); for (l_idx = l_nlayers -1; l_idx >= 0; l_idx--) {
if( l_layers_list[l_idx] == val_from ) l_idx_from = l_idx; if( l_layers_list[l_idx] == val_to ) l_idx_to = l_idx;

if((l_idx_from != -1) && (l_idx_to != -1)) {
/* OK found both index values, iterate the index (proceed to next layer) */ p_delta_gint(&l_idx, l_idx_from, l_idx_to, total_steps, current_step); *val = l_layers_list[l_idx]; break;
}
}
g_free (l_layers_list);
}
}

/* ---------------------------------------------------------------------- * p_lqr_plugin_iter
* ---------------------------------------------------------------------- */
gint p_lqr_plugin_iter(GimpRunMode run_mode, gint32 total_steps, gdouble current_step, gint32 len_struct) {
typedef struct t_lqr_plugin_Vals {
long width;
long height;
long pres_layer;
long pres_coeff;
long disc_layer;
long disc_coeff;
long rigidity;
long resize_aux_layers;
long resize_canvas;
long new_layer;
long seams;
long mask_behavior;
long grad_func;
} t_lqr_plugin_Vals;

t_lqr_plugin_Vals buf, buf_from, buf_to;

if(len_struct != sizeof(t_lqr_plugin_Vals)) {
fprintf(stderr, "ERROR: p_lqr_plugin_iter stored Data missmatch in size %d != %d\n", (int)len_struct, sizeof(t_lqr_plugin_Vals) ); return -1; /* ERROR */
}

gimp_get_data("lqr_plugin-ITER-FROM", &buf_from); gimp_get_data("lqr_plugin-ITER-TO", &buf_to); memcpy(&buf, &buf_from, sizeof(buf));

p_delta_long(&buf.width, buf_from.width, buf_to.width, total_steps, current_step); p_delta_long(&buf.height, buf_from.height, buf_to.height, total_steps, current_step); p_delta_long(&buf.pres_layer, buf_from.pres_layer, buf_to.pres_layer, total_steps, current_step); p_delta_long(&buf.pres_coeff, buf_from.pres_coeff, buf_to.pres_coeff, total_steps, current_step); p_delta_long(&buf.disc_layer, buf_from.disc_layer, buf_to.disc_layer, total_steps, current_step); p_delta_long(&buf.disc_coeff, buf_from.disc_coeff, buf_to.disc_coeff, total_steps, current_step); p_delta_long(&buf.rigidity, buf_from.rigidity, buf_to.rigidity, total_steps, current_step); p_delta_long(&buf.resize_aux_layers, buf_from.resize_aux_layers, buf_to.resize_aux_layers, total_steps, current_step); p_delta_long(&buf.resize_canvas, buf_from.resize_canvas, buf_to.resize_canvas, total_steps, current_step); p_delta_long(&buf.new_layer, buf_from.new_layer, buf_to.new_layer, total_steps, current_step); p_delta_long(&buf.seams, buf_from.seams, buf_to.seams, total_steps, current_step); p_delta_long(&buf.mask_behavior, buf_from.mask_behavior, buf_to.mask_behavior, total_steps, current_step); p_delta_long(&buf.grad_func, buf_from.grad_func, buf_to.grad_func, total_steps, current_step);

gimp_set_data("lqr_plugin", &buf, sizeof(buf));

return 0; /* OK */ }
MAIN ()

/* ---------------------------------------------------------------------- * install (query) -Iterator
* ---------------------------------------------------------------------- */

static void query ()
{
char l_blurb_text[300];

static GimpParamDef args_iter[] = {
{GIMP_PDB_INT32, "run_mode", "non-interactive"}, {GIMP_PDB_INT32, "total_steps", "total number of steps (# of layers-1 to apply the related plug-in)"}, {GIMP_PDB_FLOAT, "current_step", "current (for linear iterations this is the layerstack position, otherwise some value inbetween)"}, {GIMP_PDB_INT32, "len_struct", "length of stored data structure with id is equal to the plug_in proc_name"}, };
static int nargs_iter = G_N_ELEMENTS (args_iter);

static GimpParamDef *return_vals = NULL; static int nreturn_vals = 0;

g_snprintf(l_blurb_text, sizeof(l_blurb_text), "This procedure calculates the modified values for one iterationstep for the call of lqr_plugin");

gimp_install_procedure("lqr_plugin-Iterator", l_blurb_text, "",
"Wolfgang Hofer", "Wolfgang Hofer", "19.05.108 01:36", NULL, /* do not appear in menus */ NULL,
GIMP_PLUGIN, nargs_iter, nreturn_vals, args_iter, return_vals);

}

/* ---------------------------------------------------------------------- * run Iterator
* ---------------------------------------------------------------------- */

static void
run (const gchar *name,
gint n_params,
const GimpParam *param,
gint *nreturn_vals,
GimpParam **return_vals)
{
static GimpParam values[1];
GimpRunMode run_mode;
GimpPDBStatusType status = GIMP_PDB_SUCCESS; gint32 image_id;
gint32 len_struct;
gint32 total_steps;
gdouble current_step;

gint32 l_rc;

*nreturn_vals = 1; *return_vals = values;
l_rc = 0;

run_mode = param[0].data.d_int32;

if ((run_mode == GIMP_RUN_NONINTERACTIVE) && (n_params == 4)) {
total_steps = param[1].data.d_int32; current_step = param[2].data.d_float; len_struct = param[3].data.d_int32; l_rc = p_lqr_plugin_iter(run_mode, total_steps, current_step, len_struct); if(l_rc < 0)
{
status = GIMP_PDB_EXECUTION_ERROR; }
}
else status = GIMP_PDB_CALLING_ERROR;

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

} #########################################

Is that correct ? some suggestion?

gimp-developer-request@lists.XCF.Berkeley.EDU ha scritto: Send Gimp-developer mailing list submissions to gimp-developer@lists.XCF.Berkeley.EDU

To subscribe or unsubscribe via the World Wide Web, visit https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer or, via email, send a message with subject or body 'help' to gimp-developer-request@lists.XCF.Berkeley.EDU

You can reach the person managing the list at gimp-developer-owner@lists.XCF.Berkeley.EDU

When replying, please edit your Subject line so it is more specific than "Re: Contents of Gimp-developer digest..."

Today's Topics:

1. Option for locking tabs? (ccrisis@gmail.com) 2. Re: Option for locking tabs? (Martin Nordholts) 3. Re: Option for locking tabs? (Sven Neumann) 4. Re: Option for locking tabs? (Jon Senior)

----------------------------------------------------------------------

Message: 1 Date: Sat, 17 May 2008 19:43:57 -0600 From: ccrisis@gmail.com
Subject: [Gimp-developer] Option for locking tabs? To: gimp-developer@lists.XCF.Berkeley.EDU Message-ID:
Content-Type: text/plain; charset=ISO-8859-1; format=flowed

Hi,

I was directed here for suggesting features. If this is the wrong place, I apologize.
When selecting tabs with a tablet, sometimes (often) there is accidental dragging and the tab ends up being pulled into it's own window. It's a big annoyance in my case, maybe other tablet users as well. I suggest an option to lock these.

D.R.

------------------------------

Message: 2 Date: Sun, 18 May 2008 14:45:52 +0200 From: Martin Nordholts
Subject: Re: [Gimp-developer] Option for locking tabs? To: ccrisis@gmail.com
Cc: gimp-developer@lists.XCF.Berkeley.EDU Message-ID:
Content-Type: text/plain; charset=ISO-8859-1

ccrisis@gmail.com wrote:

Hi,

I was directed here for suggesting features. If this is the wrong place, I apologize.
When selecting tabs with a tablet, sometimes (often) there is accidental dragging and the tab ends up being pulled into it's own window. It's a big annoyance in my case, maybe other tablet users as well. I suggest an option to lock these.

D.R.

Hello

It doesn't sound like a bad idea, but at the same time it feels like a hack and that the core problem is something else. If this was to be added though, it is necessary to sort out how to access this functionality in a discoverable way.

Regards, Martin Nordholts

------------------------------

Message: 3 Date: Sun, 18 May 2008 15:08:44 +0200 From: Sven Neumann
Subject: Re: [Gimp-developer] Option for locking tabs? To: ccrisis@gmail.com
Cc: gimp-developer@lists.XCF.Berkeley.EDU Message-ID:
Content-Type: text/plain

Hi,

On Sat, 2008-05-17 at 19:43 -0600, ccrisis@gmail.com wrote:

I was directed here for suggesting features. If this is the wrong place, I apologize.
When selecting tabs with a tablet, sometimes (often) there is accidental dragging and the tab ends up being pulled into it's own window. It's a big annoyance in my case, maybe other tablet users as well. I suggest an option to lock these.

Have you tried to increase the gtk-dnd-drag-threshold? It's a GtkSetting that you can adjust in your ~/.gtkrc-2.0 file.

Sven

------------------------------

Message: 4 Date: Sun, 18 May 2008 20:41:28 +0200 From: Jon Senior
Subject: Re: [Gimp-developer] Option for locking tabs? To: gimp-developer@lists.XCF.Berkeley.EDU Message-ID:
Content-Type: text/plain; charset=US-ASCII

On Sun, 18 May 2008 14:45:52 +0200 Martin Nordholts wrote:

It doesn't sound like a bad idea, but at the same time it feels like a hack and that the core problem is something else. If this was to be added though, it is necessary to sort out how to access this functionality in a discoverable way.

I suffer from the same problem from time to time. I'd love to see an option to "lock" the windows. I have a setup that works for me and that I don't change, and it'd be good to be able to lock that down. Not sure if that would need to be on the GTK side, or the GIMP side though.