New files. Types and functions related to "standard" parasite types. Used

1999-09-02  Tor Lillqvist  <tml@iki.fi>

* libgimp/parasiteio.[ch]: New files. Types and functions related
to "standard" parasite types. Used for the
gimp-brush-pipe-parameters parasite that the gpb and psp plug-ins
handle, and the value of which is stored in gih files, from
which gimpbrushpipe.c parses it.

* libgimp/{Makefile.am,makefile.{cygwin,msc}}: Add new files.

* libgimp/gimp.def: Add its entry points.

* libgimp/gimp.h: Fix cosmetic argument name error.

* app/gimpbrushpipe.c: Remove code that previously
was copied here, use functions from parasiteio.c.

* plug-ins/common/gpb.c: Ditto. Add brush cell width and height
fields to the gih save dialog. Add cleverness to update rows and
columns as cell size is changes. (Still too easy for the user to
get confused, though.) Display corresponding guide grid on the
image. Unfortunately updating the guidelines doesn't seem to work.

* plug-ins/common/psp.c: Use functions from parasiteio.c.
This commit is contained in:
Tor Lillqvist 1999-09-02 00:01:41 +00:00 committed by Tor Lillqvist
parent f380edd704
commit 5475ff08a9
17 changed files with 981 additions and 566 deletions

View File

@ -1,3 +1,28 @@
1999-09-02 Tor Lillqvist <tml@iki.fi>
* libgimp/parasiteio.[ch]: New files. Types and functions related
to "standard" parasite types. Used for the
gimp-brush-pipe-parameters parasite that the gpb and psp plug-ins
handle, and the value of which is stored in gih files, from
which gimpbrushpipe.c parses it.
* libgimp/{Makefile.am,makefile.{cygwin,msc}}: Add new files.
* libgimp/gimp.def: Add its entry points.
* libgimp/gimp.h: Fix cosmetic argument name error.
* app/gimpbrushpipe.c: Remove code that previously was copied
here, use functions from parasiteio.c.
* plug-ins/common/gpb.c: Ditto. Add brush cell width and height
fields to the gih save dialog. Add cleverness to update rows and
columns as cell size is changes. (Still too easy for the user to
get confused, though.) Display corresponding guide grid on the
image. Unfortunately updating the guidelines doesn't seem to work.
* plug-ins/common/psp.c: Use functions from parasiteio.c.
Wed Sep 1 23:18:21 BST 1999 Andy Thomas <alt@gimp.org>
* app/gdisplay.c

View File

@ -37,26 +37,7 @@
#include "libgimp/gimpintl.h"
#include "libgimp/gimpmath.h"
/* Code duplicated from plug-ins/common/gpb.c...
* The struct, and code to parse/build it probably should be in libgimp.
*/
/* Parameters related to one single gih file, collected in a struct
* just for clarity.
*/
#define MAXDIM 4
static struct {
gint step;
gint ncells;
gint dim;
gint cols;
gint rows;
gchar *placement;
gint rank[MAXDIM];
gchar *selection[MAXDIM];
} gihparms;
#include "libgimp/parasiteio.h"
static GimpBrushClass* gimp_brush_class;
static GtkObjectClass* gimp_object_class;
@ -279,103 +260,19 @@ gimp_brush_pipe_get_type (void)
return type;
}
static void
init_pipe_parameters ()
{
int i;
gihparms.step = 100;
gihparms.ncells = 1;
gihparms.dim = 1;
gihparms.cols = 1;
gihparms.rows = 1;
gihparms.placement = "constant";
for (i = 0; i < MAXDIM; i++)
gihparms.selection[i] = "random";
gihparms.rank[0] = 1;
for (i = 1; i < MAXDIM; i++)
gihparms.rank[i] = 0;
}
static void
parse_brush_pipe_parameters (gchar *parameters)
{
guchar *p, *q, *r, *s; /* Don't you love single-char identifiers? */
gint i;
q = parameters;
while ((p = strtok (q, " \r\n")) != NULL)
{
q = NULL;
r = strchr (p, ':');
if (r)
*r = 0;
if (strcmp (p, "ncells") == 0)
{
if (r)
gihparms.ncells = atoi (r + 1);
}
else if (strcmp (p, "step") == 0)
{
if (r)
gihparms.step = atoi (r + 1);
}
else if (strcmp (p, "dim") == 0)
{
if (r)
gihparms.dim = atoi (r + 1);
}
else if (strcmp (p, "cols") == 0)
{
if (r)
gihparms.cols = atoi (r + 1);
}
else if (strcmp (p, "rows") == 0)
{
if (r)
gihparms.rows = atoi (r + 1);
}
else if (strcmp (p, "placement") == 0)
{
if (r)
gihparms.placement = g_strdup (r + 1);
}
else if (strncmp (p, "rank", strlen ("rank")) == 0)
{
if (r)
{
i = atoi (p + strlen ("rank"));
if (i >= 0 && i < gihparms.dim)
gihparms.rank[i] = atoi (r + 1);
}
}
else if (strncmp (p, "sel", strlen ("sel")) == 0)
{
if (r)
{
i = atoi (p + strlen ("sel"));
if (i >= 0 && i < gihparms.dim)
gihparms.selection[i] = g_strdup (r + 1);
}
}
if (r)
*r = ':';
}
}
GimpBrushPipe *
gimp_brush_pipe_load (char *filename)
{
GimpBrushPipe *pipe;
GPatternP pattern;
PixPipeParams params;
FILE *fp;
guchar buf[1024];
guchar *name;
int i;
int num_of_brushes;
int totalcells;
gchar *params;
gchar *paramstring;
if ((fp = fopen (filename, "rb")) == NULL)
return NULL;
@ -400,7 +297,7 @@ gimp_brush_pipe_load (char *filename)
gimp_object_destroy (pipe);
return NULL;
}
num_of_brushes = strtol(buf, &params, 10);
num_of_brushes = strtol(buf, &paramstring, 10);
if (num_of_brushes < 1)
{
g_message (_("pixmap brush pipe should have at least one brush"));
@ -409,33 +306,33 @@ gimp_brush_pipe_load (char *filename)
return NULL;
}
while (*params && isspace(*params))
params++;
while (*paramstring && isspace(*paramstring))
paramstring++;
if (*params)
if (*paramstring)
{
init_pipe_parameters ();
parse_brush_pipe_parameters (params);
pipe->dimension = gihparms.dim;
pixpipeparams_init (&params);
pixpipeparams_parse (paramstring, &params);
pipe->dimension = params.dim;
pipe->rank = g_new (int, pipe->dimension);
pipe->select = g_new (PipeSelectModes, pipe->dimension);
pipe->index = g_new (int, pipe->dimension);
for (i = 0; i < pipe->dimension; i++)
{
pipe->rank[i] = gihparms.rank[i];
if (strcmp (gihparms.selection[i], "incremental") == 0)
pipe->rank[i] = params.rank[i];
if (strcmp (params.selection[i], "incremental") == 0)
pipe->select[i] = PIPE_SELECT_INCREMENTAL;
else if (strcmp (gihparms.selection[i], "angular") == 0)
else if (strcmp (params.selection[i], "angular") == 0)
pipe->select[i] = PIPE_SELECT_ANGULAR;
else if (strcmp (gihparms.selection[i], "velocity") == 0)
else if (strcmp (params.selection[i], "velocity") == 0)
pipe->select[i] = PIPE_SELECT_VELOCITY;
else if (strcmp (gihparms.selection[i], "random") == 0)
else if (strcmp (params.selection[i], "random") == 0)
pipe->select[i] = PIPE_SELECT_RANDOM;
else if (strcmp (gihparms.selection[i], "pressure") == 0)
else if (strcmp (params.selection[i], "pressure") == 0)
pipe->select[i] = PIPE_SELECT_PRESSURE;
else if (strcmp (gihparms.selection[i], "xtilt") == 0)
else if (strcmp (params.selection[i], "xtilt") == 0)
pipe->select[i] = PIPE_SELECT_TILT_X;
else if (strcmp (gihparms.selection[i], "ytilt") == 0)
else if (strcmp (params.selection[i], "ytilt") == 0)
pipe->select[i] = PIPE_SELECT_TILT_Y;
else
pipe->select[i] = PIPE_SELECT_CONSTANT;

View File

@ -37,26 +37,7 @@
#include "libgimp/gimpintl.h"
#include "libgimp/gimpmath.h"
/* Code duplicated from plug-ins/common/gpb.c...
* The struct, and code to parse/build it probably should be in libgimp.
*/
/* Parameters related to one single gih file, collected in a struct
* just for clarity.
*/
#define MAXDIM 4
static struct {
gint step;
gint ncells;
gint dim;
gint cols;
gint rows;
gchar *placement;
gint rank[MAXDIM];
gchar *selection[MAXDIM];
} gihparms;
#include "libgimp/parasiteio.h"
static GimpBrushClass* gimp_brush_class;
static GtkObjectClass* gimp_object_class;
@ -279,103 +260,19 @@ gimp_brush_pipe_get_type (void)
return type;
}
static void
init_pipe_parameters ()
{
int i;
gihparms.step = 100;
gihparms.ncells = 1;
gihparms.dim = 1;
gihparms.cols = 1;
gihparms.rows = 1;
gihparms.placement = "constant";
for (i = 0; i < MAXDIM; i++)
gihparms.selection[i] = "random";
gihparms.rank[0] = 1;
for (i = 1; i < MAXDIM; i++)
gihparms.rank[i] = 0;
}
static void
parse_brush_pipe_parameters (gchar *parameters)
{
guchar *p, *q, *r, *s; /* Don't you love single-char identifiers? */
gint i;
q = parameters;
while ((p = strtok (q, " \r\n")) != NULL)
{
q = NULL;
r = strchr (p, ':');
if (r)
*r = 0;
if (strcmp (p, "ncells") == 0)
{
if (r)
gihparms.ncells = atoi (r + 1);
}
else if (strcmp (p, "step") == 0)
{
if (r)
gihparms.step = atoi (r + 1);
}
else if (strcmp (p, "dim") == 0)
{
if (r)
gihparms.dim = atoi (r + 1);
}
else if (strcmp (p, "cols") == 0)
{
if (r)
gihparms.cols = atoi (r + 1);
}
else if (strcmp (p, "rows") == 0)
{
if (r)
gihparms.rows = atoi (r + 1);
}
else if (strcmp (p, "placement") == 0)
{
if (r)
gihparms.placement = g_strdup (r + 1);
}
else if (strncmp (p, "rank", strlen ("rank")) == 0)
{
if (r)
{
i = atoi (p + strlen ("rank"));
if (i >= 0 && i < gihparms.dim)
gihparms.rank[i] = atoi (r + 1);
}
}
else if (strncmp (p, "sel", strlen ("sel")) == 0)
{
if (r)
{
i = atoi (p + strlen ("sel"));
if (i >= 0 && i < gihparms.dim)
gihparms.selection[i] = g_strdup (r + 1);
}
}
if (r)
*r = ':';
}
}
GimpBrushPipe *
gimp_brush_pipe_load (char *filename)
{
GimpBrushPipe *pipe;
GPatternP pattern;
PixPipeParams params;
FILE *fp;
guchar buf[1024];
guchar *name;
int i;
int num_of_brushes;
int totalcells;
gchar *params;
gchar *paramstring;
if ((fp = fopen (filename, "rb")) == NULL)
return NULL;
@ -400,7 +297,7 @@ gimp_brush_pipe_load (char *filename)
gimp_object_destroy (pipe);
return NULL;
}
num_of_brushes = strtol(buf, &params, 10);
num_of_brushes = strtol(buf, &paramstring, 10);
if (num_of_brushes < 1)
{
g_message (_("pixmap brush pipe should have at least one brush"));
@ -409,33 +306,33 @@ gimp_brush_pipe_load (char *filename)
return NULL;
}
while (*params && isspace(*params))
params++;
while (*paramstring && isspace(*paramstring))
paramstring++;
if (*params)
if (*paramstring)
{
init_pipe_parameters ();
parse_brush_pipe_parameters (params);
pipe->dimension = gihparms.dim;
pixpipeparams_init (&params);
pixpipeparams_parse (paramstring, &params);
pipe->dimension = params.dim;
pipe->rank = g_new (int, pipe->dimension);
pipe->select = g_new (PipeSelectModes, pipe->dimension);
pipe->index = g_new (int, pipe->dimension);
for (i = 0; i < pipe->dimension; i++)
{
pipe->rank[i] = gihparms.rank[i];
if (strcmp (gihparms.selection[i], "incremental") == 0)
pipe->rank[i] = params.rank[i];
if (strcmp (params.selection[i], "incremental") == 0)
pipe->select[i] = PIPE_SELECT_INCREMENTAL;
else if (strcmp (gihparms.selection[i], "angular") == 0)
else if (strcmp (params.selection[i], "angular") == 0)
pipe->select[i] = PIPE_SELECT_ANGULAR;
else if (strcmp (gihparms.selection[i], "velocity") == 0)
else if (strcmp (params.selection[i], "velocity") == 0)
pipe->select[i] = PIPE_SELECT_VELOCITY;
else if (strcmp (gihparms.selection[i], "random") == 0)
else if (strcmp (params.selection[i], "random") == 0)
pipe->select[i] = PIPE_SELECT_RANDOM;
else if (strcmp (gihparms.selection[i], "pressure") == 0)
else if (strcmp (params.selection[i], "pressure") == 0)
pipe->select[i] = PIPE_SELECT_PRESSURE;
else if (strcmp (gihparms.selection[i], "xtilt") == 0)
else if (strcmp (params.selection[i], "xtilt") == 0)
pipe->select[i] = PIPE_SELECT_TILT_X;
else if (strcmp (gihparms.selection[i], "ytilt") == 0)
else if (strcmp (params.selection[i], "ytilt") == 0)
pipe->select[i] = PIPE_SELECT_TILT_Y;
else
pipe->select[i] = PIPE_SELECT_CONSTANT;

View File

@ -37,26 +37,7 @@
#include "libgimp/gimpintl.h"
#include "libgimp/gimpmath.h"
/* Code duplicated from plug-ins/common/gpb.c...
* The struct, and code to parse/build it probably should be in libgimp.
*/
/* Parameters related to one single gih file, collected in a struct
* just for clarity.
*/
#define MAXDIM 4
static struct {
gint step;
gint ncells;
gint dim;
gint cols;
gint rows;
gchar *placement;
gint rank[MAXDIM];
gchar *selection[MAXDIM];
} gihparms;
#include "libgimp/parasiteio.h"
static GimpBrushClass* gimp_brush_class;
static GtkObjectClass* gimp_object_class;
@ -279,103 +260,19 @@ gimp_brush_pipe_get_type (void)
return type;
}
static void
init_pipe_parameters ()
{
int i;
gihparms.step = 100;
gihparms.ncells = 1;
gihparms.dim = 1;
gihparms.cols = 1;
gihparms.rows = 1;
gihparms.placement = "constant";
for (i = 0; i < MAXDIM; i++)
gihparms.selection[i] = "random";
gihparms.rank[0] = 1;
for (i = 1; i < MAXDIM; i++)
gihparms.rank[i] = 0;
}
static void
parse_brush_pipe_parameters (gchar *parameters)
{
guchar *p, *q, *r, *s; /* Don't you love single-char identifiers? */
gint i;
q = parameters;
while ((p = strtok (q, " \r\n")) != NULL)
{
q = NULL;
r = strchr (p, ':');
if (r)
*r = 0;
if (strcmp (p, "ncells") == 0)
{
if (r)
gihparms.ncells = atoi (r + 1);
}
else if (strcmp (p, "step") == 0)
{
if (r)
gihparms.step = atoi (r + 1);
}
else if (strcmp (p, "dim") == 0)
{
if (r)
gihparms.dim = atoi (r + 1);
}
else if (strcmp (p, "cols") == 0)
{
if (r)
gihparms.cols = atoi (r + 1);
}
else if (strcmp (p, "rows") == 0)
{
if (r)
gihparms.rows = atoi (r + 1);
}
else if (strcmp (p, "placement") == 0)
{
if (r)
gihparms.placement = g_strdup (r + 1);
}
else if (strncmp (p, "rank", strlen ("rank")) == 0)
{
if (r)
{
i = atoi (p + strlen ("rank"));
if (i >= 0 && i < gihparms.dim)
gihparms.rank[i] = atoi (r + 1);
}
}
else if (strncmp (p, "sel", strlen ("sel")) == 0)
{
if (r)
{
i = atoi (p + strlen ("sel"));
if (i >= 0 && i < gihparms.dim)
gihparms.selection[i] = g_strdup (r + 1);
}
}
if (r)
*r = ':';
}
}
GimpBrushPipe *
gimp_brush_pipe_load (char *filename)
{
GimpBrushPipe *pipe;
GPatternP pattern;
PixPipeParams params;
FILE *fp;
guchar buf[1024];
guchar *name;
int i;
int num_of_brushes;
int totalcells;
gchar *params;
gchar *paramstring;
if ((fp = fopen (filename, "rb")) == NULL)
return NULL;
@ -400,7 +297,7 @@ gimp_brush_pipe_load (char *filename)
gimp_object_destroy (pipe);
return NULL;
}
num_of_brushes = strtol(buf, &params, 10);
num_of_brushes = strtol(buf, &paramstring, 10);
if (num_of_brushes < 1)
{
g_message (_("pixmap brush pipe should have at least one brush"));
@ -409,33 +306,33 @@ gimp_brush_pipe_load (char *filename)
return NULL;
}
while (*params && isspace(*params))
params++;
while (*paramstring && isspace(*paramstring))
paramstring++;
if (*params)
if (*paramstring)
{
init_pipe_parameters ();
parse_brush_pipe_parameters (params);
pipe->dimension = gihparms.dim;
pixpipeparams_init (&params);
pixpipeparams_parse (paramstring, &params);
pipe->dimension = params.dim;
pipe->rank = g_new (int, pipe->dimension);
pipe->select = g_new (PipeSelectModes, pipe->dimension);
pipe->index = g_new (int, pipe->dimension);
for (i = 0; i < pipe->dimension; i++)
{
pipe->rank[i] = gihparms.rank[i];
if (strcmp (gihparms.selection[i], "incremental") == 0)
pipe->rank[i] = params.rank[i];
if (strcmp (params.selection[i], "incremental") == 0)
pipe->select[i] = PIPE_SELECT_INCREMENTAL;
else if (strcmp (gihparms.selection[i], "angular") == 0)
else if (strcmp (params.selection[i], "angular") == 0)
pipe->select[i] = PIPE_SELECT_ANGULAR;
else if (strcmp (gihparms.selection[i], "velocity") == 0)
else if (strcmp (params.selection[i], "velocity") == 0)
pipe->select[i] = PIPE_SELECT_VELOCITY;
else if (strcmp (gihparms.selection[i], "random") == 0)
else if (strcmp (params.selection[i], "random") == 0)
pipe->select[i] = PIPE_SELECT_RANDOM;
else if (strcmp (gihparms.selection[i], "pressure") == 0)
else if (strcmp (params.selection[i], "pressure") == 0)
pipe->select[i] = PIPE_SELECT_PRESSURE;
else if (strcmp (gihparms.selection[i], "xtilt") == 0)
else if (strcmp (params.selection[i], "xtilt") == 0)
pipe->select[i] = PIPE_SELECT_TILT_X;
else if (strcmp (gihparms.selection[i], "ytilt") == 0)
else if (strcmp (params.selection[i], "ytilt") == 0)
pipe->select[i] = PIPE_SELECT_TILT_Y;
else
pipe->select[i] = PIPE_SELECT_CONSTANT;

View File

@ -48,7 +48,9 @@ libgimpi_a_SOURCES = \
parasite.c \
parasite.h \
parasiteF.h \
parasiteP.h
parasiteP.h \
parasiteio.c \
parasiteio.h
if STATICLIBS
## Evil hack to insure all deps are satisfied on first-run make
@ -86,7 +88,9 @@ libgimp_la_SOURCES = \
parasite.c \
parasite.h \
parasiteF.h \
parasiteP.h
parasiteP.h \
parasiteio.c \
parasiteio.h
libgimpui_la_SOURCES = \
gimpmenu.c \

View File

@ -269,6 +269,9 @@ EXPORTS
parasite_is_undoable
parasite_name
parasite_new
pixpipeparams_build
pixpipeparams_init
pixpipeparams_parse
set_gimp_PLUG_IN_INFO_PTR
wire_clear_error
wire_destroy

View File

@ -535,7 +535,7 @@ guchar * gimp_image_get_thumbnail_data (gint32 image_ID,
gint32 gimp_image_add_hguide (gint32 image_ID,
gint32 yposition);
gint32 gimp_image_add_vguide (gint32 image_ID,
gint32 yposition);
gint32 xposition);
void gimp_image_delete_guide (gint32 image_ID,
gint32 guide_ID);
gint32 gimp_image_find_next_guide (gint32 image_ID,

154
libgimp/gimpparasiteio.c Normal file
View File

@ -0,0 +1,154 @@
/* Functions for bulding and parsing string representations of
* various standard parasite types.
*
* Copyright (C) 1999 Tor Lillqvist <tml@iki.fi>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; 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>
#include <glib.h>
#include "libgimp/parasiteio.h"
void
pixpipeparams_init (PixPipeParams *params)
{
int i;
params->step = 100;
params->ncells = 1;
params->cellwidth = 1;
params->cellheight = 1;
params->dim = 1;
params->cols = 1;
params->rows = 1;
params->placement = "constant";
for (i = 0; i < PIXPIPE_MAXDIM; i++)
params->selection[i] = "random";
params->rank[0] = 1;
for (i = 1; i < PIXPIPE_MAXDIM; i++)
params->rank[i] = 0;
}
void
pixpipeparams_parse (gchar *string,
PixPipeParams *params)
{
guchar *p, *q, *r; /* Don't you love single-char identifiers? */
gint i;
q = string;
while ((p = strtok (q, " \r\n")) != NULL)
{
q = NULL;
r = strchr (p, ':');
if (r)
*r = 0;
if (strcmp (p, "ncells") == 0)
{
if (r)
params->ncells = atoi (r + 1);
}
else if (strcmp (p, "step") == 0)
{
if (r)
params->step = atoi (r + 1);
}
else if (strcmp (p, "dim") == 0)
{
if (r)
params->dim = atoi (r + 1);
}
else if (strcmp (p, "cols") == 0)
{
if (r)
params->cols = atoi (r + 1);
}
else if (strcmp (p, "rows") == 0)
{
if (r)
params->rows = atoi (r + 1);
}
else if (strcmp (p, "cellwidth") == 0)
{
if (r)
params->cellwidth = atoi (r + 1);
}
else if (strcmp (p, "cellheight") == 0)
{
if (r)
params->cellheight = atoi (r + 1);
}
else if (strcmp (p, "placement") == 0)
{
if (r)
params->placement = g_strdup (r + 1);
}
else if (strncmp (p, "rank", strlen ("rank")) == 0 && r)
{
if (r)
{
i = atoi (p + strlen ("rank"));
if (i >= 0 && i < params->dim)
params->rank[i] = atoi (r + 1);
}
}
else if (strncmp (p, "sel", strlen ("sel")) == 0 && r)
{
if (r)
{
i = atoi (p + strlen ("sel"));
if (i >= 0 && i < params->dim)
params->selection[i] = g_strdup (r + 1);
}
}
if (r)
*r = ':';
}
}
gchar *
pixpipeparams_build (PixPipeParams *params)
{
GString *s = g_string_new (NULL);
gchar *str;
int i;
g_string_sprintf (s, "ncells:%d cellwidth:%d cellheight:%d "
"step:%d dim:%d cols:%d rows:%d placement:%s",
params->ncells, params->cellwidth, params->cellheight,
params->step, params->dim,
params->cols, params->rows,
params->placement);
for (i = 0; i < params->dim; i++)
{
g_string_sprintfa (s, " rank%d:%d", i, params->rank[i]);
g_string_sprintfa (s, " sel%d:%s", i, params->selection[i]);
}
str = s->str;
g_string_free (s, FALSE);
return str;
}

62
libgimp/gimpparasiteio.h Normal file
View File

@ -0,0 +1,62 @@
/* parasite.h
* Copyright (C) 1999 Tor Lillqvist <tml@iki.fi>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef _PARASITEIO_H_
#define _PARASITEIO_H_
/* Data structures for various standard parasites used by plug-ins and
* the GIMP core, and functions to build and parse their string
* representations.
*/
/*
* Pixmap brush pipes.
*/
#define PIXPIPE_MAXDIM 4
typedef struct {
gint step;
gint ncells;
gint dim;
gint cols;
gint rows;
gint cellwidth;
gint cellheight;
gchar *placement;
gint rank[PIXPIPE_MAXDIM];
gchar *selection[PIXPIPE_MAXDIM];
} PixPipeParams;
/* Initalize with dummy values */
void pixpipeparams_init (PixPipeParams *params);
/* Parse a string into a PixPipeParams */
void pixpipeparams_parse (gchar *parameters,
PixPipeParams *params);
/* Build a string representation of PixPipeParams */
gchar *pixpipeparams_build (PixPipeParams *params);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _PARASITEIO_H_ */

View File

@ -59,7 +59,8 @@ gimpi_OBJECTS = \
gimpunitmenu.o \
gimpwire.o \
gserialize.o \
parasite.o
parasite.o \
parasiteio.o
libgimpi.a : $(gimpi_OBJECTS)
ar cr libgimpi.a $(gimpi_OBJECTS)
@ -82,7 +83,8 @@ gimp_OBJECTS = \
gimpunit.o \
gimpwire.o \
gserialize.o \
parasite.o
parasite.o \
parasiteio.o
gimp-$(GIMP_VER).dll : $(gimp_OBJECTS) gimp.def
$(GLIB)/build-dll gimp $(GIMP_VER) gimp.def -s $(gimp_OBJECTS) -L $(INTL) -lgnu-intl -L $(GLIB) -lglib-$(GLIB_VER) -luser32

View File

@ -65,7 +65,8 @@ gimpi_OBJECTS = \
gimpunitmenu.obj\
gimpwire.obj \
gserialize.obj \
parasite.obj
parasite.obj \
parasiteio.obj
gimpi.lib : $(gimpi_OBJECTS)
lib /out:gimpi.lib $(gimpi_OBJECTS)
@ -88,7 +89,8 @@ gimp_OBJECTS = \
gimpunit.obj \
gimpwire.obj \
gserialize.obj \
parasite.obj
parasite.obj \
parasiteio.obj
gimp-$(GIMP_VER).dll : $(gimp_OBJECTS) gimp.def
$(CC) $(CFLAGS) -LD -Fegimp-$(GIMP_VER).dll $(gimp_OBJECTS) $(INTL)\gnu-intl.lib $(GLIB)\glib-$(GLIB_VER).lib $(LDFLAGS) user32.lib /def:gimp.def

154
libgimp/parasiteio.c Normal file
View File

@ -0,0 +1,154 @@
/* Functions for bulding and parsing string representations of
* various standard parasite types.
*
* Copyright (C) 1999 Tor Lillqvist <tml@iki.fi>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; 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>
#include <glib.h>
#include "libgimp/parasiteio.h"
void
pixpipeparams_init (PixPipeParams *params)
{
int i;
params->step = 100;
params->ncells = 1;
params->cellwidth = 1;
params->cellheight = 1;
params->dim = 1;
params->cols = 1;
params->rows = 1;
params->placement = "constant";
for (i = 0; i < PIXPIPE_MAXDIM; i++)
params->selection[i] = "random";
params->rank[0] = 1;
for (i = 1; i < PIXPIPE_MAXDIM; i++)
params->rank[i] = 0;
}
void
pixpipeparams_parse (gchar *string,
PixPipeParams *params)
{
guchar *p, *q, *r; /* Don't you love single-char identifiers? */
gint i;
q = string;
while ((p = strtok (q, " \r\n")) != NULL)
{
q = NULL;
r = strchr (p, ':');
if (r)
*r = 0;
if (strcmp (p, "ncells") == 0)
{
if (r)
params->ncells = atoi (r + 1);
}
else if (strcmp (p, "step") == 0)
{
if (r)
params->step = atoi (r + 1);
}
else if (strcmp (p, "dim") == 0)
{
if (r)
params->dim = atoi (r + 1);
}
else if (strcmp (p, "cols") == 0)
{
if (r)
params->cols = atoi (r + 1);
}
else if (strcmp (p, "rows") == 0)
{
if (r)
params->rows = atoi (r + 1);
}
else if (strcmp (p, "cellwidth") == 0)
{
if (r)
params->cellwidth = atoi (r + 1);
}
else if (strcmp (p, "cellheight") == 0)
{
if (r)
params->cellheight = atoi (r + 1);
}
else if (strcmp (p, "placement") == 0)
{
if (r)
params->placement = g_strdup (r + 1);
}
else if (strncmp (p, "rank", strlen ("rank")) == 0 && r)
{
if (r)
{
i = atoi (p + strlen ("rank"));
if (i >= 0 && i < params->dim)
params->rank[i] = atoi (r + 1);
}
}
else if (strncmp (p, "sel", strlen ("sel")) == 0 && r)
{
if (r)
{
i = atoi (p + strlen ("sel"));
if (i >= 0 && i < params->dim)
params->selection[i] = g_strdup (r + 1);
}
}
if (r)
*r = ':';
}
}
gchar *
pixpipeparams_build (PixPipeParams *params)
{
GString *s = g_string_new (NULL);
gchar *str;
int i;
g_string_sprintf (s, "ncells:%d cellwidth:%d cellheight:%d "
"step:%d dim:%d cols:%d rows:%d placement:%s",
params->ncells, params->cellwidth, params->cellheight,
params->step, params->dim,
params->cols, params->rows,
params->placement);
for (i = 0; i < params->dim; i++)
{
g_string_sprintfa (s, " rank%d:%d", i, params->rank[i]);
g_string_sprintfa (s, " sel%d:%s", i, params->selection[i]);
}
str = s->str;
g_string_free (s, FALSE);
return str;
}

62
libgimp/parasiteio.h Normal file
View File

@ -0,0 +1,62 @@
/* parasite.h
* Copyright (C) 1999 Tor Lillqvist <tml@iki.fi>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef _PARASITEIO_H_
#define _PARASITEIO_H_
/* Data structures for various standard parasites used by plug-ins and
* the GIMP core, and functions to build and parse their string
* representations.
*/
/*
* Pixmap brush pipes.
*/
#define PIXPIPE_MAXDIM 4
typedef struct {
gint step;
gint ncells;
gint dim;
gint cols;
gint rows;
gint cellwidth;
gint cellheight;
gchar *placement;
gint rank[PIXPIPE_MAXDIM];
gchar *selection[PIXPIPE_MAXDIM];
} PixPipeParams;
/* Initalize with dummy values */
void pixpipeparams_init (PixPipeParams *params);
/* Parse a string into a PixPipeParams */
void pixpipeparams_parse (gchar *parameters,
PixPipeParams *params);
/* Build a string representation of PixPipeParams */
gchar *pixpipeparams_build (PixPipeParams *params);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _PARASITEIO_H_ */

View File

@ -0,0 +1,154 @@
/* Functions for bulding and parsing string representations of
* various standard parasite types.
*
* Copyright (C) 1999 Tor Lillqvist <tml@iki.fi>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; 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>
#include <glib.h>
#include "libgimp/parasiteio.h"
void
pixpipeparams_init (PixPipeParams *params)
{
int i;
params->step = 100;
params->ncells = 1;
params->cellwidth = 1;
params->cellheight = 1;
params->dim = 1;
params->cols = 1;
params->rows = 1;
params->placement = "constant";
for (i = 0; i < PIXPIPE_MAXDIM; i++)
params->selection[i] = "random";
params->rank[0] = 1;
for (i = 1; i < PIXPIPE_MAXDIM; i++)
params->rank[i] = 0;
}
void
pixpipeparams_parse (gchar *string,
PixPipeParams *params)
{
guchar *p, *q, *r; /* Don't you love single-char identifiers? */
gint i;
q = string;
while ((p = strtok (q, " \r\n")) != NULL)
{
q = NULL;
r = strchr (p, ':');
if (r)
*r = 0;
if (strcmp (p, "ncells") == 0)
{
if (r)
params->ncells = atoi (r + 1);
}
else if (strcmp (p, "step") == 0)
{
if (r)
params->step = atoi (r + 1);
}
else if (strcmp (p, "dim") == 0)
{
if (r)
params->dim = atoi (r + 1);
}
else if (strcmp (p, "cols") == 0)
{
if (r)
params->cols = atoi (r + 1);
}
else if (strcmp (p, "rows") == 0)
{
if (r)
params->rows = atoi (r + 1);
}
else if (strcmp (p, "cellwidth") == 0)
{
if (r)
params->cellwidth = atoi (r + 1);
}
else if (strcmp (p, "cellheight") == 0)
{
if (r)
params->cellheight = atoi (r + 1);
}
else if (strcmp (p, "placement") == 0)
{
if (r)
params->placement = g_strdup (r + 1);
}
else if (strncmp (p, "rank", strlen ("rank")) == 0 && r)
{
if (r)
{
i = atoi (p + strlen ("rank"));
if (i >= 0 && i < params->dim)
params->rank[i] = atoi (r + 1);
}
}
else if (strncmp (p, "sel", strlen ("sel")) == 0 && r)
{
if (r)
{
i = atoi (p + strlen ("sel"));
if (i >= 0 && i < params->dim)
params->selection[i] = g_strdup (r + 1);
}
}
if (r)
*r = ':';
}
}
gchar *
pixpipeparams_build (PixPipeParams *params)
{
GString *s = g_string_new (NULL);
gchar *str;
int i;
g_string_sprintf (s, "ncells:%d cellwidth:%d cellheight:%d "
"step:%d dim:%d cols:%d rows:%d placement:%s",
params->ncells, params->cellwidth, params->cellheight,
params->step, params->dim,
params->cols, params->rows,
params->placement);
for (i = 0; i < params->dim; i++)
{
g_string_sprintfa (s, " rank%d:%d", i, params->rank[i]);
g_string_sprintfa (s, " sel%d:%s", i, params->selection[i]);
}
str = s->str;
g_string_free (s, FALSE);
return str;
}

View File

@ -0,0 +1,62 @@
/* parasite.h
* Copyright (C) 1999 Tor Lillqvist <tml@iki.fi>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef _PARASITEIO_H_
#define _PARASITEIO_H_
/* Data structures for various standard parasites used by plug-ins and
* the GIMP core, and functions to build and parse their string
* representations.
*/
/*
* Pixmap brush pipes.
*/
#define PIXPIPE_MAXDIM 4
typedef struct {
gint step;
gint ncells;
gint dim;
gint cols;
gint rows;
gint cellwidth;
gint cellheight;
gchar *placement;
gint rank[PIXPIPE_MAXDIM];
gchar *selection[PIXPIPE_MAXDIM];
} PixPipeParams;
/* Initalize with dummy values */
void pixpipeparams_init (PixPipeParams *params);
/* Parse a string into a PixPipeParams */
void pixpipeparams_parse (gchar *parameters,
PixPipeParams *params);
/* Build a string representation of PixPipeParams */
gchar *pixpipeparams_build (PixPipeParams *params);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _PARASITEIO_H_ */

View File

@ -32,6 +32,7 @@
#include <gtk/gtk.h>
#include <libgimp/gimp.h>
#include <libgimp/parasiteio.h>
#include "app/brush_header.h"
#include "app/pattern_header.h"
@ -39,7 +40,6 @@
#define DUMMY_PATTERN_NAME "x"
#define MAXDESCLEN 256
#define MAXDIM 4
/* Parameters applicable each time we save a gpb or gih, saved
* in the main gimp application between invocations of this plug-in.
@ -58,19 +58,26 @@ static struct {
static gint run_flag = 0;
static gint num_layers_with_alpha;
/* Parameters related to one single gih file, collected in a struct
* just for clarity.
*/
static struct {
gint step;
gint ncells;
gint dim;
gint cols;
gint rows;
gchar *placement;
gint rank[MAXDIM];
gchar *selection[MAXDIM];
} gihparms;
static PixPipeParams gihparms;
typedef struct
{
GOrientation orientation;
gint32 image;
gint32 toplayer;
gint nguides;
gint32 *guides;
gint *value;
GtkWidget *count_label; /* Corresponding count adjustment, */
gint *count; /* cols or rows */
gint *other_count; /* And the other one */
GtkObject *ncells;
GtkObject *rank0;
GtkWidget *warning_label;
} SizeAdjustmentData;
static gint32 *vguides, *hguides;
static gint nvguides = 0, nhguides = 0;
/* Declare some local functions.
*/
@ -163,6 +170,64 @@ adjustment_callback (GtkWidget *widget,
*((gint *) data) = GTK_ADJUSTMENT (widget)->value;
}
static void
size_adjustment_callback (GtkWidget *widget,
gpointer data)
{
/* Unfortunately this doesn't work, sigh. The guides don't show up unless
* you manually force a redraw of the image.
*/
int i;
int size;
int newn;
SizeAdjustmentData *adj = (SizeAdjustmentData *) data;
char buf[10];
for (i = 0; i < adj->nguides; i++)
gimp_image_delete_guide (adj->image, adj->guides[i]);
g_free (adj->guides);
adj->guides = NULL;
gimp_displays_flush ();
*(adj->value) = GTK_ADJUSTMENT (widget)->value;
if (adj->orientation == ORIENTATION_VERTICAL)
{
size = gimp_image_width (adj->image);
newn = size / *(adj->value);
adj->nguides = newn - 1;
adj->guides = g_new (gint32, adj->nguides);
for (i = 0; i < adj->nguides; i++)
adj->guides[i] = gimp_image_add_vguide (adj->image,
*(adj->value) * (i+1));
}
else
{
size = gimp_image_height (adj->image);
newn = size / *(adj->value);
adj->nguides = newn - 1;
adj->guides = g_new (gint32, adj->nguides);
for (i = 0; i < adj->nguides; i++)
adj->guides[i] = gimp_image_add_hguide (adj->image,
*(adj->value) * (i+1));
}
gimp_displays_flush ();
sprintf (buf, "%2d", newn);
gtk_label_set_text (GTK_LABEL (adj->count_label), buf);
*(adj->count) = newn;
if (newn * *(adj->value) != size)
gtk_widget_show (GTK_WIDGET (adj->warning_label));
else
gtk_widget_hide (GTK_WIDGET (adj->warning_label));
if (adj->ncells != NULL)
gtk_adjustment_set_value (GTK_ADJUSTMENT (adj->ncells),
*(adj->other_count) * *(adj->count));
if (adj->rank0 != NULL)
gtk_adjustment_set_value (GTK_ADJUSTMENT (adj->rank0),
*(adj->other_count) * *(adj->count));
}
static void
entry_callback (GtkWidget *widget,
gpointer data)
@ -322,7 +387,7 @@ gpb_save_dialog ()
}
static gint
gih_save_dialog ()
gih_save_dialog (gint32 image_ID)
{
GtkWidget *dlg;
GtkWidget *table, *dimtable;
@ -337,12 +402,21 @@ gih_save_dialog ()
gchar **argv;
gint argc;
gchar buffer[100];
SizeAdjustmentData cellw_adjust, cellh_adjust;
gint32 *layer_ID;
gint32 nlayers;
/* Setup default values */
if (gihparms.rows >= 1 && gihparms.cols >= 1)
gihparms.ncells = num_layers_with_alpha * gihparms.rows * gihparms.cols;
else
gihparms.ncells = 1;
gihparms.ncells = num_layers_with_alpha;
if (gihparms.cellwidth == 1 && gihparms.cellheight == 1)
{
gihparms.cellwidth = gimp_image_width (image_ID) / gihparms.cols;
gihparms.cellheight = gimp_image_height (image_ID) / gihparms.rows;
}
argc = 1;
argv = g_new (gchar *, 1);
@ -365,6 +439,77 @@ gih_save_dialog ()
common_save_dialog (dlg, table);
/*
* Cell size: __ x __ pixels
*/
gtk_table_resize (GTK_TABLE (table),
GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols);
label = gtk_label_new ("Cell size:");
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label);
box = gtk_hbox_new (FALSE, 0);
adjustment = gtk_adjustment_new (gihparms.cellwidth,
2, gimp_image_width (image_ID), 1, 1, 1);
spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (adjustment), 1, 0);
gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinbutton),
GTK_SHADOW_NONE);
gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
gtk_widget_set_usize (spinbutton, 75, 0);
gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, FALSE, 0);
layer_ID = gimp_image_get_layers (image_ID, &nlayers);
cellw_adjust.orientation = ORIENTATION_VERTICAL;
cellw_adjust.image = image_ID;
cellw_adjust.toplayer = layer_ID[nlayers-1];
cellw_adjust.nguides = 0;
cellw_adjust.guides = NULL;
cellw_adjust.value = &gihparms.cellwidth;
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
(GtkSignalFunc) size_adjustment_callback,
&cellw_adjust);
gtk_widget_show (spinbutton);
label = gtk_label_new (" x ");
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
gtk_widget_show (label);
adjustment = gtk_adjustment_new (gihparms.cellheight,
2, gimp_image_height (image_ID), 1, 1, 1);
spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (adjustment), 1, 0);
gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinbutton),
GTK_SHADOW_NONE);
gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
gtk_widget_set_usize (spinbutton, 75, 0);
gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, FALSE, 0);
cellh_adjust.orientation = ORIENTATION_HORIZONTAL;
cellh_adjust.image = image_ID;
cellh_adjust.toplayer = layer_ID[nlayers-1];
cellh_adjust.nguides = 0;
cellh_adjust.guides = NULL;
cellh_adjust.value = &gihparms.cellheight;
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
(GtkSignalFunc) size_adjustment_callback,
&cellh_adjust);
gtk_widget_show (spinbutton);
label = gtk_label_new (" pixels");
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
gtk_widget_show (label);
gtk_table_attach (GTK_TABLE (table), box, 1, 2,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (box);
g_free (layer_ID);
/*
* Number of cells: ___
*/
@ -395,6 +540,11 @@ gih_save_dialog ()
gtk_widget_show (spinbutton);
gtk_widget_show (box);
if (gihparms.dim == 1)
cellw_adjust.ncells = cellh_adjust.ncells = adjustment;
else
cellw_adjust.ncells = cellh_adjust.ncells = NULL;
/*
* Display as: __ rows x __ cols
*/
@ -410,36 +560,38 @@ gih_save_dialog ()
box = gtk_hbox_new (FALSE, 0);
adjustment = gtk_adjustment_new (gihparms.rows, 1, 10, 1, 1, 1);
spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (adjustment), 1, 0);
gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinbutton),
GTK_SHADOW_NONE);
gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
gtk_widget_set_usize (spinbutton, 75, 0);
gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
(GtkSignalFunc) adjustment_callback, &gihparms.rows);
gtk_widget_show (spinbutton);
sprintf (buffer, "%2d", gihparms.rows);
label = gtk_label_new (buffer);
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
cellh_adjust.count_label = label;
cellh_adjust.count = &gihparms.rows;
cellh_adjust.other_count = &gihparms.cols;
gtk_widget_show (label);
label = gtk_label_new (" rows of ");
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
gtk_widget_show (label);
adjustment = gtk_adjustment_new (gihparms.cols, 1, 10, 1, 1, 1);
spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (adjustment), 1, 0);
gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinbutton),
GTK_SHADOW_NONE);
gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
gtk_widget_set_usize (spinbutton, 75, 0);
gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
(GtkSignalFunc) adjustment_callback, &gihparms.cols);
gtk_widget_show (spinbutton);
sprintf (buffer, "%2d", gihparms.cols);
label = gtk_label_new (buffer);
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
cellw_adjust.count_label = label;
cellw_adjust.count = &gihparms.cols;
cellw_adjust.other_count = &gihparms.rows;
gtk_widget_show (label);
label = gtk_label_new (" columns");
label = gtk_label_new (" columns on each layer");
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
gtk_widget_show (label);
label = gtk_label_new (" (width mismatch!) ");
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
cellw_adjust.warning_label = label;
label = gtk_label_new (" (height mismatch!) ");
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
cellh_adjust.warning_label = label;
gtk_table_attach (GTK_TABLE (table), box, 1, 2,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_FILL, GTK_FILL, 0, 0);
@ -489,8 +641,8 @@ gih_save_dialog ()
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label);
dimtable = gtk_table_new (MAXDIM, 1, FALSE);
for (i = 0; i < MAXDIM; i++)
dimtable = gtk_table_new (PIXPIPE_MAXDIM, 1, FALSE);
for (i = 0; i < PIXPIPE_MAXDIM; i++)
{
adjustment = gtk_adjustment_new (gihparms.rank[i], 0, 100, 1, 1, 1);
spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (adjustment), 1, 0);
@ -506,6 +658,11 @@ gih_save_dialog ()
(GtkSignalFunc) adjustment_callback, &gihparms.rank[i]);
gtk_widget_show (spinbutton);
gtk_widget_show (box);
if (i == 0)
if (gihparms.dim == 1)
cellw_adjust.rank0 = cellh_adjust.rank0 = adjustment;
else
cellw_adjust.rank0 = cellh_adjust.rank0 = NULL;
}
gtk_table_attach (GTK_TABLE (table), dimtable, 1, 2,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
@ -535,7 +692,7 @@ gih_save_dialog ()
cbitems = g_list_append (cbitems, "ytilt");
box = gtk_hbox_new (FALSE, 0);
for (i = 0; i < MAXDIM; i++)
for (i = 0; i < PIXPIPE_MAXDIM; i++)
{
cb = gtk_combo_new ();
gtk_combo_set_popdown_strings (GTK_COMBO (cb), cbitems);
@ -561,6 +718,11 @@ gih_save_dialog ()
gtk_main ();
gdk_flush ();
for (i = 0; i < cellw_adjust.nguides; i++)
gimp_image_delete_guide (image_ID, cellw_adjust.guides[i]);
for (i = 0; i < cellh_adjust.nguides; i++)
gimp_image_delete_guide (image_ID, cellh_adjust.guides[i]);
if (run_flag)
{
/* Fix up bogus values */
@ -761,133 +923,6 @@ gpb_save_image (char *filename,
return TRUE;
}
static void
init_pipe_parameters ()
{
int i;
gihparms.step = 100;
gihparms.ncells = 1;
gihparms.dim = 1;
gihparms.cols = 1;
gihparms.rows = 1;
gihparms.placement = "constant";
for (i = 0; i < MAXDIM; i++)
gihparms.selection[i] = "random";
gihparms.rank[0] = 1;
for (i = 1; i < MAXDIM; i++)
gihparms.rank[i] = 0;
}
static void
parse_brush_pipe_parameters (gchar *parameters)
{
guchar *p, *q, *r, *s; /* Don't you love single-char identifiers? */
gint i;
IFDBG(2) g_message ("parsing parasite: %s", parameters);
q = parameters;
while ((p = strtok (q, " ")) != NULL)
{
q = NULL;
r = strchr (p, ':');
if (r)
*r = 0;
if (strcmp (p, "ncells") == 0)
{
if (r)
gihparms.ncells = atoi (r + 1);
}
else if (strcmp (p, "step") == 0)
{
if (r)
gihparms.step = atoi (r + 1);
}
else if (strcmp (p, "dim") == 0)
{
if (r)
gihparms.dim = atoi (r + 1);
}
else if (strcmp (p, "cols") == 0)
{
if (r)
gihparms.cols = atoi (r + 1);
}
else if (strcmp (p, "rows") == 0)
{
if (r)
gihparms.rows = atoi (r + 1);
}
else if (strcmp (p, "placement") == 0)
{
if (r)
gihparms.placement = g_strdup (r + 1);
}
else if (strncmp (p, "rank", strlen ("rank")) == 0 && r)
{
if (r)
{
i = atoi (p + strlen ("rank"));
if (i >= 0 && i < gihparms.dim)
gihparms.rank[i] = atoi (r + 1);
}
}
else if (strncmp (p, "sel", strlen ("sel")) == 0 && r)
{
if (r)
{
i = atoi (p + strlen ("sel"));
if (i >= 0 && i < gihparms.dim)
gihparms.selection[i] = g_strdup (r + 1);
}
}
if (r)
*r = ':';
}
IFDBG(2) g_message ("parsed parasite: "
"ncells:%d step:%d dim:%d cols:%d rows:%d "
"placement:%s "
"rank0:%d rank1:%d rank2:%d rank3:%d"
"sel%d:%s sel%d:%s sel%d:%s ",
gihparms.ncells, gihparms.step,
gihparms.dim, gihparms.cols, gihparms.rows,
gihparms.placement,
gihparms.rank[0], gihparms.rank[1],
gihparms.rank[2], gihparms.rank[3],
gihparms.selection[0], gihparms.selection[1],
gihparms.selection[2], gihparms.selection[3]);
}
static gchar *
build_brush_pipe_parameters ()
{
GString *s = g_string_new (NULL);
gchar *str;
int i;
g_string_sprintf (s, "ncells:%d step:%d dim:%d cols:%d rows:%d placement:%s",
gihparms.ncells, gihparms.step,
gihparms.dim,
gihparms.cols, gihparms.rows,
gihparms.placement);
for (i = 0; i < gihparms.dim; i++)
{
g_string_sprintfa (s, " rank%d:%d", i, gihparms.rank[i]);
g_string_sprintfa (s, " sel%d:%s", i, gihparms.selection[i]);
}
str = s->str;
g_string_free (s, FALSE);
IFDBG(2) g_message ("built parasite string: %s", str);
return str;
}
static gboolean
gih_save_image (char *filename,
gint32 image_ID,
@ -897,7 +932,7 @@ gih_save_image (char *filename,
GPixelRgn pixel_rgn;
FILE *file;
Parasite *pipe_parasite;
gchar *msg, *pars, *ncells;
gchar *msg, *parstring, *ncells;
gint32 *layer_ID;
gint nlayers, layer, row, col;
gint imagew, imageh, offsetx, offsety;
@ -919,26 +954,27 @@ gih_save_image (char *filename,
return FALSE;
}
pars = build_brush_pipe_parameters ();
parstring = pixpipeparams_build (&gihparms);
IFDBG(2) g_message ("parameter string: %s", parstring);
ncells = g_strdup_printf ("%d ", gihparms.ncells);
if (!(try_fwrite (info.description, strlen (info.description), 1, file)
&& try_fwrite ("\n", 1, 1, file)
&& try_fwrite (ncells, strlen (ncells), 1, file)
&& try_fwrite (pars, strlen (pars), 1, file)
&& try_fwrite (parstring, strlen (parstring), 1, file)
&& try_fwrite ("\n", 1, 1, file)))
{
g_free (pars);
g_free (parstring);
g_free (ncells);
return FALSE;
}
pipe_parasite = parasite_new ("gimp-brush-pipe-parameters",
PARASITE_PERSISTENT,
strlen (pars) + 1, pars);
strlen (parstring) + 1, parstring);
gimp_image_attach_parasite (image_ID, pipe_parasite);
parasite_free (pipe_parasite);
g_free (pars);
g_free (parstring);
g_free (ncells);
layer_ID = gimp_image_get_layers (image_ID, &nlayers);
@ -1070,13 +1106,11 @@ run (char *name,
/* Possibly retrieve data */
gimp_get_data ("file_gih_save", &info);
pipe_parasite = gimp_image_find_parasite (image_ID, "gimp-brush-pipe-parameters");
init_pipe_parameters ();
pixpipeparams_init (&gihparms);
if (pipe_parasite)
{
parse_brush_pipe_parameters (pipe_parasite->data);
}
pixpipeparams_parse (pipe_parasite->data, &gihparms);
if (!gih_save_dialog ())
if (!gih_save_dialog (image_ID))
return;
break;

View File

@ -50,6 +50,7 @@
#include <zlib.h>
#include <libgimp/gimp.h>
#include <libgimp/parasiteio.h>
#include <libgimp/stdplugins-intl.h>
/* Note that the upcoming PSP version 6 writes PSP file format version
@ -1462,9 +1463,12 @@ read_tube_block (FILE *f,
guint32 step_size, column_count, row_count, cell_count;
guint32 placement_mode, selection_mode;
gint i;
PixPipeParams params;
Parasite *pipe_parasite;
gchar *parasite_text;
pixpipeparams_init (&params);
if (fread (&version, 2, 1, f) < 1
|| fread (name, 513, 1, f) < 1
|| fread (&step_size, 4, 1, f) < 1
@ -1481,10 +1485,10 @@ read_tube_block (FILE *f,
}
name[513] = 0;
version = GUINT16_FROM_LE (version);
step_size = GUINT32_FROM_LE (step_size);
column_count = GUINT32_FROM_LE (column_count);
row_count = GUINT32_FROM_LE (row_count);
cell_count = GUINT32_FROM_LE (cell_count);
params.step = GUINT32_FROM_LE (step_size);
params.cols = GUINT32_FROM_LE (column_count);
params.rows = GUINT32_FROM_LE (row_count);
params.ncells = GUINT32_FROM_LE (cell_count);
placement_mode = GUINT32_FROM_LE (placement_mode);
selection_mode = GUINT32_FROM_LE (selection_mode);
@ -1497,21 +1501,23 @@ read_tube_block (FILE *f,
* case we will have any use of those, for instance in the gpb
* plug-in that saves a GIMP image pipe.
*/
parasite_text =
g_strdup_printf ("ncells:%d step:%d dim:%d cols:%d rows:%d "
"rank0:%d "
"placement:%s sel0:%s",
cell_count, step_size, 1, column_count, row_count,
cell_count,
(placement_mode == tpmRandom ? "random" :
params.dim = 1;
params.cellwidth = ia->width / params.cols;
params.cellheight = ia->height / params.rows;
params.placement = (placement_mode == tpmRandom ? "random" :
(placement_mode == tpmConstant ? "constant" :
"default")),
(selection_mode == tsmRandom ? "random" :
(selection_mode == tsmIncremental ? "incremental" :
(selection_mode == tsmAngular ? "angular" :
(selection_mode == tsmPressure ? "pressure" :
(selection_mode == tsmVelocity ? "velocity" :
"default"))))));
"default"));
params.rank[0] = params.ncells;
params.selection[0] = (selection_mode == tsmRandom ? "random" :
(selection_mode == tsmIncremental ? "incremental" :
(selection_mode == tsmAngular ? "angular" :
(selection_mode == tsmPressure ? "pressure" :
(selection_mode == tsmVelocity ? "velocity" :
"default")))));
parasite_text = pixpipeparams_build (&params);
IFDBG(2) g_message ("parasite: %s", parasite_text);
pipe_parasite = parasite_new ("gimp-brush-pipe-parameters",
PARASITE_PERSISTENT,
strlen (parasite_text) + 1, parasite_text);