configure.in po-plug-ins/POTFILES.in plug-ins/common/Makefile.am

2000-01-25  Michael Natterer  <mitch@gimp.org>

	* configure.in
	* po-plug-ins/POTFILES.in
	* plug-ins/common/Makefile.am
	* plug-ins/common/plugin-defs.pl
	* plug-ins/megawidget/*: removed. (There were only 3 functions
	left which were used by ~5 plugins, so I moved the resp. functions
	to the plugins). More preview stuff to come...

	* app/airbrush_blob.c
	* modules/colorsel_triangle.c
	* modules/colorsel_water.c: use G_PI instead of M_PI.

	* app/procedural_db.h
	* libgimp/gimpenums.h
	* plug-ins/script-fu/script-fu-constants.c
	* tools/pdbgen/enums.pl: new PDB return value STATUS_CANCEL which
	indicates that "Cancel" was pressed in a plugin dialog. (Useful
	only for file load/save plugins).

	* app/fileops.[ch]
	* app/menus.c: changes to handle STATUS_CANCEL correctly. Did some
	code cleanup in fileops.[ch]. Pop up a warning if File->Save
	failed.

	* app/plug_in.c: return_val[0] is of type PDB_STATUS, not
	PDB_INT32.

	* libgimp/gimpmath.h: new constant G_MAXRAND which equals to
	RAND_MAX if it exists or to G_MAXINT otherwise.

	* libgimp/gimpwidgets.[ch]: new function gimp_random_seed_new()
	which creates a spinbutton and a "Time" toggle.
	Call the function which does the "set_sensitive" magic from the
	radio button callback.

	* plug-ins/[75 plugins]:

	- Return STATUS_CANCEL in all file load/save dialogs if "Cancel"
	  was pressed.
	- Standardized the file plugins' "run" functions.
	- Use G_PI and G_MAXRAND everywhere.
	- Added tons of scales and spinbuttons instead of text entries.
	- Applied uniform packing/spacings all over the place.
	- Reorganized some UIs (stuff like moving the preview to the top
	  left corner of the dialog).
	- Removed many ui helper functions and callbacks and use the stuff
	  from libgimp instead.
	- I tried not to restrict the range of possible values when I
	  replaced entries with spinbuttons/scales but may have failed,
	  though in some cases. Please test ;-)
	- #include <libgimp/gimpmath.h> where appropriate and use it's
	  constants.
	- Indentation, s/int/gint/ et.al., code cleanup.

	RFC: The plugins are definitely not useable with GIMP 1.0 any
	     more, so shouldn't we remove all the remaining compatibility
	     stuff ??? (like "#ifdef GIMP_HAVE_PARASITES")
This commit is contained in:
Michael Natterer 2000-01-25 17:46:56 +00:00 committed by Michael Natterer
parent 7a8b15754b
commit fa30ba04c7
138 changed files with 15463 additions and 16195 deletions

View file

@ -1,3 +1,63 @@
2000-01-25 Michael Natterer <mitch@gimp.org>
* configure.in
* po-plug-ins/POTFILES.in
* plug-ins/common/Makefile.am
* plug-ins/common/plugin-defs.pl
* plug-ins/megawidget/*: removed. (There were only 3 functions
left which were used by ~5 plugins, so I moved the resp. functions
to the plugins). More preview stuff to come...
* app/airbrush_blob.c
* modules/colorsel_triangle.c
* modules/colorsel_water.c: use G_PI instead of M_PI.
* app/procedural_db.h
* libgimp/gimpenums.h
* plug-ins/script-fu/script-fu-constants.c
* tools/pdbgen/enums.pl: new PDB return value STATUS_CANCEL which
indicates that "Cancel" was pressed in a plugin dialog. (Useful
only for file load/save plugins).
* app/fileops.[ch]
* app/menus.c: changes to handle STATUS_CANCEL correctly. Did some
code cleanup in fileops.[ch]. Pop up a warning if File->Save
failed.
* app/plug_in.c: return_val[0] is of type PDB_STATUS, not
PDB_INT32.
* libgimp/gimpmath.h: new constant G_MAXRAND which equals to
RAND_MAX if it exists or to G_MAXINT otherwise.
* libgimp/gimpwidgets.[ch]: new function gimp_random_seed_new()
which creates a spinbutton and a "Time" toggle.
Call the function which does the "set_sensitive" magic from the
radio button callback.
* plug-ins/[75 plugins]:
- Return STATUS_CANCEL in all file load/save dialogs if "Cancel"
was pressed.
- Standardized the file plugins' "run" functions.
- Use G_PI and G_MAXRAND everywhere.
- Added tons of scales and spinbuttons instead of text entries.
- Applied uniform packing/spacings all over the place.
- Reorganized some UIs (stuff like moving the preview to the top
left corner of the dialog).
- Removed many ui helper functions and callbacks and use the stuff
from libgimp instead.
- I tried not to restrict the range of possible values when I
replaced entries with spinbuttons/scales but may have failed,
though in some cases. Please test ;-)
- #include <libgimp/gimpmath.h> where appropriate and use it's
constants.
- Indentation, s/int/gint/ et.al., code cleanup.
RFC: The plugins are definitely not useable with GIMP 1.0 any
more, so shouldn't we remove all the remaining compatibility
stuff ??? (like "#ifdef GIMP_HAVE_PARASITES")
Tue Jan 25 15:10:14 CET 2000 Stanislav Brabec <utx@penguin.cz>
* plug-ins/common/color_enhance.c: On request of
@ -5,7 +65,7 @@ Tue Jan 25 15:10:14 CET 2000 Stanislav Brabec <utx@penguin.cz>
gdouble, gint).
Mon Jan 24 22:28:00 CET 2000 Seth Burgess <sjburges@gimp.org>
* app/gdisplay_ops.c: Added a minimum width for shrink wrap;
without it, it would map improperly and create a mess for small
images. Its not a very shrunk wrap since the statusbar is so

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -21,25 +21,19 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "airbrush_blob.h"
#include <glib.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libgimp/gimpmath.h>
#include "airbrush_blob.h"
#define ROUND(A) floor((A)+0.5)
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif /* M_PI */
#ifndef M_PI_H
#define M_PI_H 3.14159265358979323846/2
#endif
#define SUBSAMPLE 8.0
#define SU 8.0
@ -529,7 +523,7 @@ airbrush_blob_ellipse (double xc, double yc, double xt, double yt, double xr, do
ma_ang1 = atan(yt/xr);
x1 = cos(ma_ang1) * xl;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xr;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -554,7 +548,7 @@ airbrush_blob_ellipse (double xc, double yc, double xt, double yt, double xr, do
ma_ang1 = atan(yt/xl);
x1 = cos(ma_ang1) * xr;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xl;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -579,7 +573,7 @@ airbrush_blob_ellipse (double xc, double yc, double xt, double yt, double xr, do
ma_ang1 = atan(yb/xl);
x1 = cos(ma_ang1) * xl;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xr;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -605,7 +599,7 @@ airbrush_blob_ellipse (double xc, double yc, double xt, double yt, double xr, do
ma_ang1 = atan(yb/xr);
x1 = cos(ma_ang1) * xr;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xl;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -636,7 +630,7 @@ airbrush_blob_ellipse (double xc, double yc, double xt, double yt, double xr, do
{
trig_initialized = 1;
for (i=0; i<256; i++)
trig_table[i] = 0.5 + sin(i * (M_PI / 128.)) * (1 << TABLE_SHIFT);
trig_table[i] = 0.5 + sin(i * (G_PI / 128.0)) * (1 << TABLE_SHIFT);
}
@ -977,7 +971,7 @@ create_air_blob (double xc,
air_blob->minorcross_line.size = yt * 2;
air_blob->minorcross_line.dist = 0.0;
air_blob->direction = M_PI_H;
air_blob->direction = G_PI_2;
}
else if (xr == xl)
@ -1105,7 +1099,7 @@ create_air_blob (double xc,
ma_ang1 = atan(yt/xr);
x1 = cos(ma_ang1) * xl;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xr;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -1144,7 +1138,7 @@ create_air_blob (double xc,
ma_ang1 = atan(yt/xl);
x1 = cos(ma_ang1) * xr;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xl;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -1178,7 +1172,7 @@ create_air_blob (double xc,
ma_ang1 = atan(yb/xl);
x1 = cos(ma_ang1) * xl;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xr;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -1216,7 +1210,7 @@ create_air_blob (double xc,
ma_ang1 = atan(yb/xr);
x1 = cos(ma_ang1) * xr;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xl;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -1292,12 +1286,12 @@ create_air_line(AirBlob *airblob)
printf("Mi.size: %f\n",airblob->minor_line.size);
*/
if (direction == M_PI_H || direction == M_PI)
if (direction == G_PI_2 || direction == G_PI)
{
direction = direction - 0.001;
}
if (direction == -M_PI_H || direction == -M_PI)
if (direction == -G_PI_2 || direction == -G_PI)
{
direction = direction + 0.001;
}
@ -1326,7 +1320,7 @@ create_air_line(AirBlob *airblob)
}
else if(direction == M_PI_H)
else if(direction == G_PI_2)
{
@ -1346,12 +1340,12 @@ create_air_line(AirBlob *airblob)
airline->line[5].y = (ycenter + airblob->minorcross_line.size/2)/SUBSAMPLE;
airline->nlines = 6;
printf("Hmm bummer M_PI_H\n");
printf("Hmm bummer G_PI_2\n");
}
else if(direction == M_PI)
else if(direction == G_PI)
{
airline->line[0].x = (xcenter - airblob->maincross_line.dist)/SUBSAMPLE;
@ -1371,12 +1365,12 @@ create_air_line(AirBlob *airblob)
airline->nlines = 6;
printf("Hmm bummer M_PI\n");
printf("Hmm bummer G_PI\n");
}
else if(direction == -M_PI_H)
else if(direction == -G_PI_2)
{
airline->line[0].x = (xcenter - airblob->maincross_line.dist)/SUBSAMPLE;
@ -1396,14 +1390,14 @@ create_air_line(AirBlob *airblob)
airline->nlines = 6;
printf("Hmm bummer -M_PI_H\n");
printf("Hmm bummer -G_PI_2\n");
}
else if(direction == -M_PI)
else if(direction == -G_PI)
{
airline->line[0].x = (xcenter - airblob->maincross_line.dist)/SUBSAMPLE;
@ -1423,13 +1417,13 @@ create_air_line(AirBlob *airblob)
airline->nlines = 6;
printf("Hmm bummer -M_PI\n");
printf("Hmm bummer -G_PI\n");
}
else if ((direction < M_PI) && (direction > M_PI_H))
else if ((direction < G_PI) && (direction > G_PI_2))
{
@ -1440,7 +1434,7 @@ create_air_line(AirBlob *airblob)
ma_angsupport = atan(airblob->maincross_line.size/2/airblob->maincross_line.dist);
mi_angsupport = atan(airblob->minorcross_line.size/2/airblob->minorcross_line.dist);
iang = airblob->direction_abs - M_PI_H;
iang = airblob->direction_abs - G_PI_2;
airline->line[0].x = (xcenter - sin(iang + ma_angsupport) * masupport)/SUBSAMPLE;
airline->line[0].y = (ycenter - cos(iang + ma_angsupport) * masupport)/SUBSAMPLE;
@ -1477,7 +1471,7 @@ create_air_line(AirBlob *airblob)
}
else if ((direction < M_PI_H) && (direction > 0.0))
else if ((direction < G_PI_2) && (direction > 0.0))
{
@ -1535,7 +1529,7 @@ create_air_line(AirBlob *airblob)
}
else if ((direction < 0.0) && (direction > -M_PI_H))
else if ((direction < 0.0) && (direction > -G_PI_2))
{
@ -1568,7 +1562,7 @@ create_air_line(AirBlob *airblob)
}
else if ((direction < -M_PI_H) && (direction > -M_PI))
else if ((direction < -G_PI_2) && (direction > -G_PI))
{
@ -1579,7 +1573,7 @@ create_air_line(AirBlob *airblob)
ma_angsupport = atan(airblob->maincross_line.size/2/airblob->maincross_line.dist);
mi_angsupport = atan(airblob->minorcross_line.size/2/airblob->minorcross_line.dist);
iang = fabs(airblob->direction_abs) - M_PI_H;
iang = fabs(airblob->direction_abs) - G_PI_2;
airline->line[0].x = (xcenter - sin(iang + ma_angsupport) * masupport)/SUBSAMPLE;
airline->line[0].y = (ycenter + cos(iang + ma_angsupport) * masupport)/SUBSAMPLE;
@ -1675,13 +1669,13 @@ trans_air_blob(AirBlob *airblob_last, AirBlob *airblob_present, double dist, int
trans_airblob = airblob_new(1);
direction_last_abs = airblob_last->direction_abs + M_PI;
direction_present_abs = airblob_present->direction_abs + M_PI;
direction_last_abs = airblob_last->direction_abs + G_PI;
direction_present_abs = airblob_present->direction_abs + G_PI;
idirection_abs = direction_present_abs - direction_last_abs;
direction_last = airblob_last->direction + M_PI_H;
direction_present = airblob_present->direction + M_PI_H;
direction_last = airblob_last->direction + G_PI_2;
direction_present = airblob_present->direction + G_PI_2;
idirection = direction_present - direction_last;
@ -1709,7 +1703,7 @@ trans_air_blob(AirBlob *airblob_last, AirBlob *airblob_present, double dist, int
Well we can't know if the users is painting
up/down or if she is painting a circle at high speed.
As you may notice it be so that the last airblob has
a direction more or less M_PI rad differernt from the
a direction more or less G_PI rad differernt from the
present airblob. But we can't know if she tured the
airbrush quickly (so that there was no mouse capture
during the turn) or if she paints just up and down the
@ -1721,40 +1715,40 @@ trans_air_blob(AirBlob *airblob_last, AirBlob *airblob_present, double dist, int
*/
if ((fabs(idirection_abs) > (M_PI - 0.1571)) && (fabs(idirection_abs) < (M_PI + 0.1571)))
if ((fabs(idirection_abs) > (G_PI - 0.1571)) && (fabs(idirection_abs) < (G_PI + 0.1571)))
{
/* We asume that the artist meant to paint in a "strait line" by just tilting the airbrush*/
idirection_abs = idirection_abs - M_PI;
idirection_abs = idirection_abs - G_PI;
if ((idirection_abs * dist) > (idirection_abs/2))
{
if ((direction_present_abs - idirection_abs * dist) > 2 * M_PI)
if ((direction_present_abs - idirection_abs * dist) > 2 * G_PI)
{
trans_airblob->direction_abs = direction_present_abs - idirection_abs * dist - 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_present_abs - idirection_abs * dist - 2 * G_PI - G_PI;
}
else if ((direction_present_abs - idirection_abs * dist) < 0.0)
{
trans_airblob->direction_abs = direction_present_abs - idirection_abs * dist + 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_present_abs - idirection_abs * dist + 2 * G_PI - G_PI;
}
else
{
trans_airblob->direction_abs = direction_present_abs - idirection_abs * dist - M_PI;
trans_airblob->direction_abs = direction_present_abs - idirection_abs * dist - G_PI;
}
}
else
{
if ((direction_present_abs + idirection_abs * dist) > 2 * M_PI)
if ((direction_present_abs + idirection_abs * dist) > 2 * G_PI)
{
trans_airblob->direction_abs = direction_present_abs + idirection_abs * dist - 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_present_abs + idirection_abs * dist - 2 * G_PI - G_PI;
}
else if ((direction_present_abs + idirection_abs * dist) < 0.0)
{
trans_airblob->direction_abs = direction_present_abs + idirection_abs * dist + 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_present_abs + idirection_abs * dist + 2 * G_PI - G_PI;
}
else
{
trans_airblob->direction_abs = direction_present_abs + idirection_abs * dist - M_PI;
trans_airblob->direction_abs = direction_present_abs + idirection_abs * dist - G_PI;
}
}
@ -1769,19 +1763,19 @@ trans_air_blob(AirBlob *airblob_last, AirBlob *airblob_present, double dist, int
}
else if (fabs(idirection_abs) < (M_PI - 0.1571))
else if (fabs(idirection_abs) < (G_PI - 0.1571))
{
if ((direction_last_abs + idirection_abs * dist) > 2*M_PI)
if ((direction_last_abs + idirection_abs * dist) > 2*G_PI)
{
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - 2 * G_PI - G_PI;
}
else if((direction_last_abs + idirection_abs * dist) < 0.0)
{
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist + 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist + 2 * G_PI - G_PI;
}
else
{
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - M_PI;
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - G_PI;
}
trans_airblob->main_line.size = main_line_last + ((main_line_present - main_line_last) * dist);
@ -1798,19 +1792,19 @@ trans_air_blob(AirBlob *airblob_last, AirBlob *airblob_present, double dist, int
/* We asume that the artist always travels the shortest way around the "clock" */
idirection_abs = idirection_abs - M_PI;
idirection_abs = idirection_abs - G_PI;
if ((direction_last_abs + idirection_abs * dist) > 2*M_PI)
if ((direction_last_abs + idirection_abs * dist) > 2*G_PI)
{
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - 2 * G_PI - G_PI;
}
else if((direction_last_abs + idirection_abs * dist) < 0.0)
{
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist + 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist + 2 * G_PI - G_PI;
}
else
{
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - M_PI;
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - G_PI;
}
trans_airblob->main_line.size = main_line_last + ((main_line_present - main_line_last) * dist);

File diff suppressed because it is too large Load diff

View file

@ -15,9 +15,8 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __FILE_OPS_H__
#define __FILE_OPS_H__
#ifndef __FILEOPS_H__
#define __FILEOPS_H__
#include <gtk/gtk.h>
@ -31,28 +30,34 @@
void file_ops_pre_init (void);
void file_ops_post_init (void);
void file_open_callback (GtkWidget *w,
gpointer client_data);
void file_save_callback (GtkWidget *w,
gpointer client_data);
void file_save_as_callback (GtkWidget *w,
gpointer client_data);
void file_revert_callback (GtkWidget *w,
gpointer client_data);
void file_load_by_extension_callback (GtkWidget *w,
gpointer client_data);
void file_save_by_extension_callback (GtkWidget *w,
gpointer client_data);
int file_open (char *filename,
char *raw_filename);
int file_save (GimpImage* gimage,
char *filename,
char *raw_filename,
gint mode);
PlugInProcDef* file_proc_find (GSList *procs,
char *filename);
void file_open_callback (GtkWidget *widget,
gpointer data);
void file_save_callback (GtkWidget *widget,
gpointer data);
void file_save_as_callback (GtkWidget *widget,
gpointer data);
void file_revert_callback (GtkWidget *widget,
gpointer data);
void file_open_by_extension_callback (GtkWidget *widget,
gpointer data);
void file_save_by_extension_callback (GtkWidget *widget,
gpointer data);
gint file_open (gchar *filename,
gchar *raw_filename);
gint file_save (GimpImage *gimage,
gchar *filename,
gchar *raw_filename,
RunModeType mode);
PlugInProcDef * file_proc_find (GSList *procs,
gchar *filename);
extern GSList *load_procs;
extern GSList *save_procs;
#endif /* FILE_OPS_H */
#endif /* __FILEOPS_H__ */

View file

@ -652,7 +652,7 @@ static GtkItemFactory *image_factory = NULL;
static GimpItemFactoryEntry load_entries[] =
{
{ { N_("/Automatic"), NULL, file_load_by_extension_callback, 0 },
{ { N_("/Automatic"), NULL, file_open_by_extension_callback, 0 },
"open_by_extension.html", NULL },
{ { "/---", NULL, NULL, 0, "<Separator>" },
@ -666,7 +666,7 @@ static GtkItemFactory *load_factory = NULL;
static GimpItemFactoryEntry save_entries[] =
{
{ { N_("/By extension"), NULL, file_save_by_extension_callback, 0 },
{ { N_("/By Extension"), NULL, file_save_by_extension_callback, 0 },
"save_by_extension.html", NULL },
{ { "/---", NULL, NULL, 0, "<Separator>" },
@ -1293,16 +1293,23 @@ menus_last_opened_cmd_callback (GtkWidget *widget,
{
gchar *filename, *raw_filename;
guint num_entries;
gint status;
num_entries = g_slist_length (last_opened_raw_filenames);
if (num >= num_entries)
return;
raw_filename = ((GString *) g_slist_nth_data (last_opened_raw_filenames, num))->str;
raw_filename =
((GString *) g_slist_nth_data (last_opened_raw_filenames, num))->str;
filename = g_basename (raw_filename);
if (!file_open (raw_filename, raw_filename))
g_message (_("Error opening file: %s\n"), raw_filename);
status = file_open (raw_filename, raw_filename);
if (status != PDB_SUCCESS &&
status != PDB_CANCEL)
{
g_message (_("Error opening file: %s\n"), raw_filename);
}
}
static void

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -652,7 +652,7 @@ static GtkItemFactory *image_factory = NULL;
static GimpItemFactoryEntry load_entries[] =
{
{ { N_("/Automatic"), NULL, file_load_by_extension_callback, 0 },
{ { N_("/Automatic"), NULL, file_open_by_extension_callback, 0 },
"open_by_extension.html", NULL },
{ { "/---", NULL, NULL, 0, "<Separator>" },
@ -666,7 +666,7 @@ static GtkItemFactory *load_factory = NULL;
static GimpItemFactoryEntry save_entries[] =
{
{ { N_("/By extension"), NULL, file_save_by_extension_callback, 0 },
{ { N_("/By Extension"), NULL, file_save_by_extension_callback, 0 },
"save_by_extension.html", NULL },
{ { "/---", NULL, NULL, 0, "<Separator>" },
@ -1293,16 +1293,23 @@ menus_last_opened_cmd_callback (GtkWidget *widget,
{
gchar *filename, *raw_filename;
guint num_entries;
gint status;
num_entries = g_slist_length (last_opened_raw_filenames);
if (num >= num_entries)
return;
raw_filename = ((GString *) g_slist_nth_data (last_opened_raw_filenames, num))->str;
raw_filename =
((GString *) g_slist_nth_data (last_opened_raw_filenames, num))->str;
filename = g_basename (raw_filename);
if (!file_open (raw_filename, raw_filename))
g_message (_("Error opening file: %s\n"), raw_filename);
status = file_open (raw_filename, raw_filename);
if (status != PDB_SUCCESS &&
status != PDB_CANCEL)
{
g_message (_("Error opening file: %s\n"), raw_filename);
}
}
static void

View file

@ -652,7 +652,7 @@ static GtkItemFactory *image_factory = NULL;
static GimpItemFactoryEntry load_entries[] =
{
{ { N_("/Automatic"), NULL, file_load_by_extension_callback, 0 },
{ { N_("/Automatic"), NULL, file_open_by_extension_callback, 0 },
"open_by_extension.html", NULL },
{ { "/---", NULL, NULL, 0, "<Separator>" },
@ -666,7 +666,7 @@ static GtkItemFactory *load_factory = NULL;
static GimpItemFactoryEntry save_entries[] =
{
{ { N_("/By extension"), NULL, file_save_by_extension_callback, 0 },
{ { N_("/By Extension"), NULL, file_save_by_extension_callback, 0 },
"save_by_extension.html", NULL },
{ { "/---", NULL, NULL, 0, "<Separator>" },
@ -1293,16 +1293,23 @@ menus_last_opened_cmd_callback (GtkWidget *widget,
{
gchar *filename, *raw_filename;
guint num_entries;
gint status;
num_entries = g_slist_length (last_opened_raw_filenames);
if (num >= num_entries)
return;
raw_filename = ((GString *) g_slist_nth_data (last_opened_raw_filenames, num))->str;
raw_filename =
((GString *) g_slist_nth_data (last_opened_raw_filenames, num))->str;
filename = g_basename (raw_filename);
if (!file_open (raw_filename, raw_filename))
g_message (_("Error opening file: %s\n"), raw_filename);
status = file_open (raw_filename, raw_filename);
if (status != PDB_SUCCESS &&
status != PDB_CANCEL)
{
g_message (_("Error opening file: %s\n"), raw_filename);
}
}
static void

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -1602,7 +1602,7 @@ plug_in_handle_proc_run (GPProcRun *proc_run)
* dummy "executiuon error" return value --Michael
*/
return_vals = g_new (Argument, 1);
return_vals[0].arg_type = PDB_INT32;
return_vals[0].arg_type = PDB_STATUS;
return_vals[0].value.pdb_int = PDB_EXECUTION_ERROR;
}

View file

@ -56,7 +56,8 @@ typedef enum
PDB_EXECUTION_ERROR,
PDB_CALLING_ERROR,
PDB_PASS_THROUGH,
PDB_SUCCESS
PDB_SUCCESS,
PDB_CANCEL
} PDBStatusType;

View file

@ -21,25 +21,19 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "airbrush_blob.h"
#include <glib.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libgimp/gimpmath.h>
#include "airbrush_blob.h"
#define ROUND(A) floor((A)+0.5)
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif /* M_PI */
#ifndef M_PI_H
#define M_PI_H 3.14159265358979323846/2
#endif
#define SUBSAMPLE 8.0
#define SU 8.0
@ -529,7 +523,7 @@ airbrush_blob_ellipse (double xc, double yc, double xt, double yt, double xr, do
ma_ang1 = atan(yt/xr);
x1 = cos(ma_ang1) * xl;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xr;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -554,7 +548,7 @@ airbrush_blob_ellipse (double xc, double yc, double xt, double yt, double xr, do
ma_ang1 = atan(yt/xl);
x1 = cos(ma_ang1) * xr;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xl;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -579,7 +573,7 @@ airbrush_blob_ellipse (double xc, double yc, double xt, double yt, double xr, do
ma_ang1 = atan(yb/xl);
x1 = cos(ma_ang1) * xl;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xr;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -605,7 +599,7 @@ airbrush_blob_ellipse (double xc, double yc, double xt, double yt, double xr, do
ma_ang1 = atan(yb/xr);
x1 = cos(ma_ang1) * xr;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xl;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -636,7 +630,7 @@ airbrush_blob_ellipse (double xc, double yc, double xt, double yt, double xr, do
{
trig_initialized = 1;
for (i=0; i<256; i++)
trig_table[i] = 0.5 + sin(i * (M_PI / 128.)) * (1 << TABLE_SHIFT);
trig_table[i] = 0.5 + sin(i * (G_PI / 128.0)) * (1 << TABLE_SHIFT);
}
@ -977,7 +971,7 @@ create_air_blob (double xc,
air_blob->minorcross_line.size = yt * 2;
air_blob->minorcross_line.dist = 0.0;
air_blob->direction = M_PI_H;
air_blob->direction = G_PI_2;
}
else if (xr == xl)
@ -1105,7 +1099,7 @@ create_air_blob (double xc,
ma_ang1 = atan(yt/xr);
x1 = cos(ma_ang1) * xl;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xr;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -1144,7 +1138,7 @@ create_air_blob (double xc,
ma_ang1 = atan(yt/xl);
x1 = cos(ma_ang1) * xr;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xl;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -1178,7 +1172,7 @@ create_air_blob (double xc,
ma_ang1 = atan(yb/xl);
x1 = cos(ma_ang1) * xl;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xr;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -1216,7 +1210,7 @@ create_air_blob (double xc,
ma_ang1 = atan(yb/xr);
x1 = cos(ma_ang1) * xr;
y1 = sin(ma_ang1) * yt;
ma_ang2 = M_PI/2 - ma_ang1;
ma_ang2 = G_PI_2 - ma_ang1;
x2 = cos(ma_ang2) * xl;
y2 = sin(ma_ang2) * yb;
xtotma = x1 + x2;
@ -1292,12 +1286,12 @@ create_air_line(AirBlob *airblob)
printf("Mi.size: %f\n",airblob->minor_line.size);
*/
if (direction == M_PI_H || direction == M_PI)
if (direction == G_PI_2 || direction == G_PI)
{
direction = direction - 0.001;
}
if (direction == -M_PI_H || direction == -M_PI)
if (direction == -G_PI_2 || direction == -G_PI)
{
direction = direction + 0.001;
}
@ -1326,7 +1320,7 @@ create_air_line(AirBlob *airblob)
}
else if(direction == M_PI_H)
else if(direction == G_PI_2)
{
@ -1346,12 +1340,12 @@ create_air_line(AirBlob *airblob)
airline->line[5].y = (ycenter + airblob->minorcross_line.size/2)/SUBSAMPLE;
airline->nlines = 6;
printf("Hmm bummer M_PI_H\n");
printf("Hmm bummer G_PI_2\n");
}
else if(direction == M_PI)
else if(direction == G_PI)
{
airline->line[0].x = (xcenter - airblob->maincross_line.dist)/SUBSAMPLE;
@ -1371,12 +1365,12 @@ create_air_line(AirBlob *airblob)
airline->nlines = 6;
printf("Hmm bummer M_PI\n");
printf("Hmm bummer G_PI\n");
}
else if(direction == -M_PI_H)
else if(direction == -G_PI_2)
{
airline->line[0].x = (xcenter - airblob->maincross_line.dist)/SUBSAMPLE;
@ -1396,14 +1390,14 @@ create_air_line(AirBlob *airblob)
airline->nlines = 6;
printf("Hmm bummer -M_PI_H\n");
printf("Hmm bummer -G_PI_2\n");
}
else if(direction == -M_PI)
else if(direction == -G_PI)
{
airline->line[0].x = (xcenter - airblob->maincross_line.dist)/SUBSAMPLE;
@ -1423,13 +1417,13 @@ create_air_line(AirBlob *airblob)
airline->nlines = 6;
printf("Hmm bummer -M_PI\n");
printf("Hmm bummer -G_PI\n");
}
else if ((direction < M_PI) && (direction > M_PI_H))
else if ((direction < G_PI) && (direction > G_PI_2))
{
@ -1440,7 +1434,7 @@ create_air_line(AirBlob *airblob)
ma_angsupport = atan(airblob->maincross_line.size/2/airblob->maincross_line.dist);
mi_angsupport = atan(airblob->minorcross_line.size/2/airblob->minorcross_line.dist);
iang = airblob->direction_abs - M_PI_H;
iang = airblob->direction_abs - G_PI_2;
airline->line[0].x = (xcenter - sin(iang + ma_angsupport) * masupport)/SUBSAMPLE;
airline->line[0].y = (ycenter - cos(iang + ma_angsupport) * masupport)/SUBSAMPLE;
@ -1477,7 +1471,7 @@ create_air_line(AirBlob *airblob)
}
else if ((direction < M_PI_H) && (direction > 0.0))
else if ((direction < G_PI_2) && (direction > 0.0))
{
@ -1535,7 +1529,7 @@ create_air_line(AirBlob *airblob)
}
else if ((direction < 0.0) && (direction > -M_PI_H))
else if ((direction < 0.0) && (direction > -G_PI_2))
{
@ -1568,7 +1562,7 @@ create_air_line(AirBlob *airblob)
}
else if ((direction < -M_PI_H) && (direction > -M_PI))
else if ((direction < -G_PI_2) && (direction > -G_PI))
{
@ -1579,7 +1573,7 @@ create_air_line(AirBlob *airblob)
ma_angsupport = atan(airblob->maincross_line.size/2/airblob->maincross_line.dist);
mi_angsupport = atan(airblob->minorcross_line.size/2/airblob->minorcross_line.dist);
iang = fabs(airblob->direction_abs) - M_PI_H;
iang = fabs(airblob->direction_abs) - G_PI_2;
airline->line[0].x = (xcenter - sin(iang + ma_angsupport) * masupport)/SUBSAMPLE;
airline->line[0].y = (ycenter + cos(iang + ma_angsupport) * masupport)/SUBSAMPLE;
@ -1675,13 +1669,13 @@ trans_air_blob(AirBlob *airblob_last, AirBlob *airblob_present, double dist, int
trans_airblob = airblob_new(1);
direction_last_abs = airblob_last->direction_abs + M_PI;
direction_present_abs = airblob_present->direction_abs + M_PI;
direction_last_abs = airblob_last->direction_abs + G_PI;
direction_present_abs = airblob_present->direction_abs + G_PI;
idirection_abs = direction_present_abs - direction_last_abs;
direction_last = airblob_last->direction + M_PI_H;
direction_present = airblob_present->direction + M_PI_H;
direction_last = airblob_last->direction + G_PI_2;
direction_present = airblob_present->direction + G_PI_2;
idirection = direction_present - direction_last;
@ -1709,7 +1703,7 @@ trans_air_blob(AirBlob *airblob_last, AirBlob *airblob_present, double dist, int
Well we can't know if the users is painting
up/down or if she is painting a circle at high speed.
As you may notice it be so that the last airblob has
a direction more or less M_PI rad differernt from the
a direction more or less G_PI rad differernt from the
present airblob. But we can't know if she tured the
airbrush quickly (so that there was no mouse capture
during the turn) or if she paints just up and down the
@ -1721,40 +1715,40 @@ trans_air_blob(AirBlob *airblob_last, AirBlob *airblob_present, double dist, int
*/
if ((fabs(idirection_abs) > (M_PI - 0.1571)) && (fabs(idirection_abs) < (M_PI + 0.1571)))
if ((fabs(idirection_abs) > (G_PI - 0.1571)) && (fabs(idirection_abs) < (G_PI + 0.1571)))
{
/* We asume that the artist meant to paint in a "strait line" by just tilting the airbrush*/
idirection_abs = idirection_abs - M_PI;
idirection_abs = idirection_abs - G_PI;
if ((idirection_abs * dist) > (idirection_abs/2))
{
if ((direction_present_abs - idirection_abs * dist) > 2 * M_PI)
if ((direction_present_abs - idirection_abs * dist) > 2 * G_PI)
{
trans_airblob->direction_abs = direction_present_abs - idirection_abs * dist - 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_present_abs - idirection_abs * dist - 2 * G_PI - G_PI;
}
else if ((direction_present_abs - idirection_abs * dist) < 0.0)
{
trans_airblob->direction_abs = direction_present_abs - idirection_abs * dist + 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_present_abs - idirection_abs * dist + 2 * G_PI - G_PI;
}
else
{
trans_airblob->direction_abs = direction_present_abs - idirection_abs * dist - M_PI;
trans_airblob->direction_abs = direction_present_abs - idirection_abs * dist - G_PI;
}
}
else
{
if ((direction_present_abs + idirection_abs * dist) > 2 * M_PI)
if ((direction_present_abs + idirection_abs * dist) > 2 * G_PI)
{
trans_airblob->direction_abs = direction_present_abs + idirection_abs * dist - 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_present_abs + idirection_abs * dist - 2 * G_PI - G_PI;
}
else if ((direction_present_abs + idirection_abs * dist) < 0.0)
{
trans_airblob->direction_abs = direction_present_abs + idirection_abs * dist + 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_present_abs + idirection_abs * dist + 2 * G_PI - G_PI;
}
else
{
trans_airblob->direction_abs = direction_present_abs + idirection_abs * dist - M_PI;
trans_airblob->direction_abs = direction_present_abs + idirection_abs * dist - G_PI;
}
}
@ -1769,19 +1763,19 @@ trans_air_blob(AirBlob *airblob_last, AirBlob *airblob_present, double dist, int
}
else if (fabs(idirection_abs) < (M_PI - 0.1571))
else if (fabs(idirection_abs) < (G_PI - 0.1571))
{
if ((direction_last_abs + idirection_abs * dist) > 2*M_PI)
if ((direction_last_abs + idirection_abs * dist) > 2*G_PI)
{
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - 2 * G_PI - G_PI;
}
else if((direction_last_abs + idirection_abs * dist) < 0.0)
{
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist + 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist + 2 * G_PI - G_PI;
}
else
{
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - M_PI;
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - G_PI;
}
trans_airblob->main_line.size = main_line_last + ((main_line_present - main_line_last) * dist);
@ -1798,19 +1792,19 @@ trans_air_blob(AirBlob *airblob_last, AirBlob *airblob_present, double dist, int
/* We asume that the artist always travels the shortest way around the "clock" */
idirection_abs = idirection_abs - M_PI;
idirection_abs = idirection_abs - G_PI;
if ((direction_last_abs + idirection_abs * dist) > 2*M_PI)
if ((direction_last_abs + idirection_abs * dist) > 2*G_PI)
{
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - 2 * G_PI - G_PI;
}
else if((direction_last_abs + idirection_abs * dist) < 0.0)
{
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist + 2 * M_PI - M_PI;
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist + 2 * G_PI - G_PI;
}
else
{
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - M_PI;
trans_airblob->direction_abs = direction_last_abs + idirection_abs * dist - G_PI;
}
trans_airblob->main_line.size = main_line_last + ((main_line_present - main_line_last) * dist);

View file

@ -652,7 +652,7 @@ static GtkItemFactory *image_factory = NULL;
static GimpItemFactoryEntry load_entries[] =
{
{ { N_("/Automatic"), NULL, file_load_by_extension_callback, 0 },
{ { N_("/Automatic"), NULL, file_open_by_extension_callback, 0 },
"open_by_extension.html", NULL },
{ { "/---", NULL, NULL, 0, "<Separator>" },
@ -666,7 +666,7 @@ static GtkItemFactory *load_factory = NULL;
static GimpItemFactoryEntry save_entries[] =
{
{ { N_("/By extension"), NULL, file_save_by_extension_callback, 0 },
{ { N_("/By Extension"), NULL, file_save_by_extension_callback, 0 },
"save_by_extension.html", NULL },
{ { "/---", NULL, NULL, 0, "<Separator>" },
@ -1293,16 +1293,23 @@ menus_last_opened_cmd_callback (GtkWidget *widget,
{
gchar *filename, *raw_filename;
guint num_entries;
gint status;
num_entries = g_slist_length (last_opened_raw_filenames);
if (num >= num_entries)
return;
raw_filename = ((GString *) g_slist_nth_data (last_opened_raw_filenames, num))->str;
raw_filename =
((GString *) g_slist_nth_data (last_opened_raw_filenames, num))->str;
filename = g_basename (raw_filename);
if (!file_open (raw_filename, raw_filename))
g_message (_("Error opening file: %s\n"), raw_filename);
status = file_open (raw_filename, raw_filename);
if (status != PDB_SUCCESS &&
status != PDB_CANCEL)
{
g_message (_("Error opening file: %s\n"), raw_filename);
}
}
static void

View file

@ -692,7 +692,6 @@ plug-ins/Makefile
plug-ins/perl/config.pl
plug-ins/libgck/Makefile
plug-ins/libgck/gck/Makefile
plug-ins/megawidget/Makefile
plug-ins/dbbrowser/Makefile
plug-ins/script-fu/Makefile
plug-ins/script-fu/scripts/Makefile

View file

@ -295,7 +295,8 @@ typedef enum
GIMP_PDB_EXECUTION_ERROR,
GIMP_PDB_CALLING_ERROR,
GIMP_PDB_PASS_THROUGH,
GIMP_PDB_SUCCESS
GIMP_PDB_SUCCESS,
GIMP_PDB_CANCEL
} GimpPDBStatusType;
typedef enum
@ -373,6 +374,7 @@ typedef GimpPDBStatusType GStatusType;
#define STATUS_CALLING_ERROR GIMP_PDB_CALLING_ERROR
#define STATUS_PASS_THROUGH GIMP_PDB_PASS_THROUGH
#define STATUS_SUCCESS GIMP_PDB_SUCCESS
#define STATUS_CANCEL GIMP_PDB_CANCEL
#define PROC_INTERNAL GIMP_INTERNAL
#define PROC_PLUG_IN GIMP_PLUGIN

View file

@ -17,7 +17,6 @@
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GIMPMATH_H__
#define __GIMPMATH_H__
@ -46,6 +45,12 @@ extern "C" {
#define G_SQRT2 1.4142135623730951
#endif
#ifndef RAND_MAX
#define G_MAXRAND G_MAXINT
#else
#define G_MAXRAND RAND_MAX
#endif
/* Use RINT() instead of rint() */
#ifdef HAVE_RINT
#define RINT(x) rint(x)

View file

@ -23,6 +23,16 @@
#include "gimphelpui.h"
#include "gimpunitmenu.h"
#include "gimpwidgets.h"
#include "gimpmath.h"
#include "gimpintl.h"
/*
* Forward declarations
*/
static void gimp_toggle_button_sensitive_update (GtkToggleButton *toggle_button);
/*
* Widget Constructors...
@ -65,7 +75,11 @@ gimp_option_menu_new (GtkSignalFunc menu_item_callback,
user_data = va_arg (args, gpointer);
widget_ptr = va_arg (args, gpointer);
menuitem = gtk_menu_item_new_with_label (label);
if (label != (gpointer) 1)
menuitem = gtk_menu_item_new_with_label (label);
else
menuitem = gtk_menu_item_new ();
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
menu_item_callback,
@ -149,7 +163,11 @@ gimp_radio_group_new (gboolean in_frame,
widget_ptr = va_arg (args, gpointer);
active = va_arg (args, gboolean);
button = gtk_radio_button_new_with_label (group, label);
if (label != (gpointer) 1)
button = gtk_radio_button_new_with_label (group, label);
else
button = gtk_radio_button_new (group);
group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
@ -225,7 +243,11 @@ gimp_radio_group_new2 (gboolean in_frame,
user_data = va_arg (args, gpointer);
widget_ptr = va_arg (args, gpointer);
button = gtk_radio_button_new_with_label (group, label);
if (label != (gpointer) 1)
button = gtk_radio_button_new_with_label (group, label);
else
button = gtk_radio_button_new (group);
group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
@ -338,43 +360,125 @@ gimp_scale_entry_new (GtkTable *table,
return adjustment;
}
static void
gimp_random_seed_toggle_update (GtkWidget *widget,
gpointer data)
{
gint *toggle_val;
toggle_val = (gint *) data;
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
*toggle_val = (gint) gtk_object_get_data (GTK_OBJECT (widget),
"time_true");
else
*toggle_val = (gint) gtk_object_get_data (GTK_OBJECT (widget),
"time_false");
gimp_toggle_button_sensitive_update (GTK_TOGGLE_BUTTON (widget));
}
GtkWidget *
gimp_random_seed_new (gint *seed,
gint *use_time,
gint time_true,
gint time_false)
{
GtkWidget *hbox;
GtkWidget *spinbutton;
GtkObject *adj;
GtkWidget *time_button;
hbox = gtk_hbox_new (FALSE, 4);
spinbutton = gimp_spin_button_new (&adj, *seed,
0, G_MAXRAND, 1, 10, 0, 1, 0);
gtk_box_pack_start (GTK_BOX (hbox), spinbutton, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
seed);
gtk_widget_show (spinbutton);
gimp_help_set_help_data (spinbutton,
_("If the \"Time\" button is not pressed, "
"use this value for random number generator "
"seed - this allows you to repeat a "
"given \"random\" operation"), NULL);
time_button = gtk_toggle_button_new_with_label (_("Time"));
gtk_misc_set_padding (GTK_MISC (GTK_BIN (time_button)->child), 2, 0);
gtk_signal_connect (GTK_OBJECT (time_button), "toggled",
GTK_SIGNAL_FUNC (gimp_random_seed_toggle_update),
use_time);
gtk_box_pack_end (GTK_BOX (hbox), time_button, FALSE, FALSE, 0);
gtk_widget_show (time_button);
gimp_help_set_help_data (time_button,
_("Seed random number generator from the current "
"time - this guarantees a reasonable "
"randomization"), NULL);
gtk_object_set_data (GTK_OBJECT (time_button), "time_true",
(gpointer) time_true);
gtk_object_set_data (GTK_OBJECT (time_button), "time_false",
(gpointer) time_false);
gtk_object_set_data (GTK_OBJECT (time_button), "inverse_sensitive",
spinbutton);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (time_button),
*use_time == time_true);
return hbox;
}
/*
* Standard Callbacks...
*/
void
gimp_toggle_button_update (GtkWidget *widget,
gpointer data)
static void
gimp_toggle_button_sensitive_update (GtkToggleButton *toggle_button)
{
GtkWidget *set_sensitive;
gint *toggle_val;
gboolean active;
toggle_val = (gint *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
active = gtk_toggle_button_get_active (toggle_button);
set_sensitive =
gtk_object_get_data (GTK_OBJECT (widget), "set_sensitive");
gtk_object_get_data (GTK_OBJECT (toggle_button), "set_sensitive");
while (set_sensitive)
{
gtk_widget_set_sensitive (GTK_WIDGET (set_sensitive), *toggle_val);
gtk_widget_set_sensitive (GTK_WIDGET (set_sensitive), active);
set_sensitive =
gtk_object_get_data (GTK_OBJECT (set_sensitive), "set_sensitive");
}
set_sensitive =
gtk_object_get_data (GTK_OBJECT (widget), "inverse_sensitive");
gtk_object_get_data (GTK_OBJECT (toggle_button), "inverse_sensitive");
while (set_sensitive)
{
gtk_widget_set_sensitive (GTK_WIDGET (set_sensitive), ! *toggle_val);
gtk_widget_set_sensitive (GTK_WIDGET (set_sensitive), ! active);
set_sensitive =
gtk_object_get_data (GTK_OBJECT (set_sensitive), "inverse_sensitive");
}
}
void
gimp_toggle_button_update (GtkWidget *widget,
gpointer data)
{
gint *toggle_val;
toggle_val = (gint *) data;
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
*toggle_val = TRUE;
else
*toggle_val = FALSE;
gimp_toggle_button_sensitive_update (GTK_TOGGLE_BUTTON (widget));
}
void
gimp_menu_item_update (GtkWidget *widget,
gpointer data)
@ -392,12 +496,14 @@ gimp_radio_button_update (GtkWidget *widget,
{
gint *toggle_val;
if (GTK_TOGGLE_BUTTON (widget)->active)
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
{
toggle_val = (gint *) data;
*toggle_val = (gint) gtk_object_get_user_data (GTK_OBJECT (widget));
}
gimp_toggle_button_sensitive_update (GTK_TOGGLE_BUTTON (widget));
}
void
@ -485,7 +591,8 @@ gimp_table_attach_aligned (GtkTable *table,
GtkWidget *alignment;
alignment = gtk_alignment_new (0.0, 0.5, 0.0, 0.0);
gtk_table_attach_defaults (table, alignment, 1, 2, row, row + 1);
gtk_table_attach (table, alignment, 1, 2, row, row + 1,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (alignment);
gtk_container_add (GTK_CONTAINER (alignment), widget);
}

View file

@ -99,6 +99,11 @@ GtkObject * gimp_scale_entry_new (GtkTable *table,
gchar *tooltip,
gchar *private_tip);
GtkWidget * gimp_random_seed_new (gint *seed,
gint *use_time,
gint time_true,
gint time_false);
/*
* Standard Callbacks
*/

View file

@ -23,6 +23,16 @@
#include "gimphelpui.h"
#include "gimpunitmenu.h"
#include "gimpwidgets.h"
#include "gimpmath.h"
#include "gimpintl.h"
/*
* Forward declarations
*/
static void gimp_toggle_button_sensitive_update (GtkToggleButton *toggle_button);
/*
* Widget Constructors...
@ -65,7 +75,11 @@ gimp_option_menu_new (GtkSignalFunc menu_item_callback,
user_data = va_arg (args, gpointer);
widget_ptr = va_arg (args, gpointer);
menuitem = gtk_menu_item_new_with_label (label);
if (label != (gpointer) 1)
menuitem = gtk_menu_item_new_with_label (label);
else
menuitem = gtk_menu_item_new ();
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
menu_item_callback,
@ -149,7 +163,11 @@ gimp_radio_group_new (gboolean in_frame,
widget_ptr = va_arg (args, gpointer);
active = va_arg (args, gboolean);
button = gtk_radio_button_new_with_label (group, label);
if (label != (gpointer) 1)
button = gtk_radio_button_new_with_label (group, label);
else
button = gtk_radio_button_new (group);
group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
@ -225,7 +243,11 @@ gimp_radio_group_new2 (gboolean in_frame,
user_data = va_arg (args, gpointer);
widget_ptr = va_arg (args, gpointer);
button = gtk_radio_button_new_with_label (group, label);
if (label != (gpointer) 1)
button = gtk_radio_button_new_with_label (group, label);
else
button = gtk_radio_button_new (group);
group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
@ -338,43 +360,125 @@ gimp_scale_entry_new (GtkTable *table,
return adjustment;
}
static void
gimp_random_seed_toggle_update (GtkWidget *widget,
gpointer data)
{
gint *toggle_val;
toggle_val = (gint *) data;
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
*toggle_val = (gint) gtk_object_get_data (GTK_OBJECT (widget),
"time_true");
else
*toggle_val = (gint) gtk_object_get_data (GTK_OBJECT (widget),
"time_false");
gimp_toggle_button_sensitive_update (GTK_TOGGLE_BUTTON (widget));
}
GtkWidget *
gimp_random_seed_new (gint *seed,
gint *use_time,
gint time_true,
gint time_false)
{
GtkWidget *hbox;
GtkWidget *spinbutton;
GtkObject *adj;
GtkWidget *time_button;
hbox = gtk_hbox_new (FALSE, 4);
spinbutton = gimp_spin_button_new (&adj, *seed,
0, G_MAXRAND, 1, 10, 0, 1, 0);
gtk_box_pack_start (GTK_BOX (hbox), spinbutton, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
seed);
gtk_widget_show (spinbutton);
gimp_help_set_help_data (spinbutton,
_("If the \"Time\" button is not pressed, "
"use this value for random number generator "
"seed - this allows you to repeat a "
"given \"random\" operation"), NULL);
time_button = gtk_toggle_button_new_with_label (_("Time"));
gtk_misc_set_padding (GTK_MISC (GTK_BIN (time_button)->child), 2, 0);
gtk_signal_connect (GTK_OBJECT (time_button), "toggled",
GTK_SIGNAL_FUNC (gimp_random_seed_toggle_update),
use_time);
gtk_box_pack_end (GTK_BOX (hbox), time_button, FALSE, FALSE, 0);
gtk_widget_show (time_button);
gimp_help_set_help_data (time_button,
_("Seed random number generator from the current "
"time - this guarantees a reasonable "
"randomization"), NULL);
gtk_object_set_data (GTK_OBJECT (time_button), "time_true",
(gpointer) time_true);
gtk_object_set_data (GTK_OBJECT (time_button), "time_false",
(gpointer) time_false);
gtk_object_set_data (GTK_OBJECT (time_button), "inverse_sensitive",
spinbutton);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (time_button),
*use_time == time_true);
return hbox;
}
/*
* Standard Callbacks...
*/
void
gimp_toggle_button_update (GtkWidget *widget,
gpointer data)
static void
gimp_toggle_button_sensitive_update (GtkToggleButton *toggle_button)
{
GtkWidget *set_sensitive;
gint *toggle_val;
gboolean active;
toggle_val = (gint *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
active = gtk_toggle_button_get_active (toggle_button);
set_sensitive =
gtk_object_get_data (GTK_OBJECT (widget), "set_sensitive");
gtk_object_get_data (GTK_OBJECT (toggle_button), "set_sensitive");
while (set_sensitive)
{
gtk_widget_set_sensitive (GTK_WIDGET (set_sensitive), *toggle_val);
gtk_widget_set_sensitive (GTK_WIDGET (set_sensitive), active);
set_sensitive =
gtk_object_get_data (GTK_OBJECT (set_sensitive), "set_sensitive");
}
set_sensitive =
gtk_object_get_data (GTK_OBJECT (widget), "inverse_sensitive");
gtk_object_get_data (GTK_OBJECT (toggle_button), "inverse_sensitive");
while (set_sensitive)
{
gtk_widget_set_sensitive (GTK_WIDGET (set_sensitive), ! *toggle_val);
gtk_widget_set_sensitive (GTK_WIDGET (set_sensitive), ! active);
set_sensitive =
gtk_object_get_data (GTK_OBJECT (set_sensitive), "inverse_sensitive");
}
}
void
gimp_toggle_button_update (GtkWidget *widget,
gpointer data)
{
gint *toggle_val;
toggle_val = (gint *) data;
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
*toggle_val = TRUE;
else
*toggle_val = FALSE;
gimp_toggle_button_sensitive_update (GTK_TOGGLE_BUTTON (widget));
}
void
gimp_menu_item_update (GtkWidget *widget,
gpointer data)
@ -392,12 +496,14 @@ gimp_radio_button_update (GtkWidget *widget,
{
gint *toggle_val;
if (GTK_TOGGLE_BUTTON (widget)->active)
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
{
toggle_val = (gint *) data;
*toggle_val = (gint) gtk_object_get_user_data (GTK_OBJECT (widget));
}
gimp_toggle_button_sensitive_update (GTK_TOGGLE_BUTTON (widget));
}
void
@ -485,7 +591,8 @@ gimp_table_attach_aligned (GtkTable *table,
GtkWidget *alignment;
alignment = gtk_alignment_new (0.0, 0.5, 0.0, 0.0);
gtk_table_attach_defaults (table, alignment, 1, 2, row, row + 1);
gtk_table_attach (table, alignment, 1, 2, row, row + 1,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (alignment);
gtk_container_add (GTK_CONTAINER (alignment), widget);
}

View file

@ -99,6 +99,11 @@ GtkObject * gimp_scale_entry_new (GtkTable *table,
gchar *tooltip,
gchar *private_tip);
GtkWidget * gimp_random_seed_new (gint *seed,
gint *use_time,
gint time_true,
gint time_false);
/*
* Standard Callbacks
*/

View file

@ -23,18 +23,17 @@
#include "config.h"
#include <stdio.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <libgimp/color_selector.h>
#include <libgimp/gimpintl.h>
#include <libgimp/gimpmodule.h>
#include <math.h>
#include <libgimp/gimpmath.h>
#include "modregister.h"
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
#include <libgimp/gimpintl.h>
/* prototypes */
static GtkWidget * colorsel_triangle_new (int, int, int,
@ -478,16 +477,16 @@ update_previews (ColorSelectP coldata,
gfloat hue, sat, val, s, v;
gint hx,hy, sx,sy, vx,vy;
hue = (float) coldata->values[HUE] * M_PI / 180;
hue = (float) coldata->values[HUE] * G_PI / 180;
hx = sin(hue) * COLORTRIANGLERADIUS;
hy = cos(hue) * COLORTRIANGLERADIUS;
sx = sin(hue - 2*M_PI/3) * COLORTRIANGLERADIUS;
sy = cos(hue - 2*M_PI/3) * COLORTRIANGLERADIUS;
sx = sin(hue - 2*G_PI/3) * COLORTRIANGLERADIUS;
sy = cos(hue - 2*G_PI/3) * COLORTRIANGLERADIUS;
vx = sin(hue + 2*M_PI/3) * COLORTRIANGLERADIUS;
vy = cos(hue + 2*M_PI/3) * COLORTRIANGLERADIUS;
vx = sin(hue + 2*G_PI/3) * COLORTRIANGLERADIUS;
vy = cos(hue + 2*G_PI/3) * COLORTRIANGLERADIUS;
hue = (float) coldata->values[HUE];
preview = coldata->preview;
@ -500,7 +499,7 @@ update_previews (ColorSelectP coldata,
r2 = (x*x)+(y*y);
if ( r2 <= COLORWHEELRADIUS * COLORWHEELRADIUS) {
if (r2 > COLORTRIANGLERADIUS * COLORTRIANGLERADIUS) {
color_hsv_to_rgb (atan2 (x,y) / M_PI * 180, 1, 1, &buf[k], &buf[k+1], &buf[k+2]);
color_hsv_to_rgb (atan2 (x,y) / G_PI * 180, 1, 1, &buf[k], &buf[k+1], &buf[k+2]);
} else {
val = (float) ((x-sx)*(hy-vy)-(y-sy)*(hx-vx)) / (float) ((vx-sx)*(hy-vy)-(vy-sy)*(hx-vx));
if (val>0 && val<=1) { /* eigentlich val>=0, aber dann Grafikfehler... */
@ -518,9 +517,9 @@ update_previews (ColorSelectP coldata,
/* Marker im aeusseren Ring */
x0 = (gint) (sin(hue*M_PI/180) * ((float) (COLORWHEELRADIUS - COLORTRIANGLERADIUS + 1)/2 + COLORTRIANGLERADIUS) + 0.5);
y0 = (gint) (cos(hue*M_PI/180) * ((float) (COLORWHEELRADIUS - COLORTRIANGLERADIUS + 1)/2 + COLORTRIANGLERADIUS) + 0.5);
color_hsv_to_rgb (atan2 (x0,y0) / M_PI * 180, 1, 1, &buf[0], &buf[1], &buf[2]);
x0 = (gint) (sin(hue*G_PI/180) * ((float) (COLORWHEELRADIUS - COLORTRIANGLERADIUS + 1)/2 + COLORTRIANGLERADIUS) + 0.5);
y0 = (gint) (cos(hue*G_PI/180) * ((float) (COLORWHEELRADIUS - COLORTRIANGLERADIUS + 1)/2 + COLORTRIANGLERADIUS) + 0.5);
color_hsv_to_rgb (atan2 (x0,y0) / G_PI * 180, 1, 1, &buf[0], &buf[1], &buf[2]);
col = INTENSITY(buf[0], buf[1], buf[2]) > 127 ? 0 : 255 ;
for (y = y0 - 4 ; y <= y0 + 4 ; y++) {
@ -529,7 +528,7 @@ update_previews (ColorSelectP coldata,
if (r2 <= 20 && r2 >= 6)
buf[k]=buf[k+1]=buf[k+2]=col;
else
color_hsv_to_rgb (atan2 (x,y) / M_PI * 180, 1, 1, &buf[k], &buf[k+1], &buf[k+2]);
color_hsv_to_rgb (atan2 (x,y) / G_PI * 180, 1, 1, &buf[k], &buf[k+1], &buf[k+2]);
k += 3;
}
gtk_preview_draw_row (GTK_PREVIEW (preview), buf, COLORWHEELRADIUS + x0-4, COLORWHEELRADIUS - 1 - y, 9);
@ -548,7 +547,7 @@ update_previews (ColorSelectP coldata,
buf[k]=buf[k+1]=buf[k+2]=BGCOLOR;
r2 = (x-x0)*(x-x0)+(y-y0)*(y-y0);
if (x*x+y*y > COLORTRIANGLERADIUS * COLORTRIANGLERADIUS) {
color_hsv_to_rgb (atan2 (x,y) / M_PI * 180, 1, 1, &buf[k], &buf[k+1], &buf[k+2]);
color_hsv_to_rgb (atan2 (x,y) / G_PI * 180, 1, 1, &buf[k], &buf[k+1], &buf[k+2]);
} else {
val = (float) ((x-sx)*(hy-vy)-(y-sy)*(hx-vx)) / (float) ((vx-sx)*(hy-vy)-(vy-sy)*(hx-vx));
if (val>0 && val<=1) { /* eigentlich val>=0, aber dann Grafikfehler... */
@ -585,7 +584,7 @@ update_previews (ColorSelectP coldata,
buf[k]=buf[k+1]=buf[k+2]=col;
else {
if (x*x+y*y > COLORTRIANGLERADIUS * COLORTRIANGLERADIUS) {
color_hsv_to_rgb (atan2 (x,y) / M_PI * 180, 1, 1, &buf[k], &buf[k+1], &buf[k+2]);
color_hsv_to_rgb (atan2 (x,y) / G_PI * 180, 1, 1, &buf[k], &buf[k+1], &buf[k+2]);
} else {
val = (float) ((x-sx)*(hy-vy)-(y-sy)*(hx-vx)) / (float) ((vx-sx)*(hy-vy)-(vy-sy)*(hx-vx));
if (val>0 && val<=1) { /* eigentlich val>=0, aber dann Grafikfehler... */
@ -663,18 +662,18 @@ color_selection_callback (GtkWidget *widget,
return FALSE;
if (coldata->mode == 1) {
coldata->values[HUE] = ( (int) (atan2 (x, y) / M_PI * 180) + 360 ) %360;
coldata->values[HUE] = ( (int) (atan2 (x, y) / G_PI * 180) + 360 ) %360;
color_select_update_rgb_values(coldata);
update_previews (coldata, TRUE);
}
if (coldata->mode == 2) {
hue = (float) coldata->values[HUE] * M_PI / 180;
hue = (float) coldata->values[HUE] * G_PI / 180;
hx = sin(hue) * COLORTRIANGLERADIUS;
hy = cos(hue) * COLORTRIANGLERADIUS;
sx = sin(hue - 2*M_PI/3) * COLORTRIANGLERADIUS;
sy = cos(hue - 2*M_PI/3) * COLORTRIANGLERADIUS;
vx = sin(hue + 2*M_PI/3) * COLORTRIANGLERADIUS;
vy = cos(hue + 2*M_PI/3) * COLORTRIANGLERADIUS;
sx = sin(hue - 2*G_PI/3) * COLORTRIANGLERADIUS;
sy = cos(hue - 2*G_PI/3) * COLORTRIANGLERADIUS;
vx = sin(hue + 2*G_PI/3) * COLORTRIANGLERADIUS;
vy = cos(hue + 2*G_PI/3) * COLORTRIANGLERADIUS;
hue = (float) coldata->values[HUE];
if ((x-sx)*vx+(y-sy)*vy < 0) {
sat = 1;

View file

@ -22,16 +22,16 @@
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <gtk/gtk.h>
#include <libgimp/color_selector.h>
#include <libgimp/gimpmodule.h>
#include <libgimp/gimpintl.h>
#include <libgimp/gimpmath.h>
#include "modregister.h"
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif /* M_PI */
#include <libgimp/gimpintl.h>
/* prototypes */
static GtkWidget * colorsel_water_new (int, int, int,
@ -164,8 +164,8 @@ calc (gdouble x, gdouble y, gdouble angle)
{
gdouble s, c;
s = 1.6 * sin (angle * M_PI / 180) * 256.0 / IMAGE_SIZE;
c = 1.6 * cos (angle * M_PI / 180) * 256.0 / IMAGE_SIZE;
s = 1.6 * sin (angle * G_PI / 180) * 256.0 / IMAGE_SIZE;
c = 1.6 * cos (angle * G_PI / 180) * 256.0 / IMAGE_SIZE;
return 128 + (x - (IMAGE_SIZE >> 1)) * c - (y - (IMAGE_SIZE >> 1)) * s;
}

View file

@ -29,7 +29,6 @@ endif
SUBDIRS = \
libgck \
megawidget \
dbbrowser \
script-fu \
$(GIMP_PERL) \

View file

@ -46,20 +46,25 @@
*/
#include "config.h"
#include <string.h>
#include <libgimp/gimp.h>
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include "bmp.h"
#include "libgimp/gimpui.h"
#include "libgimp/stdplugins-intl.h"
FILE *errorfile;
gchar *prog_name = "bmp";
gchar *filename;
gint interactive_bmp;
FILE *errorfile;
char *prog_name="bmp";
char *filename;
int interactive_bmp;
struct Bitmap_File_Head_Struct Bitmap_File_Head;
struct Bitmap_Head_Struct Bitmap_Head;
struct Bitmap_OS2_Head_Struct Bitmap_OS2_Head;
@ -67,26 +72,25 @@ struct Bitmap_OS2_Head_Struct Bitmap_OS2_Head;
/* Declare some local functions.
*/
static void query (void);
static void run (char *name,
int nparams,
static void run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals);
static void init_gtk (void);
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN ()
static void
query ()
query (void)
{
static GParamDef load_args[] =
{
@ -98,8 +102,9 @@ query ()
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
@ -109,7 +114,7 @@ query ()
{ PARAM_STRING, "filename", "The name of the file to save the image in" },
{ PARAM_STRING, "raw_filename", "The name entered" },
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -137,30 +142,35 @@ query ()
nsave_args, 0,
save_args, NULL);
gimp_register_magic_load_handler ("file_bmp_load", "bmp", "", "0,string,BM");
gimp_register_save_handler ("file_bmp_save", "bmp", "");
gimp_register_magic_load_handler ("file_bmp_load",
"bmp",
"",
"0,string,BM");
gimp_register_save_handler ("file_bmp_save",
"bmp",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GStatusType status = STATUS_SUCCESS;
GRunModeType run_mode;
gint32 image_ID;
gint32 drawable_ID;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
GimpExportReturnType export = EXPORT_CANCEL;
run_mode = param[0].data.d_int32;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_bmp_load") == 0)
{
@ -183,19 +193,21 @@ run (char *name,
break;
}
image_ID = ReadBMP (param[1].data.d_string);
if (status == STATUS_SUCCESS)
{
image_ID = ReadBMP (param[1].data.d_string);
if (image_ID != -1)
{
*nreturn_vals = 2;
values[0].data.d_status = STATUS_SUCCESS;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
}
if (image_ID != -1)
{
*nreturn_vals = 2;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
{
status = STATUS_EXECUTION_ERROR;
}
}
}
else if (strcmp (name, "file_bmp_save") == 0)
{
@ -211,11 +223,12 @@ run (char *name,
case RUN_WITH_LAST_VALS:
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "BMP",
(CAN_HANDLE_RGB | CAN_HANDLE_GRAY | CAN_HANDLE_INDEXED));
(CAN_HANDLE_RGB |
CAN_HANDLE_GRAY |
CAN_HANDLE_INDEXED));
if (export == EXPORT_CANCEL)
{
*nreturn_vals = 1;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
@ -244,17 +257,23 @@ run (char *name,
break;
}
*nreturn_vals = 1;
if (WriteBMP (param[3].data.d_string, image_ID, drawable_ID))
{
values[0].data.d_status = STATUS_SUCCESS;
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (status == STATUS_SUCCESS)
{
if (! WriteBMP (param[3].data.d_string, image_ID, drawable_ID))
{
status = STATUS_EXECUTION_ERROR;
}
}
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
else
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
gint32
@ -291,10 +310,10 @@ static void
init_gtk (void)
{
gchar **argv;
gint argc;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("bmp");
gtk_init (&argc, &argv);

View file

@ -53,7 +53,7 @@ static gint save_image (gchar *file,
gchar *brief,
gint32 image,
gint32 layer);
static gint palette_dialog (gchar *title);
static void palette_dialog (gchar *title);
/* Globals... */
@ -65,7 +65,7 @@ GPlugInInfo PLUG_IN_INFO =
run, /* run_proc */
};
static char *palette_file = NULL;
static gchar *palette_file = NULL;
static size_t data_length = 0;
/* Let GIMP library handle initialisation (and inquisitive users) */
@ -84,13 +84,14 @@ query (void)
{ PARAM_STRING, "raw_filename", "Name entered" },
{ PARAM_STRING, "palette_filename", "Filename to load palette from" },
};
static GParamDef load_return_vals[] =
{
{ PARAM_IMAGE, "image", "Output image" },
};
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
@ -116,9 +117,6 @@ query (void)
nload_args, nload_return_vals,
load_args, load_return_vals);
gimp_register_magic_load_handler ("file_cel_load", "cel",
"", "0,string,KiSS\040");
gimp_install_procedure ("file_cel_save",
_("Saves files in KISS CEL file format"),
_("This plug-in saves individual KISS cell files."),
@ -131,7 +129,13 @@ query (void)
nsave_args, 0,
save_args, NULL);
gimp_register_save_handler ("file_cel_save", "cel", "");
gimp_register_magic_load_handler ("file_cel_load",
"cel",
"",
"0,string,KiSS\040");
gimp_register_save_handler ("file_cel_save",
"cel",
"");
}
static void
@ -141,19 +145,19 @@ run (gchar *name,
gint *nreturn_vals,
GParam **return_vals)
{
gint32 image; /* image ID after load */
gint status; /* status after save */
static GParam values[2]; /* Return values */
GRunModeType run_mode;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image;
run_mode = param[0].data.d_int32;
/* Set up default return values */
*nreturn_vals = 1;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_SUCCESS;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (run_mode == RUN_INTERACTIVE)
{
@ -204,16 +208,15 @@ run (gchar *name,
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = STATUS_EXECUTION_ERROR;
}
}
else if (strcmp (name, "file_cel_save") == 0)
{
status = save_image (param[3].data.d_string, param[4].data.d_string,
param[1].data.d_int32, param[2].data.d_int32);
if (status != TRUE)
if (! save_image (param[3].data.d_string, param[4].data.d_string,
param[1].data.d_int32, param[2].data.d_int32))
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = STATUS_EXECUTION_ERROR;
}
else
{
@ -223,8 +226,10 @@ run (gchar *name,
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
/* Load CEL image into The GIMP */
@ -233,31 +238,31 @@ static gint32
load_image (gchar *file,
gchar *brief)
{
FILE* fp; /* Read file pointer */
char *progress; /* Title for progress display */
guchar header[32]; /* File header */
int height, width, /* Dimensions of image */
offx, offy, /* Layer offets */
colours; /* Number of colours */
FILE *fp; /* Read file pointer */
gchar *progress; /* Title for progress display */
guchar header[32]; /* File header */
gint height, width, /* Dimensions of image */
offx, offy, /* Layer offets */
colours; /* Number of colours */
gint32 image, /* Image */
layer; /* Layer */
guchar *palette, /* 24 bit palette */
*buffer, /* Temporary buffer */
*line; /* Pixel data */
GDrawable *drawable; /* Drawable for layer */
GPixelRgn pixel_rgn; /* Pixel region for layer */
gint32 image, /* Image */
layer; /* Layer */
guchar *palette, /* 24 bit palette */
*buffer, /* Temporary buffer */
*line; /* Pixel data */
GDrawable *drawable; /* Drawable for layer */
GPixelRgn pixel_rgn; /* Pixel region for layer */
int i, j, k; /* Counters */
gint i, j, k; /* Counters */
/* Open the file for reading */
fp = fopen(file, "r");
fp = fopen (file, "r");
if (fp == NULL)
{
g_message (_("%s\nis not present or is unreadable"), file);
gimp_quit ();
return -1;
}
progress = g_strdup_printf (_("Loading %s:"), brief);
@ -291,7 +296,7 @@ load_image (gchar *file,
if (image == -1)
{
g_message (_("CEL Can't create a new image"));
gimp_quit ();
return -1;
}
gimp_image_set_filename (image, file);
@ -365,7 +370,7 @@ load_image (gchar *file,
default:
g_message (_("Unsupported number of colours (%d)"), colours);
gimp_quit ();
return -1;
}
gimp_pixel_rgn_set_rect (&pixel_rgn, line, 0, i, drawable->width, 1);
@ -384,7 +389,7 @@ load_image (gchar *file,
/* Open the file for reading if user picked one */
if (palette_file == NULL)
{
fp= NULL;
fp = NULL;
}
else
{
@ -394,12 +399,13 @@ load_image (gchar *file,
if (fp != NULL)
{
colours = load_palette (fp, palette);
fclose (fp);
}
else
{
for (i= 0; i < colours; ++i)
{
palette[i*3]= palette[i*3+1]= palette[i*3+2]= i * 256 / colours;
palette[i*3] = palette[i*3+1] = palette[i*3+2]= i * 256 / colours;
}
}
@ -407,7 +413,6 @@ load_image (gchar *file,
/* Close palette file, give back allocated memory */
fclose (fp);
g_free (palette);
/* Now get everything redrawn and hand back the finished image */
@ -487,7 +492,7 @@ save_image (gchar *file,
if (type != INDEXEDA_IMAGE)
{
g_message (_("Only an indexed-alpha image can be saved in CEL format"));
gimp_quit ();
return FALSE;
}
/* Find out how offset this layer was */
@ -501,10 +506,10 @@ save_image (gchar *file,
if (fp == NULL)
{
g_message (_("CEL Couldn't write image to\n%s"), file);
gimp_quit ();
return FALSE;
}
progress = g_strdup_printf (_("Loading %s:"), brief);
progress = g_strdup_printf (_("Saving %s:"), brief);
gimp_progress_init (progress);
g_free (progress);
@ -517,11 +522,11 @@ save_image (gchar *file,
gimp_image_get_cmap (image, &colours);
if (colours > 15)
{
header[5]= 8;
header[5] = 8;
}
else
{
header[5]= 4;
header[5] = 4;
}
/* Fill in the blanks ... */
@ -594,10 +599,11 @@ palette_ok (GtkWidget *widget,
palette_file =
g_strdup (gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs)));
data_length = strlen (palette_file) + 1;
gtk_widget_destroy (GTK_WIDGET (fs));
}
static gint
static void
palette_dialog (gchar *title)
{
gchar **argv;
@ -634,6 +640,4 @@ palette_dialog (gchar *title)
gtk_main ();
gdk_flush ();
return 0;
}

View file

@ -83,14 +83,11 @@
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include <libgimp/gimpmath.h>
#include <libgimp/gimpcolorspace.h>
#include "libgimp/stdplugins-intl.h"
#ifndef RAND_MAX
#define RAND_MAX 2147483647
#endif /* RAND_MAX */
#define PARAM_FILE_FORMAT_VERSION 1.0
#define PLUG_IN_NAME "plug_in_CML_explorer"
#define VERBOSE_DIALOGS 1
@ -111,6 +108,7 @@
#define GTKW_BORDER_WIDTH 3
#define GTKW_FLOAT_MIN_ERROR 0.000001
#define GTKW_ENTRY_BUFFER_SIZE 32
/* gtkW type */
typedef struct
{
@ -124,13 +122,14 @@ typedef struct
gchar *name;
gpointer data;
} gtkW_menu_item;
/* gtkW global variables */
gint gtkW_border_width = GTKW_BORDER_WIDTH;
gint gtkW_border_height = 0;
gint gtkW_homogeneous_layout = FALSE;
gint gtkW_frame_shadow_type = GTK_SHADOW_ETCHED_IN;
gint gtkW_align_x = GTK_FILL|GTK_EXPAND;
gint gtkW_align_y = GTK_FILL;
static gint gtkW_border_width = GTKW_BORDER_WIDTH;
static gint gtkW_border_height = 0;
static gint gtkW_homogeneous_layout = FALSE;
static gint gtkW_frame_shadow_type = GTK_SHADOW_ETCHED_IN;
static gint gtkW_align_x = GTK_FILL|GTK_EXPAND;
static gint gtkW_align_y = GTK_FILL;
/* gtkW callback */
static void gtkW_toggle_update (GtkWidget *widget, gpointer data);
@ -206,7 +205,7 @@ static GtkWidget *gtkW_vbox_add_button (GtkWidget *vbox,
static GtkWidget *gtkW_vbox_new (GtkWidget *parent);
/* end of GtkW */
#define RANDOM ((gdouble) ((double) rand ()/((double) RAND_MAX)))
#define RANDOM ((gdouble) ((double) rand ()/((double) G_MAXRAND)))
#define CANNONIZE(p, x) (255*(((p).range_h - (p).range_l)*(x) + (p).range_l))
#define HCANNONIZE(p, x) (254*(((p).range_h - (p).range_l)*(x) + (p).range_l))
#define POS_IN_TORUS(i,size) ((i < 0) ? size + i : ((size <= i) ? i - size : i))

View file

@ -436,7 +436,6 @@ emboss_SOURCES = \
emboss.c
emboss_LDADD = \
$(top_builddir)/plug-ins/megawidget/libmegawidget.a \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la \
$(GTK_LIBS) \
@ -759,7 +758,6 @@ nlfilt_SOURCES = \
nlfilt.c
nlfilt_LDADD = \
$(top_builddir)/plug-ins/megawidget/libmegawidget.a \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la \
$(GTK_LIBS) \
@ -1179,7 +1177,6 @@ waves_SOURCES = \
waves.c
waves_LDADD = \
$(top_builddir)/plug-ins/megawidget/libmegawidget.a \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la \
$(GTK_LIBS) \

View file

@ -48,7 +48,7 @@ static void type_dialog_ok_callback (GtkWidget *widget,
static void type_dialog_toggle_update (GtkWidget *widget,
gpointer data);
static void type_dialog_cancel_callback (GtkWidget *widget,
gpointer data);
gpointer data);
/*
* Some global variables.
@ -56,10 +56,10 @@ static void type_dialog_cancel_callback (GtkWidget *widget,
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
run, /* run_proc */
};
/**
@ -82,7 +82,7 @@ query (void)
{PARAM_STRING, "raw_filename", "The name entered"},
{PARAM_STRING, "file_type", "File type to use"}
};
static int nsave_args = sizeof(save_args) / sizeof(save_args[0]);
static gint nsave_args = sizeof(save_args) / sizeof(save_args[0]);
INIT_I18N();
@ -98,7 +98,9 @@ query (void)
nsave_args, 0,
save_args, NULL);
gimp_register_save_handler ("file_aa_save", "ansi,txt,text,html", "");
gimp_register_save_handler ("file_aa_save",
"ansi,txt,text,html",
"");
}
/**
@ -107,11 +109,11 @@ query (void)
* -1 means it wasn't found.
*/
static int
get_type_from_string (char *string)
get_type_from_string (gchar *string)
{
int type = 0;
gint type = 0;
aa_format **p = aa_formats;
while (*p && strcmp ((*p)->formatname, string))
{
p++;
@ -132,19 +134,19 @@ run (gchar *name,
GParam **return_vals)
{
static GParam values[2];
GStatusType status = STATUS_SUCCESS;
GRunModeType run_mode;
gint output_type = 0;
static int last_type = 0;
gint32 image_ID;
gint32 drawable_ID;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint output_type = 0;
static int last_type = 0;
gint32 image_ID;
gint32 drawable_ID;
GimpExportReturnType export = EXPORT_CANCEL;
/* Set us up to return a status. */
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
run_mode = param[0].data.d_int32;
image_ID = param[1].data.d_int32;
@ -158,10 +160,11 @@ run (gchar *name,
INIT_I18N_UI();
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "AA",
(CAN_HANDLE_GRAY | CAN_HANDLE_ALPHA));
(CAN_HANDLE_GRAY |
CAN_HANDLE_ALPHA));
if (export == EXPORT_CANCEL)
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
@ -171,54 +174,62 @@ run (gchar *name,
}
if (!aa_savable (drawable_ID))
{
values[0].data.d_status = STATUS_CALLING_ERROR;
goto finish;
}
switch (run_mode)
{
case RUN_INTERACTIVE:
gimp_get_data ("file_aa_save", &last_type);
output_type = type_dialog (last_type);
break;
case RUN_NONINTERACTIVE:
/* Make sure all the arguments are there! */
if (nparams != 6)
status = STATUS_CALLING_ERROR;
else
output_type = get_type_from_string (param[5].data.d_string);
break;
case RUN_WITH_LAST_VALS:
gimp_get_data ("file_aa_save", &last_type);
output_type = last_type;
break;
default:
break;
}
if (output_type < 0)
{
status = STATUS_CALLING_ERROR;
goto finish;
}
if (save_aa (output_type, param[3].data.d_string, image_ID, drawable_ID))
if (status == STATUS_SUCCESS)
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
last_type = output_type;
gimp_set_data ("file_aa_save", &last_type, sizeof(last_type));
}
else
values[0].data.d_status = STATUS_SUCCESS;
switch (run_mode)
{
case RUN_INTERACTIVE:
gimp_get_data ("file_aa_save", &last_type);
output_type = type_dialog (last_type);
if (output_type < 0)
status = STATUS_CANCEL;
break;
finish:
case RUN_NONINTERACTIVE:
/* Make sure all the arguments are there! */
if (nparams != 6)
{
status = STATUS_CALLING_ERROR;
}
else
{
output_type = get_type_from_string (param[5].data.d_string);
if (output_type < 0)
status = STATUS_CALLING_ERROR;
}
break;
case RUN_WITH_LAST_VALS:
gimp_get_data ("file_aa_save", &last_type);
output_type = last_type;
break;
default:
break;
}
}
if (status == STATUS_SUCCESS)
{
if (save_aa (output_type, param[3].data.d_string, image_ID, drawable_ID))
{
status = STATUS_EXECUTION_ERROR;
}
else
{
last_type = output_type;
gimp_set_data ("file_aa_save", &last_type, sizeof (last_type));
}
}
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
values[0].data.d_status = status;
}
/**
@ -419,5 +430,5 @@ static void
type_dialog_toggle_update (GtkWidget *widget,
gpointer data)
{
selected_type = get_type_from_string ((char *)data);
selected_type = get_type_from_string ((char *) data);
}

View file

@ -304,6 +304,8 @@ blinds_dialog (void)
{
GtkWidget *dlg;
GtkWidget *main_vbox;
GtkWidget *hbox;
GtkWidget *vbox;
GtkWidget *frame;
GtkWidget *toggle_vbox;
GtkWidget *xframe;
@ -354,19 +356,23 @@ blinds_dialog (void)
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dlg)->vbox), main_vbox);
gtk_widget_show (main_vbox);
hbox = gtk_hbox_new (FALSE, 6);
gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
frame = gtk_frame_new (_("Preview"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
table = gtk_table_new (5, 5, FALSE);
table = gtk_table_new (1, 1, FALSE);
gtk_container_set_border_width (GTK_CONTAINER (table), 4);
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_widget_show (table);
xframe = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (xframe), GTK_SHADOW_IN);
gtk_table_attach (GTK_TABLE (table), xframe, 0, 1, 0, 2,
gtk_table_attach (GTK_TABLE (table), xframe, 0, 1, 0, 1,
GTK_EXPAND, GTK_EXPAND, 0, 0);
gtk_widget_show (xframe);
@ -375,6 +381,10 @@ blinds_dialog (void)
gtk_container_add (GTK_CONTAINER (xframe), bint.preview);
gtk_widget_show(bint.preview);
vbox = gtk_vbox_new (FALSE, 4);
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
gtk_widget_show (vbox);
frame =
gimp_radio_group_new2 (TRUE, _("Orientation"),
blinds_radio_update,
@ -384,15 +394,11 @@ blinds_dialog (void)
_("Vertical"), (gpointer) VERTICAL, NULL,
NULL);
gtk_table_attach (GTK_TABLE (table), frame, 1, 2, 0, 1,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
gtk_widget_show (frame);
frame = gtk_frame_new (_("Background"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_table_attach (GTK_TABLE (table), frame, 1, 2, 1, 2,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
toggle_vbox = gtk_vbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (toggle_vbox), 2);
@ -460,6 +466,7 @@ blinds_ok_callback (GtkWidget *widget,
gpointer data)
{
bint.run = TRUE;
gtk_widget_destroy (GTK_WIDGET (data));
}

View file

@ -96,8 +96,8 @@ typedef struct
{
gdouble blur_pct; /* likelihood of randomization (as %age) */
gdouble blur_rcount; /* repeat count */
gint seed_type; /* seed init. type - current time or user value */
gint blur_seed; /* seed value for rand() function */
gint seed_type; /* seed init. type - current time or user value */
gint blur_seed; /* seed value for rand() function */
} BlurVals;
static BlurVals pivals =
@ -143,15 +143,14 @@ GPlugInInfo PLUG_IN_INFO =
static void blur (GDrawable *drawable);
static inline void blur_prepare_row (GPixelRgn *pixel_rgn,
guchar *data,
int x,
int y,
int w);
guchar *data,
gint x,
gint y,
gint w);
static gint blur_dialog (void);
static void blur_ok_callback (GtkWidget *widget,
gpointer data);
static gint blur_dialog (void);
static void blur_ok_callback (GtkWidget *widget,
gpointer data);
/************************************ Guts ***********************************/
@ -174,7 +173,7 @@ query (void)
{ PARAM_IMAGE, "image", "Input image (unused)" },
{ PARAM_DRAWABLE, "drawable", "Input drawable" },
};
static int nargs_ni = sizeof(args_ni) / sizeof (args_ni[0]);
static gint nargs_ni = sizeof(args_ni) / sizeof (args_ni[0]);
static GParamDef args[] =
{
@ -186,25 +185,25 @@ query (void)
{ PARAM_INT32, "seed_type", "Seed type (10 = current time, 11 = seed value)" },
{ PARAM_INT32, "blur_seed", "Seed value (used only if seed type is 11)" },
};
static int nargs = sizeof(args) / sizeof (args[0]);
static gint nargs = sizeof(args) / sizeof (args[0]);
static GParamDef *return_vals = NULL;
static int nreturn_vals = 0;
static gint nreturn_vals = 0;
const char *blurb = _("Apply a 3x3 blurring convolution kernel to the specified drawable.");
const char *help = _("This plug-in randomly blurs the specified drawable, using a 3x3 blur. You control the percentage of the pixels that are blurred and the number of times blurring is applied. Indexed images are not supported.");
const char *author = "Miles O'Neal <meo@rru.com> http://www.rru.com/~meo/";
const char *copyrights = "Miles O'Neal, Spencer Kimball, Peter Mattis, Torsten Martinsen, Brian Degenhardt, Federico Mena Quintero, Stephen Norris, Daniel Cotting";
const char *copyright_date = "1995-1998";
const gchar *blurb = _("Apply a 3x3 blurring convolution kernel to the specified drawable.");
const gchar *help = _("This plug-in randomly blurs the specified drawable, using a 3x3 blur. You control the percentage of the pixels that are blurred and the number of times blurring is applied. Indexed images are not supported.");
const gchar *author = "Miles O'Neal <meo@rru.com> http://www.rru.com/~meo/";
const gchar *copyrights = "Miles O'Neal, Spencer Kimball, Peter Mattis, Torsten Martinsen, Brian Degenhardt, Federico Mena Quintero, Stephen Norris, Daniel Cotting";
const gchar *copyright_date = "1995-1998";
INIT_I18N();
gimp_install_procedure ("plug_in_blur_randomize",
(char *) blurb,
(char *) help,
(char *) author,
(char *) copyrights,
(char *) copyright_date,
(gchar *) blurb,
(gchar *) help,
(gchar *) author,
(gchar *) copyrights,
(gchar *) copyright_date,
N_("<Image>/Filters/Blur/Blur..."),
"RGB*, GRAY*",
PROC_PLUG_IN,
@ -212,11 +211,11 @@ query (void)
args, return_vals);
gimp_install_procedure (PLUG_IN_NAME,
(char *) blurb,
(char *) help,
(char *) author,
(char *) copyrights,
(char *) copyright_date,
(gchar *) blurb,
(gchar *) help,
(gchar *) author,
(gchar *) copyrights,
(gchar *) copyright_date,
NULL,
"RGB*, GRAY*",
PROC_PLUG_IN,
@ -243,7 +242,7 @@ run (gchar *name,
GDrawable *drawable;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS; /* assume the best! */
char prog_label[32];
gchar prog_label[32];
static GParam values[1];
INIT_I18N_UI();
@ -282,22 +281,22 @@ run (gchar *name,
* parameters have legitimate values.
*/
case RUN_NONINTERACTIVE:
if ((strcmp(name, "plug_in_blur_randomize") == 0) &&
if ((strcmp (name, "plug_in_blur_randomize") == 0) &&
(nparams == 7))
{
pivals.blur_pct = (gdouble)param[3].data.d_float;
pivals.blur_pct = (gdouble)MIN(100.0, pivals.blur_pct);
pivals.blur_pct = (gdouble)MAX(1.0, pivals.blur_pct);
pivals.blur_rcount = (gdouble)param[4].data.d_float;
pivals.blur_rcount = (gdouble)MIN(100.0,pivals.blur_rcount);
pivals.blur_rcount = (gdouble)MAX(1.0, pivals.blur_rcount);
pivals.blur_pct = (gdouble) param[3].data.d_float;
pivals.blur_pct = (gdouble) MIN (100.0, pivals.blur_pct);
pivals.blur_pct = (gdouble) MAX (1.0, pivals.blur_pct);
pivals.blur_rcount = (gdouble) param[4].data.d_float;
pivals.blur_rcount = (gdouble) MIN (100.0,pivals.blur_rcount);
pivals.blur_rcount = (gdouble) MAX (1.0, pivals.blur_rcount);
pivals.seed_type = (gint) param[5].data.d_int32;
pivals.seed_type = (gint) MIN(SEED_USER, param[5].data.d_int32);
pivals.seed_type = (gint) MAX(SEED_TIME, param[5].data.d_int32);
pivals.seed_type = (gint) MIN (SEED_USER, param[5].data.d_int32);
pivals.seed_type = (gint) MAX (SEED_TIME, param[5].data.d_int32);
pivals.blur_seed = (gint) param[6].data.d_int32;
status = STATUS_SUCCESS;
}
else if ((strcmp(name, PLUG_IN_NAME) == 0) &&
else if ((strcmp (name, PLUG_IN_NAME) == 0) &&
(nparams == 3))
{
pivals.blur_pct = (gdouble) 100.0;
@ -316,7 +315,7 @@ run (gchar *name,
* If we're running with the last set of values, get those values.
*/
case RUN_WITH_LAST_VALS:
gimp_get_data(PLUG_IN_NAME, &pivals);
gimp_get_data (PLUG_IN_NAME, &pivals);
break;
/*
@ -330,31 +329,31 @@ run (gchar *name,
/*
* JUST DO IT!
*/
strcpy(prog_label, BLUR_VERSION);
gimp_progress_init(prog_label);
gimp_tile_cache_ntiles(2 * (drawable->width / gimp_tile_width() + 1));
strcpy (prog_label, BLUR_VERSION);
gimp_progress_init (prog_label);
gimp_tile_cache_ntiles (2 * (drawable->width / gimp_tile_width() + 1));
/*
* Initialize the rand() function seed
*/
if (pivals.seed_type == SEED_TIME)
srand (time (NULL));
else
srand (pivals.blur_seed);
pivals.blur_seed = time (NULL);
blur(drawable);
srand (pivals.blur_seed);
blur (drawable);
/*
* If we ran interactively (even repeating) update the display.
*/
if (run_mode != RUN_NONINTERACTIVE)
{
gimp_displays_flush();
gimp_displays_flush ();
}
/*
* If we use the dialog popup, set the data for future use.
*/
if (run_mode == RUN_INTERACTIVE)
{
gimp_set_data(PLUG_IN_NAME, &pivals, sizeof(BlurVals));
gimp_set_data (PLUG_IN_NAME, &pivals, sizeof (BlurVals));
}
}
}
@ -371,7 +370,7 @@ run (gchar *name,
* of the drawable.
*/
values[0].data.d_status = status;
gimp_drawable_detach(drawable);
gimp_drawable_detach (drawable);
}
/*********************************
@ -581,7 +580,7 @@ blur (GDrawable *drawable)
}
}
}
gimp_progress_update((double) 100);
gimp_progress_update ((double) 100);
/*
* update the blurred region
*/
@ -605,20 +604,12 @@ static gint
blur_dialog (void)
{
GtkWidget *dlg;
GtkWidget *label;
GtkWidget *frame;
GtkWidget *seed_hbox;
GtkWidget *seed_vbox;
GtkWidget *table;
GtkWidget *spinbutton;
GtkWidget *seed_hbox;
GtkObject *adj;
GtkWidget *radio_button;
GSList *group = NULL;
gchar **argv;
gint argc;
gint do_time = (pivals.seed_type == SEED_TIME);
gint do_user = (pivals.seed_type == SEED_USER);
gchar **argv;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
@ -642,6 +633,9 @@ blur_dialog (void)
gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
gimp_help_init ();
/*
* Parameter settings
*
@ -652,82 +646,24 @@ blur_dialog (void)
gtk_container_set_border_width (GTK_CONTAINER(frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(dlg)->vbox), frame, TRUE, TRUE, 0);
table = gtk_table_new (4, 3, FALSE);
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_container_set_border_width (GTK_CONTAINER (table), 4);
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_widget_show (table);
gimp_help_init ();
label = gtk_label_new (_("Randomization Seed:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
gtk_widget_show (label);
/*
* Box to hold seed initialization radio buttons
*/
seed_vbox = gtk_vbox_new (FALSE, 2);
gtk_table_attach (GTK_TABLE (table), seed_vbox, 1, 2, 1, 2,
GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
gtk_widget_show (seed_vbox);
/*
* Time button
*/
radio_button = gtk_radio_button_new_with_label (NULL, _("Current Time"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio_button));
gtk_box_pack_start (GTK_BOX (seed_vbox), radio_button, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (radio_button), "toggled",
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&do_time);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button), do_time);
gtk_widget_show (radio_button);
gimp_help_set_help_data (radio_button,
_("Seed random number generator from the current "
"time - this guarantees a reasonable "
"randomization"), NULL);
/*
* Box to hold seed user initialization controls
*/
seed_hbox = gtk_hbox_new (FALSE, 4);
gtk_box_pack_start (GTK_BOX (seed_vbox), seed_hbox, FALSE, FALSE, 0);
gtk_widget_show (seed_hbox);
/*
* User button
*/
radio_button = gtk_radio_button_new_with_label (group, _("Other Value"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio_button));
gtk_box_pack_start (GTK_BOX (seed_hbox), radio_button, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (radio_button), "toggled",
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&do_user);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button), do_user);
gtk_widget_show (radio_button);
gimp_help_set_help_data (radio_button,
_("Enable user-entered value for random number "
"generator seed - this allows you to repeat a "
"given \"random\" operation"), NULL);
/*
* Randomization seed number (text)
*/
spinbutton = gimp_spin_button_new (&adj, pivals.blur_seed,
G_MININT, G_MAXINT, 1, 10, 0, 1, 0);
gtk_box_pack_start(GTK_BOX (seed_hbox), spinbutton, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
&pivals.blur_seed);
gtk_widget_show (spinbutton);
gimp_help_set_help_data (spinbutton,
_("Value for seeding the random number generator"),
NULL);
gtk_widget_show (seed_hbox);
/* Random Seed */
seed_hbox = gimp_random_seed_new (&pivals.blur_seed, &pivals.seed_type,
SEED_TIME, SEED_USER);
gimp_table_attach_aligned (GTK_TABLE (table), 0,
_("Random Seed:"), 1.0, 0.5,
seed_hbox, TRUE);
/*
* Randomization percentage label & scale (1 to 100)
*/
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
_("Randomization %:"), SCALE_WIDTH, 0,
pivals.blur_pct, 1.0, 100.0, 1.0, 10.0, 0,
_("Percentage of pixels to be filtered"), NULL);
@ -738,7 +674,7 @@ blur_dialog (void)
/*
* Repeat count label & scale (1 to 100)
*/
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 3,
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
_("Repeat:"), SCALE_WIDTH, 0,
pivals.blur_rcount, 1.0, 100.0, 1.0, 10.0, 0,
_("Number of times to apply filter"), NULL);
@ -754,18 +690,6 @@ blur_dialog (void)
gimp_help_free ();
gdk_flush ();
/*
* Figure out which type of seed initialization to apply.
*/
if (do_time)
{
pivals.seed_type = SEED_TIME;
}
else
{
pivals.seed_type = SEED_USER;
}
return blur_int.run;
}

View file

@ -757,8 +757,12 @@ static gint
bumpmap_dialog (void)
{
GtkWidget *dialog;
GtkWidget *top_table;
GtkWidget *top_vbox;
GtkWidget *hbox;
GtkWidget *frame;
GtkWidget *sep;
GtkWidget *abox;
GtkWidget *pframe;
GtkWidget *table;
GtkWidget *right_vbox;
GtkWidget *label;
@ -809,27 +813,38 @@ bumpmap_dialog (void)
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
top_table = gtk_table_new (2, 2, FALSE);
gtk_container_border_width (GTK_CONTAINER (top_table), 6);
gtk_table_set_row_spacings (GTK_TABLE (top_table), 4);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), top_table,
top_vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (top_vbox), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), top_vbox,
FALSE, FALSE, 0);
gtk_widget_show (top_table);
gtk_widget_show (top_vbox);
hbox = gtk_hbox_new (FALSE, 6);
gtk_box_pack_start (GTK_BOX (top_vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
/* Preview */
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_table_attach (GTK_TABLE (top_table), frame, 0, 1, 0, 1, 0, 0, 0, 0);
frame = gtk_frame_new (_("Preview"));
gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
abox = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
gtk_container_add (GTK_CONTAINER (frame), abox);
gtk_widget_show (abox);
pframe = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (pframe), GTK_SHADOW_IN);
gtk_container_set_border_width (GTK_CONTAINER (pframe), 4);
gtk_container_add (GTK_CONTAINER (abox), pframe);
gtk_widget_show (pframe);
bmint.preview_width = MIN (sel_width, PREVIEW_SIZE);
bmint.preview_height = MIN (sel_height, PREVIEW_SIZE);
bmint.preview = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_size (GTK_PREVIEW (bmint.preview),
bmint.preview_width, bmint.preview_height);
gtk_container_add (GTK_CONTAINER (frame), bmint.preview);
gtk_container_add (GTK_CONTAINER (pframe), bmint.preview);
gtk_widget_show (bmint.preview);
gtk_widget_set_events (bmint.preview,
@ -843,17 +858,30 @@ bumpmap_dialog (void)
dialog_init_preview ();
/* vbox for upper-right controls */
/* Type of map */
frame =
gimp_radio_group_new2 (TRUE, _("Map Type"),
dialog_map_type_callback,
&bmvals.type, (gpointer) bmvals.type,
right_vbox = gtk_vbox_new (FALSE, 2);
gtk_table_attach (GTK_TABLE (top_table), right_vbox, 1, 2, 0, 1,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_widget_show (right_vbox);
_("Linear Map"), (gpointer) LINEAR, NULL,
_("Spherical Map"), (gpointer) SPHERICAL, NULL,
_("Sinuosidal Map"), (gpointer) SINUOSIDAL, NULL,
NULL);
gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
gtk_widget_show (frame);
right_vbox = GTK_BIN (frame)->child;
sep = gtk_hseparator_new ();
gtk_box_pack_start (GTK_BOX (right_vbox), sep, FALSE, FALSE, 1);
gtk_widget_show (sep);
/* Compensate darkening */
button = gtk_check_button_new_with_label (_("Compensate for Darkening"));
gtk_box_pack_start (GTK_BOX (right_vbox), button, FALSE, FALSE, 0);;
gtk_box_pack_start (GTK_BOX (right_vbox), button, FALSE, FALSE, 0);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button),
bmvals.compensate ? TRUE : FALSE);
gtk_signal_connect (GTK_OBJECT (button), "toggled",
@ -872,29 +900,12 @@ bumpmap_dialog (void)
NULL);
gtk_widget_show (button);
/* Type of map */
frame =
gimp_radio_group_new2 (TRUE, NULL,
dialog_map_type_callback,
&bmvals.type, (gpointer) bmvals.type,
_("Linear Map"), (gpointer) LINEAR, NULL,
_("Spherical Map"), (gpointer) SPHERICAL, NULL,
_("Sinuosidal Map"), (gpointer) SINUOSIDAL, NULL,
NULL);
gtk_box_pack_start (GTK_BOX (right_vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
/* Table for bottom controls */
table = gtk_table_new (8, 3, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_table_attach (GTK_TABLE (top_table), table, 0, 2, 1, 2,
GTK_EXPAND | GTK_FILL, 0, 0, 0);
gtk_box_pack_start (GTK_BOX (top_vbox), table, FALSE, FALSE, 0);
gtk_widget_show (table);
/* Bump map menu */

View file

@ -32,6 +32,8 @@
* filename.foo.bz2 where foo is some already-recognized extension
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
@ -45,40 +47,42 @@
#include <fcntl.h>
#include <process.h>
#endif
#include "libgimp/gimp.h"
#include "config.h"
#include <libgimp/gimp.h>
#include "libgimp/stdplugins-intl.h"
static void query (void);
static void run (char *name,
int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals);
static gint32 load_image (char *filename, gint32 run_mode);
static void query (void);
static void run (gchar *name,
gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals);
static gint save_image (char *filename,
gint32 image_ID,
gint32 drawable_ID,
gint32 run_mode);
static gint32 load_image (gchar *filename,
gint32 run_mode,
GStatusType *status /* return value */);
static GStatusType save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID,
gint32 run_mode);
static int valid_file (char* filename) ;
static char* find_extension (char* filename) ;
static gboolean valid_file (gchar *filename);
static gchar * find_extension (gchar *filename);
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN ()
static void
query ()
query (void)
{
static GParamDef load_args[] =
{
@ -86,14 +90,13 @@ query ()
{ PARAM_STRING, "filename", "The name of the file to load" },
{ PARAM_STRING, "raw_filename", "The name entered" },
};
static GParamDef load_return_vals[] =
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
@ -103,7 +106,7 @@ query ()
{ PARAM_STRING, "filename", "The name of the file to save the image in" },
{ PARAM_STRING, "raw_filename", "The name of the file to save the image in" }
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
gimp_install_procedure ("file_bz2_load",
"loads files compressed with bzip2",
@ -129,49 +132,48 @@ query ()
nsave_args, 0,
save_args, NULL);
gimp_register_load_handler ("file_bz2_load", "xcf.bz2,bz2,xcfbz2", "");
gimp_register_save_handler ("file_bz2_save", "xcf.bz2,bz2,xcfbz2", "");
gimp_register_load_handler ("file_bz2_load",
"xcf.bz2,bz2,xcfbz2",
"");
gimp_register_save_handler ("file_bz2_save",
"xcf.bz2,bz2,xcfbz2",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
INIT_I18N();
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
run_mode = param[0].data.d_int32;
*nreturn_vals = 1;
*return_vals = values;
INIT_I18N();
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_bz2_load") == 0)
{
image_ID = load_image (param[1].data.d_string,
param[0].data.d_int32);
if (image_ID != -1)
param[0].data.d_int32,
&status);
if (image_ID != -1 &&
status == STATUS_SUCCESS)
{
*nreturn_vals = 2;
values[0].data.d_status = STATUS_SUCCESS;
values[1].type = PARAM_IMAGE;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
}
}
else if (strcmp (name, "file_bz2_save") == 0)
{
@ -183,7 +185,7 @@ run (char *name,
/* Make sure all the arguments are there! */
if (nparams != 4)
status = STATUS_CALLING_ERROR;
break;
case RUN_WITH_LAST_VALS:
break;
@ -191,71 +193,82 @@ run (char *name,
break;
}
*nreturn_vals = 1;
if (save_image (param[3].data.d_string,
param[1].data.d_int32,
param[2].data.d_int32,
param[0].data.d_int32 ))
if (status == STATUS_SUCCESS)
{
values[0].data.d_status = STATUS_SUCCESS;
status = save_image (param[3].data.d_string,
param[1].data.d_int32,
param[2].data.d_int32,
param[0].data.d_int32);
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
}
else
g_assert (FALSE);
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
#ifdef __EMX__
static int spawn_bz(char *filename, char* tmpname, char *parms, int *pid)
static gint
spawn_bz (gchar *filename,
gchar *tmpname,
gchar *parms,
gint *pid)
{
FILE *f;
int tfd;
gint tfd;
if (!(f = fopen(filename,"wb"))){
g_message("bz: fopen failed: %s\n", g_strerror(errno));
return -1;
}
/* save fileno(stdout) */
tfd = dup(fileno(stdout));
/* make stdout for this process be the output file */
if (dup2(fileno(f),fileno(stdout)) == -1)
if (!(f = fopen(filename,"wb")))
{
g_message ("bz: dup2 failed: %s\n", g_strerror(errno));
close(tfd);
g_message ("bz: fopen failed: %s\n", g_strerror (errno));
return -1;
}
fcntl(tfd, F_SETFD, FD_CLOEXEC);
/* save fileno(stdout) */
tfd = dup (fileno (stdout));
/* make stdout for this process be the output file */
if (dup2 (fileno (f), fileno (stdout)) == -1)
{
g_message ("bz: dup2 failed: %s\n", g_strerror (errno));
close (tfd);
return -1;
}
fcntl (tfd, F_SETFD, FD_CLOEXEC);
*pid = spawnlp (P_NOWAIT, "bzip2", "bzip2", parms, tmpname, NULL);
fclose(f);
fclose (f);
/* restore fileno(stdout) */
dup2(tfd,fileno(stdout));
close(tfd);
dup2 (tfd, fileno (stdout));
close (tfd);
if (*pid == -1)
{
g_message ("bz: spawn failed: %s\n", g_strerror(errno));
g_message ("bz: spawn failed: %s\n", g_strerror (errno));
return -1;
}
return 0;
}
#endif
static gint
save_image (char *filename,
static GStatusType
save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID,
gint32 run_mode)
{
FILE* f;
GParam* params;
FILE *f;
GParam *params;
gint retvals;
char* ext;
char* tmpname;
int pid;
int status;
gchar *ext;
gchar *tmpname;
gint pid;
gint status;
if (NULL == (ext = find_extension(filename))) return -1;
if (NULL == (ext = find_extension (filename)))
{
g_message (_("bz2: can't open bzip2ed file without a "
"sensible extension\n"));
return STATUS_CALLING_ERROR;
}
/* get a temp name with the right extension and save into it. */
@ -276,11 +289,13 @@ save_image (char *filename,
PARAM_STRING, tmpname,
PARAM_END);
if (params[0].data.d_status == FALSE || !valid_file(tmpname)) {
unlink (tmpname);
g_free (tmpname);
return -1;
}
if (!valid_file (tmpname) ||
params[0].data.d_status != STATUS_SUCCESS)
{
unlink (tmpname);
g_free (tmpname);
return params[0].data.d_status;
}
/* if (! file_save(image_ID, tmpname, tmpname)) { */
/* unlink (tmpname); */
@ -289,37 +304,37 @@ save_image (char *filename,
#ifndef __EMX__
/* fork off a bzip2 process */
if ((pid = fork()) < 0)
if ((pid = fork ()) < 0)
{
g_message ("bz2: fork failed: %s\n", g_strerror(errno));
g_message ("bz2: fork failed: %s\n", g_strerror (errno));
g_free (tmpname);
return -1;
return STATUS_EXECUTION_ERROR;
}
else if (pid == 0)
{
if (!(f = fopen(filename,"w"))){
g_message("bz2: fopen failed: %s\n", g_strerror(errno));
g_free (tmpname);
_exit(127);
}
if (!(f = fopen (filename, "w")))
{
g_message ("bz2: fopen failed: %s\n", g_strerror (errno));
g_free (tmpname);
_exit(127);
}
/* make stdout for this process be the output file */
if (-1 == dup2(fileno(f),fileno(stdout)))
g_message ("bz2: dup2 failed: %s\n", g_strerror(errno));
if (-1 == dup2 (fileno (f), fileno (stdout)))
g_message ("bz2: dup2 failed: %s\n", g_strerror (errno));
/* and bzip2 into it */
execlp ("bzip2", "bzip2", "-cf", tmpname, NULL);
g_message ("bz2: exec failed: bzip2: %s\n", g_strerror(errno));
g_message ("bz2: exec failed: bzip2: %s\n", g_strerror (errno));
g_free (tmpname);
_exit(127);
_exit (127);
}
else
#else /* __EMX__ */
if (spawn_bz(filename, tmpname, "-cf", &pid) == -1)
if (spawn_bz (filename, tmpname, "-cf", &pid) == -1)
{
g_free (tmpname);
return -1;
return STATUS_EXECUTION_ERROR;
}
#endif
{
@ -330,27 +345,35 @@ save_image (char *filename,
{
g_message ("bz2: bzip2 exited abnormally on file %s\n", tmpname);
g_free (tmpname);
return 0;
return STATUS_EXECUTION_ERROR;
}
}
unlink (tmpname);
g_free (tmpname);
return TRUE;
return STATUS_SUCCESS;
}
static gint32
load_image (char *filename, gint32 run_mode)
load_image (gchar *filename,
gint32 run_mode,
GStatusType *status /* return value */)
{
GParam* params;
GParam *params;
gint retvals;
char* ext;
char* tmpname;
int pid;
int status;
gchar *ext;
gchar *tmpname;
gint pid;
gint process_status;
if (NULL == (ext = find_extension(filename))) return -1;
if (NULL == (ext = find_extension (filename)))
{
g_message (_("bz2: can't open bzip2ed file without a "
"sensible extension\n"));
*status = STATUS_CALLING_ERROR;
return -1;
}
/* find a temp name */
params = gimp_run_procedure ("gimp_temp_name",
@ -363,47 +386,51 @@ load_image (char *filename, gint32 run_mode)
#ifndef __EMX__
/* fork off a g(un)zip and wait for it */
if ((pid = fork()) < 0)
if ((pid = fork ()) < 0)
{
g_message ("bz2: fork failed: %s\n", g_strerror(errno));
g_message ("bz2: fork failed: %s\n", g_strerror (errno));
g_free (tmpname);
*status = STATUS_EXECUTION_ERROR;
return -1;
}
else if (pid == 0) /* child process */
{
FILE* f;
if (!(f = fopen(tmpname,"w"))){
g_message("bz2: fopen failed: %s\n", g_strerror(errno));
g_free (tmpname);
_exit(127);
}
FILE *f;
if (!(f = fopen (tmpname,"w")))
{
g_message ("bz2: fopen failed: %s\n", g_strerror (errno));
g_free (tmpname);
_exit (127);
}
/* make stdout for this child process be the temp file */
if (-1 == dup2(fileno(f),fileno(stdout)))
g_message ("bz2: dup2 failed: %s\n", g_strerror(errno));
if (-1 == dup2 (fileno (f), fileno (stdout)))
g_message ("bz2: dup2 failed: %s\n", g_strerror (errno));
/* and unzip into it */
execlp ("bzip2", "bzip2", "-cfd", filename, NULL);
g_message ("bz2: exec failed: bunzip2: %s\n", g_strerror(errno));
g_message ("bz2: exec failed: bunzip2: %s\n", g_strerror (errno));
g_free (tmpname);
_exit(127);
_exit (127);
}
else /* parent process */
#else /* __EMX__ */
if (spawn_bz(filename, tmpname, "-cfd", &pid) == -1)
if (spawn_bz (filename, tmpname, "-cfd", &pid) == -1)
{
g_free (tmpname);
g_free (tmpname);
*status = STATUS_EXECUTION_ERROR;
return -1;
}
#endif
{
waitpid (pid, &status, 0);
waitpid (pid, &process_status, 0);
if (!WIFEXITED(status) ||
WEXITSTATUS(status) != 0)
if (!WIFEXITED (process_status) ||
WEXITSTATUS (process_status) != 0)
{
g_message ("bz2: bzip2 exited abnormally on file %s\n", filename);
g_free (tmpname);
*status = STATUS_EXECUTION_ERROR;
return -1;
}
}
@ -420,8 +447,12 @@ load_image (char *filename, gint32 run_mode)
unlink (tmpname);
g_free (tmpname);
if (params[0].data.d_status == FALSE)
return -1;
*status = params[0].data.d_status;
if (params[0].data.d_status != STATUS_SUCCESS)
{
return -1;
}
else
{
gimp_image_set_filename (params[1].data.d_int32, filename);
@ -429,47 +460,52 @@ load_image (char *filename, gint32 run_mode)
}
}
static int valid_file (char* filename)
static gboolean
valid_file (gchar* filename)
{
int stat_res;
gint stat_res;
struct stat buf;
stat_res = stat(filename, &buf);
stat_res = stat (filename, &buf);
if ((0 == stat_res) && (buf.st_size > 0))
return 1;
return TRUE;
else
return 0;
return FALSE;
}
static char* find_extension (char* filename)
static gchar *
find_extension (gchar* filename)
{
char* filename_copy;
char* ext;
gchar *filename_copy;
gchar *ext;
/* we never free this copy - aren't we evil! */
filename_copy = malloc(strlen(filename)+1);
strcpy(filename_copy, filename);
filename_copy = g_malloc (strlen (filename) + 1);
strcpy (filename_copy, filename);
/* find the extension, boy! */
ext = strrchr (filename_copy, '.');
while (1) {
if (!ext || ext[1] == 0 || strchr(ext, '/'))
{
g_message (_("bz2: can't open bzip2ed file without a sensible extension\n"));
return NULL;
}
if (0 == strcmp(ext, ".xcfbz2")) {
return ".xcf"; /* we've found it */
while (1)
{
if (!ext || ext[1] == 0 || strchr (ext, '/'))
{
return NULL;
}
if (0 == strcmp (ext, ".xcfbz2"))
{
return ".xcf"; /* we've found it */
}
if (0 != strcmp (ext, ".bz2"))
{
return ext;
}
else
{
/* we found ".bz2" so strip it, loop back, and look again */
*ext = 0;
ext = strrchr (filename_copy, '.');
}
}
if (0 != strcmp(ext,".bz2")) {
return ext;
} else {
/* we found ".bz2" so strip it, loop back, and look again */
*ext = 0;
ext = strrchr (filename_copy, '.');
}
}
}

View file

@ -384,8 +384,9 @@ static gint
colortoalpha_dialog (GDrawable *drawable)
{
GtkWidget *dlg;
GtkWidget *button;
GtkWidget *frame;
GtkWidget *table;
GtkWidget *button;
GtkWidget *label;
guchar *color_cube;
@ -425,10 +426,15 @@ colortoalpha_dialog (GDrawable *drawable)
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
frame = gtk_frame_new (_("Color"));
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
table = gtk_table_new (1, 3, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_container_set_border_width (GTK_CONTAINER (table), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), table, TRUE, TRUE, 0);
gtk_table_set_col_spacings (GTK_TABLE (table), 6);
gtk_container_set_border_width (GTK_CONTAINER (table), 4);
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_widget_show (table);
label = gtk_label_new (_("From:"));
@ -440,7 +446,7 @@ colortoalpha_dialog (GDrawable *drawable)
PRV_WIDTH, PRV_HEIGHT,
pvals.color, 3);
gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1,
GTK_FILL, GTK_SHRINK, 4, 4) ;
GTK_FILL, GTK_SHRINK, 0, 0) ;
gtk_widget_show (button);
ppreview.color_button = button;

View file

@ -88,10 +88,11 @@
#include <process.h>
#endif
#include "config.h"
#include "libgimp/gimp.h"
#include <libgimp/gimp.h>
#include "libgimp/stdplugins-intl.h"
/* Author 1: Josh MacDonald (url.c) */
/* Author 2: Daniel Risacher (gz.c) */
@ -100,34 +101,37 @@
* that metric, I figure this plug-in is worth about $10,000 USD */
/* But you got it free. Magic of Gnu. */
static void query (void);
static void run (char *name,
int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals);
static gint32 load_image (char *filename, gint32 run_mode);
static gint save_image (char *filename,
gint32 image_ID,
gint32 drawable_ID,
gint32 run_mode);
static void query (void);
static void run (gchar *name,
gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals);
static int valid_file (char* filename) ;
static char* find_extension (char* filename);
static gint32 load_image (gchar *filename,
gint32 run_mode,
GStatusType *status /* return value */);
static GStatusType save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID,
gint32 run_mode);
static gboolean valid_file (gchar *filename);
static gchar * find_extension (gchar *filename);
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN ()
static void
query ()
query (void)
{
static GParamDef load_args[] =
{
@ -135,14 +139,13 @@ query ()
{ PARAM_STRING, "filename", "The name of the file to load" },
{ PARAM_STRING, "raw_filename", "The name entered" },
};
static GParamDef load_return_vals[] =
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
@ -152,7 +155,7 @@ query ()
{ PARAM_STRING, "filename", "The name of the file to save the image in" },
{ PARAM_STRING, "raw_filename", "The name of the file to save the image in" }
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -179,50 +182,50 @@ query ()
PROC_PLUG_IN,
nsave_args, 0,
save_args, NULL);
gimp_register_magic_load_handler ("file_gz_load", "xcf.gz,gz,xcfgz",
"", "0,string,\037\213");
gimp_register_save_handler ("file_gz_save", "xcf.gz,gz,xcfgz", "");
gimp_register_magic_load_handler ("file_gz_load",
"xcf.gz,gz,xcfgz",
"",
"0,string,\037\213");
gimp_register_save_handler ("file_gz_save",
"xcf.gz,gz,xcfgz",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
run_mode = param[0].data.d_int32;
INIT_I18N();
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_gz_load") == 0)
{
image_ID = load_image (param[1].data.d_string,
param[0].data.d_int32);
if (image_ID != -1)
param[0].data.d_int32,
&status);
if (image_ID != -1 &&
status == STATUS_SUCCESS)
{
*nreturn_vals = 2;
values[0].data.d_status = STATUS_SUCCESS;
values[1].type = PARAM_IMAGE;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
}
}
else if (strcmp (name, "file_gz_save") == 0)
{
@ -234,7 +237,7 @@ run (char *name,
/* Make sure all the arguments are there! */
if (nparams != 4)
status = STATUS_CALLING_ERROR;
break;
case RUN_WITH_LAST_VALS:
break;
@ -242,70 +245,76 @@ run (char *name,
break;
}
*nreturn_vals = 1;
if (save_image (param[3].data.d_string,
param[1].data.d_int32,
param[2].data.d_int32,
param[0].data.d_int32 ))
if (status == STATUS_SUCCESS)
{
values[0].data.d_status = STATUS_SUCCESS;
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = save_image (param[3].data.d_string,
param[1].data.d_int32,
param[2].data.d_int32,
param[0].data.d_int32);
}
}
else
g_assert (FALSE);
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
#ifdef __EMX__
static int spawn_gzip(char *filename, char* tmpname, char *parms, int *pid)
static gint
spawn_gzip (gchar *filename,
gchar *tmpname,
gchar *parms,
gint *pid)
{
FILE *f;
int tfd;
gint tfd;
if (!(f = fopen(filename,"w"))){
g_message("gz: fopen failed: %s\n", g_strerror(errno));
return -1;
}
if (!(f = fopen (filename,"w")))
{
g_message ("gz: fopen failed: %s\n", g_strerror (errno));
return -1;
}
/* save fileno(stdout) */
tfd = dup(fileno(stdout));
tfd = dup (fileno (stdout));
/* make stdout for this process be the output file */
if (dup2(fileno(f),fileno(stdout)) == -1)
if (dup2 (fileno (f), fileno (stdout)) == -1)
{
g_message ("gz: dup2 failed: %s\n", g_strerror(errno));
close(tfd);
g_message ("gz: dup2 failed: %s\n", g_strerror (errno));
close (tfd);
return -1;
}
fcntl(tfd, F_SETFD, FD_CLOEXEC);
fcntl (tfd, F_SETFD, FD_CLOEXEC);
*pid = spawnlp (P_NOWAIT, "gzip", "gzip", parms, tmpname, NULL);
fclose(f);
fclose (f);
/* restore fileno(stdout) */
dup2(tfd,fileno(stdout));
close(tfd);
dup2 (tfd, fileno (stdout));
close (tfd);
if (*pid == -1)
{
g_message ("gz: spawn failed: %s\n", g_strerror(errno));
g_message ("gz: spawn failed: %s\n", g_strerror (errno));
return -1;
}
return 0;
return 0;
}
#endif
static gint
save_image (char *filename,
static GStatusType
save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID,
gint32 run_mode)
{
GParam* params;
gint retvals;
char* ext;
char* tmpname;
gchar *ext;
gchar *tmpname;
#ifndef G_OS_WIN32
FILE* f;
int pid;
int status;
FILE *f;
gint pid;
gint status;
#else
SECURITY_ATTRIBUTES secattr;
HANDLE f;
@ -314,11 +323,11 @@ save_image (char *filename,
gchar *cmdline;
#endif
ext = find_extension(filename);
if (0 == *ext) {
g_message( _("gz: no sensible extension, saving as gzip'd xcf\n"));
ext = ".xcf";
}
if (NULL == (ext = find_extension (filename)))
{
g_message (_("gz: no sensible extension, saving as gzip'd xcf\n"));
ext = ".xcf";
}
/* get a temp name with the right extension and save into it. */
@ -326,6 +335,7 @@ save_image (char *filename,
&retvals,
PARAM_STRING, ext + 1,
PARAM_END);
tmpname = g_strdup (params[1].data.d_string);
gimp_destroy_params (params, retvals);
@ -338,11 +348,13 @@ save_image (char *filename,
PARAM_STRING, tmpname,
PARAM_END);
if (params[0].data.d_status == FALSE || !valid_file(tmpname)) {
unlink (tmpname);
g_free (tmpname);
return -1;
}
if (!valid_file (tmpname) ||
params[0].data.d_status != STATUS_SUCCESS)
{
unlink (tmpname);
g_free (tmpname);
return params[0].data.d_status;
}
/* if (! file_save(image_ID, tmpname, tmpname)) { */
/* unlink (tmpname); */
@ -350,48 +362,47 @@ save_image (char *filename,
/* } */
#ifndef G_OS_WIN32
#ifndef __EMX__
/* fork off a gzip process */
if ((pid = fork()) < 0)
if ((pid = fork ()) < 0)
{
g_message ("gz: fork failed: %s\n", g_strerror(errno));
g_message ("gz: fork failed: %s\n", g_strerror (errno));
g_free (tmpname);
return -1;
return STATUS_EXECUTION_ERROR;
}
else if (pid == 0)
{
if (!(f = fopen(filename,"w"))) {
g_message("gz: fopen failed: %s\n", g_strerror(errno));
g_free (tmpname);
_exit(127);
}
if (!(f = fopen (filename, "w")))
{
g_message ("gz: fopen failed: %s\n", g_strerror (errno));
g_free (tmpname);
_exit (127);
}
/* make stdout for this process be the output file */
if (-1 == dup2(fileno(f),fileno(stdout)))
g_message ("gz: dup2 failed: %s\n", g_strerror(errno));
if (-1 == dup2 (fileno (f), fileno (stdout)))
g_message ("gz: dup2 failed: %s\n", g_strerror (errno));
/* and gzip into it */
execlp ("gzip", "gzip", "-cf", tmpname, NULL);
g_message ("gz: exec failed: gzip: %s\n", g_strerror(errno));
g_message ("gz: exec failed: gzip: %s\n", g_strerror (errno));
g_free (tmpname);
_exit(127);
}
else
#else /* __EMX__ */
if (spawn_gzip(filename, tmpname, "-cf", &pid) == -1)
#else /* __EMX__ */
if (spawn_gzip (filename, tmpname, "-cf", &pid) == -1)
{
g_free (tmpname);
return -1;
return STATUS_EXECUTION_ERROR;
}
#endif
{
waitpid (pid, &status, 0);
if (!WIFEXITED(status) ||
WEXITSTATUS(status) != 0)
if (!WIFEXITED (status) ||
WEXITSTATUS (status) != 0)
{
g_message ("gz: gzip exited abnormally on file %s\n", tmpname);
g_free (tmpname);
@ -402,7 +413,7 @@ save_image (char *filename,
secattr.nLength = sizeof (SECURITY_ATTRIBUTES);
secattr.lpSecurityDescriptor = NULL;
secattr.bInheritHandle = TRUE;
if ((f = CreateFile (filename, GENERIC_WRITE, FILE_SHARE_READ,
&secattr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL))
== INVALID_HANDLE_VALUE)
@ -438,25 +449,26 @@ save_image (char *filename,
CloseHandle (f);
CloseHandle (processinfo.hThread);
WaitForSingleObject (processinfo.hProcess, INFINITE);
#endif /* G_OS_WIN32 */
unlink (tmpname);
g_free (tmpname);
return TRUE;
return STATUS_SUCCESS;
}
static gint32
load_image (char *filename, gint32 run_mode)
load_image (gchar *filename,
gint32 run_mode,
GStatusType *status /* return value */)
{
GParam* params;
gint retvals;
char* ext;
char* tmpname;
gchar *ext;
gchar *tmpname;
#ifndef G_OS_WIN32
int pid;
int status;
gint pid;
gint process_status;
#else
SECURITY_ATTRIBUTES secattr;
HANDLE f;
@ -465,10 +477,10 @@ load_image (char *filename, gint32 run_mode)
gchar *cmdline;
#endif
ext = find_extension(filename);
if (0 == *ext) {
g_message( _("gz: no sensible extension, attempting to load with file magic\n"));
}
if (NULL == (ext = find_extension (filename)))
{
g_message (_("gz: no sensible extension, attempting to load with file magic\n"));
}
/* find a temp name */
params = gimp_run_procedure ("gimp_temp_name",
@ -480,54 +492,56 @@ load_image (char *filename, gint32 run_mode)
gimp_destroy_params (params, retvals);
#ifndef G_OS_WIN32
#ifndef __EMX__
/* fork off a g(un)zip and wait for it */
if ((pid = fork()) < 0)
if ((pid = fork ()) < 0)
{
g_message ("gz: fork failed: %s\n", g_strerror(errno));
g_message ("gz: fork failed: %s\n", g_strerror (errno));
g_free (tmpname);
*status = STATUS_EXECUTION_ERROR;
return -1;
}
else if (pid == 0) /* child process */
{
FILE* f;
if (!(f = fopen(tmpname,"w"))){
g_message("gz: fopen failed: %s\n", g_strerror(errno));
g_free (tmpname);
_exit(127);
}
FILE *f;
if (!(f = fopen (tmpname, "w")))
{
g_message ("gz: fopen failed: %s\n", g_strerror (errno));
g_free (tmpname);
_exit(127);
}
/* make stdout for this child process be the temp file */
if (-1 == dup2(fileno(f),fileno(stdout)))
if (-1 == dup2 (fileno (f), fileno (stdout)))
{
g_free (tmpname);
g_message ("gz: dup2 failed: %s\n", g_strerror(errno));
g_message ("gz: dup2 failed: %s\n", g_strerror (errno));
}
/* and unzip into it */
execlp ("gzip", "gzip", "-cfd", filename, NULL);
g_message ("gz: exec failed: gunzip: %s\n", g_strerror(errno));
g_message ("gz: exec failed: gunzip: %s\n", g_strerror (errno));
g_free (tmpname);
_exit(127);
}
else /* parent process */
#else /* __EMX__ */
if (spawn_gzip(tmpname, filename, "-cfd", &pid) == -1)
if (spawn_gzip (tmpname, filename, "-cfd", &pid) == -1)
{
g_free (tmpname);
*status = STATUS_EXECUTION_ERROR;
return -1;
}
#endif
{
waitpid (pid, &status, 0);
waitpid (pid, &process_status, 0);
if (!WIFEXITED(status) ||
WEXITSTATUS(status) != 0)
if (!WIFEXITED (process_status) ||
WEXITSTATUS (process_status) != 0)
{
g_message ("gz: gzip exited abnormally on file %s\n", filename);
g_free (tmpname);
*status = STATUS_EXECUTION_ERROR;
return -1;
}
}
@ -535,7 +549,7 @@ load_image (char *filename, gint32 run_mode)
secattr.nLength = sizeof (SECURITY_ATTRIBUTES);
secattr.lpSecurityDescriptor = NULL;
secattr.bInheritHandle = TRUE;
if ((f = CreateFile (tmpname, GENERIC_WRITE, FILE_SHARE_READ,
&secattr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL))
== INVALID_HANDLE_VALUE)
@ -571,7 +585,6 @@ load_image (char *filename, gint32 run_mode)
CloseHandle (f);
CloseHandle (processinfo.hThread);
WaitForSingleObject (processinfo.hProcess, INFINITE);
#endif /* G_OS_WIN32 */
/* now that we un-gziped it, load the temp file */
@ -585,8 +598,12 @@ load_image (char *filename, gint32 run_mode)
unlink (tmpname);
g_free (tmpname);
if (params[0].data.d_status == FALSE)
return -1;
*status = params[0].data.d_status;
if (params[0].data.d_status != STATUS_SUCCESS)
{
return -1;
}
else
{
gimp_image_set_filename (params[1].data.d_int32, filename);
@ -594,46 +611,52 @@ load_image (char *filename, gint32 run_mode)
}
}
static int valid_file (char* filename)
static gboolean
valid_file (gchar *filename)
{
int stat_res;
gint stat_res;
struct stat buf;
stat_res = stat(filename, &buf);
if ((0 == stat_res) && (buf.st_size > 0))
return 1;
return TRUE;
else
return 0;
return FALSE;
}
static char* find_extension (char* filename)
static gchar *
find_extension (gchar *filename)
{
char* filename_copy;
char* ext;
gchar *filename_copy;
gchar *ext;
/* we never free this copy - aren't we evil! */
filename_copy = malloc(strlen(filename)+1);
strcpy(filename_copy, filename);
filename_copy = g_malloc (strlen (filename) + 1);
strcpy (filename_copy, filename);
/* find the extension, boy! */
ext = strrchr (filename_copy, '.');
while (1) {
if (!ext || ext[1] == 0 || strchr(ext, '/'))
{
return "";
}
if (0 == strcmp(ext, ".xcfgz")) {
return ".xcf"; /* we've found it */
while (1)
{
if (!ext || ext[1] == 0 || strchr (ext, '/'))
{
return NULL;
}
if (0 == strcmp (ext, ".xcfgz"))
{
return ".xcf"; /* we've found it */
}
if (0 != strcmp (ext,".gz"))
{
return ext;
}
else
{
/* we found ".gz" so strip it, loop back, and look again */
*ext = 0;
ext = strrchr (filename_copy, '.');
}
}
if (0 != strcmp(ext,".gz")) {
return ext;
} else {
/* we found ".gz" so strip it, loop back, and look again */
*ext = 0;
ext = strrchr (filename_copy, '.');
}
}
}

View file

@ -18,15 +18,23 @@
* This plugin is heavily based on the header plugin by Spencer Kimball and
* Peter Mattis.
*/
#include "config.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "config.h"
#include "libgimp/gimp.h"
#include "libgimp/gimpui.h"
#include <gtk/gtk.h>
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include "libgimp/stdplugins-intl.h"
#define DEFAULT_COMMENT "Created with The GIMP"
typedef struct
{
gchar *file_name;
@ -43,25 +51,39 @@ typedef struct
/* --- prototypes --- */
static void query (void);
static void run (gchar *name,
gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals);
static void run (gchar *name,
gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals);
static gint save_image (Config *config,
gint32 image_ID,
gint32 drawable_ID);
static gboolean run_save_dialog (Config *config);
static gint save_image (Config *config,
gint32 image_ID,
gint32 drawable_ID);
static void init_gtk (void);
static gboolean run_save_dialog (Config *config);
/* --- variables --- */
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init */
NULL, /* quit */
query, /* query */
run, /* run */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
Config config =
{
NULL, /* file_name */
"gimp_image", /* prefixed_name */
NULL, /* comment */
FALSE, /* use_comment */
TRUE, /* glib_types */
FALSE, /* alpha */
FALSE, /* use_macros */
FALSE, /* use_rle */
100.0, /* opacity */
};
/* --- implement main (), provided by libgimp --- */
@ -79,7 +101,7 @@ query (void)
{ PARAM_STRING, "filename", "The name of the file to save the image in" },
{ PARAM_STRING, "raw_filename", "The name of the file to save the image in" },
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -95,7 +117,9 @@ query (void)
nsave_args, 0,
save_args, NULL);
gimp_register_save_handler ("file_csource_save", "c", "");
gimp_register_save_handler ("file_csource_save",
"c",
"");
}
static void
@ -106,36 +130,29 @@ run (gchar *name,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
GimpExportReturnType export = EXPORT_CANCEL;
run_mode = param[0].data.d_int32;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (run_mode == RUN_INTERACTIVE &&
strcmp (name, "file_csource_save") == 0)
{
gint32 image_ID = param[1].data.d_int32;
gint32 image_ID = param[1].data.d_int32;
gint32 drawable_ID = param[2].data.d_int32;
Parasite *parasite;
gchar *x;
GDrawableType drawable_type = gimp_drawable_type (drawable_ID);
Config config =
{
NULL, /* file_name */
"gimp_image", /* prefixed_name */
NULL, /* comment */
FALSE, /* use_comment */
TRUE, /* glib_types */
FALSE, /* alpha */
FALSE, /* use_macros */
FALSE, /* use_rle */
100.0, /* opacity */
};
gimp_get_data ("file_csource_save", &config);
config.prefixed_name = "gimp_image";
config.comment = NULL;
config.file_name = param[3].data.d_string;
config.alpha = (drawable_type == RGBA_IMAGE ||
@ -151,7 +168,20 @@ run (gchar *name,
parasite_free (parasite);
}
x = config.comment;
if (!config.comment)
config.comment = g_strdup (DEFAULT_COMMENT);
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "C Source",
(CAN_HANDLE_RGB |
CAN_HANDLE_ALPHA));
if (export == EXPORT_CANCEL)
{
values[0].data.d_status = STATUS_CANCEL;
return;
}
if (run_save_dialog (&config))
{
if (x != config.comment &&
@ -170,26 +200,29 @@ run (gchar *name,
}
}
*nreturn_vals = 1;
export = gimp_export_image (&image_ID, &drawable_ID, "C Source",
(CAN_HANDLE_RGB | CAN_HANDLE_ALPHA));
if (export == EXPORT_CANCEL)
if (! save_image (&config, image_ID, drawable_ID))
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
return;
status = STATUS_EXECUTION_ERROR;
}
if (save_image (&config, image_ID, drawable_ID))
values[0].data.d_status = STATUS_SUCCESS;
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
{
gimp_set_data ("file_csource_save", &config, sizeof (config));
}
}
else
{
status = STATUS_CANCEL;
}
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
else
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
static gboolean
@ -204,7 +237,7 @@ diff2_rgba (guint8 *ip)
return ip[0] != ip[4] || ip[1] != ip[5] || ip[2] != ip[6] || ip[3] != ip[7];
}
static guint8*
static guint8 *
rl_encode_rgbx (guint8 *bp,
guint8 *ip,
guint8 *limit,
@ -347,7 +380,7 @@ save_image (Config *config,
gint32 image_ID,
gint32 drawable_ID)
{
GDrawable *drawable = gimp_drawable_get (drawable_ID);
GDrawable *drawable = gimp_drawable_get (drawable_ID);
GDrawableType drawable_type = gimp_drawable_type (drawable_ID);
GPixelRgn pixel_rgn;
gchar *s_uint_8, *s_uint_32, *s_uint, *s_char, *s_null;
@ -355,12 +388,13 @@ save_image (Config *config,
guint c;
gchar *macro_name;
guint8 *img_buffer, *img_buffer_end;
fp = fopen (config->file_name, "w");
if (!fp)
return FALSE;
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0, drawable->width, drawable->height, FALSE, FALSE);
gimp_pixel_rgn_init (&pixel_rgn, drawable,
0, 0, drawable->width, drawable->height, FALSE, FALSE);
if (1)
{
@ -404,7 +438,8 @@ save_image (Config *config,
img_buffer = data + pad;
if (config->use_rle)
{
img_buffer_end = rl_encode_rgbx (data, img_buffer, img_buffer + n_bytes, bpp);
img_buffer_end = rl_encode_rgbx (data, img_buffer,
img_buffer + n_bytes, bpp);
img_buffer = data;
}
else
@ -587,29 +622,26 @@ save_image (Config *config,
return TRUE;
}
static GtkWidget *prefixed_name;
static GtkWidget *centry;
static gboolean do_save = FALSE;
static void
cb_set_true (gboolean *bool_p)
save_dialog_ok_callback (GtkWidget *widget,
gpointer data)
{
*bool_p = TRUE;
do_save = TRUE;
config.prefixed_name =
g_strdup (gtk_entry_get_text (GTK_ENTRY (prefixed_name)));
config.comment = g_strdup (gtk_entry_get_text (GTK_ENTRY (centry)));
gtk_widget_destroy (GTK_WIDGET (data));
}
static gboolean
run_save_dialog (Config *config)
static void
init_gtk (void)
{
GtkWidget *dialog;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *button;
GtkWidget *prefixed_name;
GtkWidget *centry;
GtkWidget *alpha;
GtkWidget *use_macros;
GtkWidget *use_rle;
GtkWidget *gtype;
GtkWidget *use_comment;
GtkWidget *any;
GtkObject *opacity;
gboolean do_save = FALSE;
gchar **argv;
gint argc;
@ -619,14 +651,24 @@ run_save_dialog (Config *config)
gtk_init (&argc, &argv);
gtk_rc_parse (gimp_gtkrc ());
}
static gboolean
run_save_dialog (Config *config)
{
GtkWidget *dialog;
GtkWidget *vbox;
GtkWidget *table;
GtkWidget *toggle;
GtkObject *adj;
dialog = gimp_dialog_new ( _("Save as C-Source"), "csource",
dialog = gimp_dialog_new (_("Save as C-Source"), "csource",
gimp_plugin_help_func, "filters/csource.html",
GTK_WIN_POS_MOUSE,
FALSE, TRUE, FALSE,
_("OK"), cb_set_true,
NULL, &do_save, &button, TRUE, FALSE,
_("OK"), save_dialog_ok_callback,
NULL, NULL, NULL, TRUE, FALSE,
_("Cancel"), gtk_widget_destroy,
NULL, 1, NULL, FALSE, TRUE,
@ -636,172 +678,111 @@ run_save_dialog (Config *config)
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (dialog));
vbox = gtk_vbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox);
gtk_widget_show (vbox);
table = gtk_table_new (2, 2, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_table_set_row_spacings (GTK_TABLE (table), 4);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
gtk_widget_show (table);
/* Prefixed Name
*/
hbox = gtk_widget_new (GTK_TYPE_HBOX,
"visible", TRUE,
"parent", vbox,
NULL);
gtk_widget_new (GTK_TYPE_LABEL,
"label", _("Prefixed Name: "),
"xalign", 0.0,
"visible", TRUE,
"parent", hbox,
NULL);
prefixed_name = gtk_widget_new (GTK_TYPE_ENTRY,
"visible", TRUE,
"parent", hbox,
NULL);
prefixed_name = gtk_entry_new ();
gimp_table_attach_aligned (GTK_TABLE (table), 0,
_("Prefixed Name:"), 1.0, 0.5,
prefixed_name, FALSE);
gtk_entry_set_text (GTK_ENTRY (prefixed_name),
config->prefixed_name ? config->prefixed_name : "");
gtk_widget_ref (prefixed_name);
/* Comment Entry
*/
hbox = gtk_widget_new (GTK_TYPE_HBOX,
"visible", TRUE,
"parent", vbox,
NULL);
gtk_widget_new (GTK_TYPE_LABEL,
"label", _("Comment: "),
"xalign", 0.0,
"visible", TRUE,
"parent", hbox,
NULL);
centry = gtk_widget_new (GTK_TYPE_ENTRY,
"visible", TRUE,
"parent", hbox,
NULL);
centry = gtk_entry_new ();
gimp_table_attach_aligned (GTK_TABLE (table), 1,
_("Comment:"), 1.0, 0.5,
centry, FALSE);
gtk_entry_set_text (GTK_ENTRY (centry),
config->comment ? config->comment : "");
gtk_widget_ref (centry);
/* Use Comment
*/
hbox = gtk_widget_new (GTK_TYPE_HBOX,
"visible", TRUE,
"parent", vbox,
NULL);
use_comment = gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
"label", _("Save comment to file?"),
"visible", TRUE,
"parent", hbox,
NULL);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (use_comment), config->use_comment);
gtk_widget_ref (use_comment);
toggle = gtk_check_button_new_with_label (_("Save Comment to File"));
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
config->use_comment);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&config->use_comment);
gtk_widget_show (toggle);
/* GLib types
*/
hbox = gtk_widget_new (GTK_TYPE_HBOX,
"visible", TRUE,
"parent", vbox,
NULL);
gtype = gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
"label", _("Use GLib types (guint8*)"),
"visible", TRUE,
"parent", hbox,
NULL);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtype), config->glib_types);
gtk_widget_ref (gtype);
toggle = gtk_check_button_new_with_label (_("Use GLib Types (guint8*)"));
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
config->glib_types);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&config->glib_types);
gtk_widget_show (toggle);
/* Use Macros
*/
hbox = gtk_widget_new (GTK_TYPE_HBOX,
"visible", TRUE,
"parent", vbox,
NULL);
use_macros = gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
"label", _("Use macros instead of struct"),
"visible", TRUE,
"parent", hbox,
NULL);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (use_macros), config->use_macros);
gtk_widget_ref (use_macros);
toggle = gtk_check_button_new_with_label (_("Use Macros instead of Struct"));
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
config->use_macros);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&config->use_macros);
gtk_widget_show (toggle);
/* Use RLE
*/
hbox = gtk_widget_new (GTK_TYPE_HBOX,
"visible", TRUE,
"parent", vbox,
NULL);
use_rle = gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
"label", _("Use 1 Byte Run-Length-Encoding"),
"visible", TRUE,
"parent", hbox,
NULL);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (use_rle), config->use_rle);
gtk_widget_ref (use_rle);
toggle = gtk_check_button_new_with_label (_("Use 1 Byte Run-Length-Encoding"));
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
config->use_rle);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&config->use_rle);
gtk_widget_show (toggle);
/* Alpha
*/
hbox = gtk_widget_new (GTK_TYPE_HBOX,
"visible", TRUE,
"parent", vbox,
NULL);
alpha = gtk_widget_new (GTK_TYPE_CHECK_BUTTON,
"label", _("Save Alpha channel (RGBA/RGB)"),
"visible", TRUE,
"parent", hbox,
NULL);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (alpha), config->alpha);
gtk_widget_ref (alpha);
toggle = gtk_check_button_new_with_label (_("Save Alpha Channel (RGBA/RGB)"));
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
config->alpha);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&config->alpha);
gtk_widget_show (toggle);
/* Max Alpha Value
*/
hbox = gtk_widget_new (GTK_TYPE_HBOX,
"visible", TRUE,
"parent", vbox,
NULL);
gtk_widget_new (GTK_TYPE_LABEL,
"label", _("Opacity: "),
"xalign", 0.0,
"visible", TRUE,
"parent", hbox,
NULL);
opacity = gtk_adjustment_new (config->opacity,
0,
100,
0.1,
5.0,
0);
any = gtk_spin_button_new (GTK_ADJUSTMENT (opacity), 0, 1);
gtk_widget_set (any,
"visible", TRUE,
"parent", hbox,
NULL);
gtk_object_ref (opacity);
table = gtk_table_new (1, 3, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
gtk_widget_show (table);
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
_("Opacity:"), 100, 0,
config->opacity, 0, 100, 1, 10, 1,
FALSE, FALSE);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&config->opacity);
gtk_widget_show (dialog);
gtk_main ();
gdk_flush ();
config->prefixed_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (prefixed_name)));
config->use_macros = GTK_TOGGLE_BUTTON (use_macros)->active;
config->use_rle = GTK_TOGGLE_BUTTON (use_rle)->active;
config->alpha = GTK_TOGGLE_BUTTON (alpha)->active;
config->glib_types = GTK_TOGGLE_BUTTON (gtype)->active;
config->comment = g_strdup (gtk_entry_get_text (GTK_ENTRY (centry)));
config->use_comment = GTK_TOGGLE_BUTTON (use_comment)->active;
config->opacity = GTK_ADJUSTMENT (opacity)->value;
gtk_widget_unref (gtype);
gtk_widget_unref (centry);
gtk_widget_unref (alpha);
gtk_widget_unref (use_macros);
gtk_widget_unref (use_rle);
gtk_widget_unref (use_comment);
gtk_widget_unref (prefixed_name);
gtk_object_unref (opacity);
if (!config->prefixed_name || !config->prefixed_name[0])
config->prefixed_name = "tmp";
if (config->comment && !config->comment[0])

View file

@ -28,13 +28,10 @@
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include <libgimp/gimpmath.h>
#include "libgimp/stdplugins-intl.h"
#ifndef RAND_MAX
#define RAND_MAX 2147483647
#endif /* RAND_MAX */
#define SCALE_WIDTH 125
#define BLACK 0
#define BG 1
@ -745,7 +742,7 @@ fp_rand (gdouble val)
{
gdouble rand_val;
rand_val = (gdouble) rand () / (gdouble) (RAND_MAX - 1);
rand_val = (gdouble) rand () / (gdouble) (G_MAXRAND - 1);
return rand_val * val;
}

View file

@ -451,7 +451,7 @@ gint p_gimp_rotate(gint32 image_id, gint32 drawable_id, gint32 interpolation, gd
#endif
l_rc = -1;
l_angle_rad = (angle_deg * 3.14159) / 180.0;
l_angle_rad = (angle_deg * G_PI) / 180.0;
l_nparams = p_pdb_procedure_available(l_rotate_proc);
if (l_nparams >= 0)

View file

@ -814,7 +814,9 @@ dialog_update_preview (void)
dint.preview_row, 0, y, PREVIEW_WIDTH);
gtk_progress_bar_update (GTK_PROGRESS_BAR (dint.progress),
(double) y / (PREVIEW_HEIGHT - 1));
(double) y / (double) (PREVIEW_HEIGHT - 1));
gtk_widget_draw (dint.progress, NULL);
gdk_flush ();
py += dy;
}

View file

@ -75,11 +75,6 @@ typedef struct
typedef struct
{
GtkWidget *amount_x;
GtkWidget *amount_y;
GtkWidget *menu_x;
GtkWidget *menu_y;
gint run;
} DisplaceInterface;
@ -122,14 +117,6 @@ static void displace_map_y_callback (gint32 id,
gpointer data);
static void displace_ok_callback (GtkWidget *widget,
gpointer data);
static void displace_toggle_update (GtkWidget *widget,
gpointer data);
static void displace_x_toggle_update (GtkWidget *widget,
gpointer data);
static void displace_y_toggle_update (GtkWidget *widget,
gpointer data);
static void displace_entry_callback (GtkWidget *widget,
gpointer data);
static gdouble displace_map_give_value (guchar* ptr,
gint alpha,
gint bytes);
@ -137,10 +124,10 @@ static gdouble displace_map_give_value (guchar* ptr,
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
static DisplaceVals dvals =
@ -156,10 +143,6 @@ static DisplaceVals dvals =
static DisplaceInterface dint =
{
NULL, /* amount_x */
NULL, /* amount_y */
NULL, /* menu_x */
NULL, /* menu_y */
FALSE /* run */
};
@ -219,9 +202,8 @@ run (gchar *name,
drawable = gimp_drawable_get (param[2].data.d_drawable);
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = status;
switch (run_mode)
@ -240,16 +222,18 @@ run (gchar *name,
INIT_I18N();
/* Make sure all the arguments are there! */
if (nparams != 10)
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS)
{
dvals.amount_x = param[3].data.d_float;
dvals.amount_y = param[4].data.d_float;
dvals.do_x = param[5].data.d_int32;
dvals.do_y = param[6].data.d_int32;
status = STATUS_CALLING_ERROR;
}
else
{
dvals.amount_x = param[3].data.d_float;
dvals.amount_y = param[4].data.d_float;
dvals.do_x = param[5].data.d_int32;
dvals.do_y = param[6].data.d_int32;
dvals.displace_map_x = param[7].data.d_int32;
dvals.displace_map_y = param[8].data.d_int32;
dvals.displace_type = param[9].data.d_int32;
dvals.displace_type = param[9].data.d_int32;
}
break;
@ -294,18 +278,15 @@ displace_dialog (GDrawable *drawable)
GtkWidget *toggle_hbox;
GtkWidget *frame;
GtkWidget *table;
GtkWidget *entry;
GtkWidget *spinbutton;
GtkObject *adj;
GtkWidget *option_menu;
GtkWidget *menu;
GtkWidget *sep;
GSList *group = NULL;
gchar **argv;
gchar buffer[32];
gint argc;
gint use_wrap = (dvals.displace_type == WRAP);
gint use_smear = (dvals.displace_type == SMEAR);
gint use_black = (dvals.displace_type == BLACK);
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("displace");
@ -340,110 +321,126 @@ displace_dialog (GDrawable *drawable)
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
table = gtk_table_new (3, 3, FALSE);
table = gtk_table_new (4, 3, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 4);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_container_set_border_width (GTK_CONTAINER (table), 4);
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_table_set_row_spacings (GTK_TABLE (table), 4);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
/* on_x, on_y */
/* X options */
toggle = gtk_check_button_new_with_label (_("X Displacement:"));
gtk_table_attach (GTK_TABLE (table), toggle, 0, 1, 0, 1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) displace_x_toggle_update,
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&dvals.do_x);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), dvals.do_x);
gtk_widget_show (toggle);
toggle = gtk_check_button_new_with_label (_("Y Displacement:"));
gtk_table_attach (GTK_TABLE (table), toggle, 0, 1, 1, 2,
spinbutton = gimp_spin_button_new (&adj, dvals.amount_x,
(gint) drawable->width * -2,
drawable->width * 2,
1, 10, 0, 1, 2);
gtk_table_attach (GTK_TABLE (table), spinbutton, 1, 2, 0, 1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) displace_y_toggle_update,
&dvals.do_y);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), dvals.do_y);
gtk_widget_show (toggle);
/* amount_x, amount_y */
dint.amount_x = entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_set_usize (entry, ENTRY_WIDTH, 0);
g_snprintf (buffer, sizeof (buffer), "%f", dvals.amount_x);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) displace_entry_callback,
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&dvals.amount_x);
gtk_widget_set_sensitive (dint.amount_x, dvals.do_x);
gtk_widget_show (entry);
dint.amount_y = entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_set_usize (entry, ENTRY_WIDTH, 0);
g_snprintf (buffer, sizeof (buffer), "%f", dvals.amount_y);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) displace_entry_callback,
&dvals.amount_y);
gtk_widget_set_sensitive (dint.amount_y, dvals.do_y);
gtk_widget_show (entry);
gtk_widget_set_sensitive (spinbutton, dvals.do_x);
gtk_object_set_data (GTK_OBJECT (toggle), "set_sensitive", spinbutton);
gtk_widget_show (spinbutton);
/* menu_x, menu_y */
dint.menu_x = option_menu = gtk_option_menu_new ();
option_menu = gtk_option_menu_new ();
gtk_table_attach (GTK_TABLE (table), option_menu, 2, 3, 0, 1,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
menu = gimp_drawable_menu_new (displace_map_constrain, displace_map_x_callback,
drawable, dvals.displace_map_x);
gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu);
gtk_widget_set_sensitive (dint.menu_x, dvals.do_x);
gtk_widget_set_sensitive (option_menu, dvals.do_x);
gtk_object_set_data (GTK_OBJECT (spinbutton), "set_sensitive", option_menu);
gtk_widget_show (option_menu);
dint.menu_y = option_menu = gtk_option_menu_new ();
/* Y Options */
toggle = gtk_check_button_new_with_label (_("Y Displacement:"));
gtk_table_attach (GTK_TABLE (table), toggle, 0, 1, 1, 2,
GTK_FILL, GTK_FILL, 0, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&dvals.do_y);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), dvals.do_y);
gtk_widget_show (toggle);
spinbutton = gimp_spin_button_new (&adj, dvals.amount_y,
(gint) drawable->height * -2,
drawable->height * 2,
1, 10, 0, 1, 2);
gtk_table_attach (GTK_TABLE (table), spinbutton, 1, 2, 1, 2,
GTK_FILL, GTK_FILL, 0, 0);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&dvals.amount_y);
gtk_widget_set_sensitive (spinbutton, dvals.do_y);
gtk_object_set_data (GTK_OBJECT (toggle), "set_sensitive", spinbutton);
gtk_widget_show (spinbutton);
option_menu = gtk_option_menu_new ();
gtk_table_attach (GTK_TABLE (table), option_menu, 2, 3, 1, 2,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
menu = gimp_drawable_menu_new (displace_map_constrain, displace_map_y_callback,
drawable, dvals.displace_map_y);
gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu);
gtk_widget_set_sensitive (dint.menu_y, dvals.do_y);
gtk_widget_set_sensitive (option_menu, dvals.do_y);
gtk_object_set_data (GTK_OBJECT (spinbutton), "set_sensitive", option_menu);
gtk_widget_show (option_menu);
/* Displacement Type */
sep = gtk_hseparator_new ();
gtk_table_attach_defaults (GTK_TABLE (table), sep, 0, 3, 2, 3);
gtk_widget_show (sep);
toggle_hbox = gtk_hbox_new (FALSE, 6);
gtk_container_border_width (GTK_CONTAINER (toggle_hbox), 5);
gtk_table_attach (GTK_TABLE (table), toggle_hbox, 0, 3, 2, 3,
gtk_table_attach (GTK_TABLE (table), toggle_hbox, 0, 3, 3, 4,
GTK_FILL, GTK_FILL, 0, 0);
label = gtk_label_new ( _("On Edges: "));
label = gtk_label_new ( _("On Edges:"));
gtk_box_pack_start (GTK_BOX (toggle_hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
toggle = gtk_radio_button_new_with_label (group, _("Wrap"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_box_pack_start (GTK_BOX (toggle_hbox), toggle, FALSE, FALSE, 0);
gtk_object_set_user_data (GTK_OBJECT (toggle), (gpointer) WRAP);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) displace_toggle_update,
&use_wrap);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), use_wrap);
GTK_SIGNAL_FUNC (gimp_radio_button_update),
&dvals.displace_type);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
dvals.displace_type == WRAP);
gtk_widget_show (toggle);
toggle = gtk_radio_button_new_with_label (group, _("Smear"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_box_pack_start (GTK_BOX (toggle_hbox), toggle, FALSE, FALSE, 0);
gtk_object_set_user_data (GTK_OBJECT (toggle), (gpointer) SMEAR);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) displace_toggle_update,
&use_smear);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), use_smear);
GTK_SIGNAL_FUNC (gimp_radio_button_update),
&dvals.displace_type);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
dvals.displace_type == SMEAR);
gtk_widget_show (toggle);
toggle = gtk_radio_button_new_with_label (group, _("Black"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_box_pack_start (GTK_BOX (toggle_hbox), toggle, FALSE, FALSE, 0);
gtk_object_set_user_data (GTK_OBJECT (toggle), (gpointer) BLACK);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) displace_toggle_update,
&use_black);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), use_black);
GTK_SIGNAL_FUNC (gimp_radio_button_update),
&dvals.displace_type);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
dvals.displace_type == BLACK);
gtk_widget_show (toggle);
gtk_widget_show (toggle_hbox);
@ -454,14 +451,6 @@ displace_dialog (GDrawable *drawable)
gtk_main ();
gdk_flush ();
/* determine displace type */
if (use_wrap)
dvals.displace_type = WRAP;
else if (use_smear)
dvals.displace_type = SMEAR;
else if (use_black)
dvals.displace_type = BLACK;
return dint.run;
}
@ -530,7 +519,8 @@ displace (GDrawable *drawable)
if (dvals.displace_map_x != -1 && dvals.do_x)
{
map_x = gimp_drawable_get (dvals.displace_map_x);
gimp_pixel_rgn_init (&map_x_rgn, map_x, x1, y1, (x2 - x1), (y2 - y1), FALSE, FALSE);
gimp_pixel_rgn_init (&map_x_rgn, map_x,
x1, y1, (x2 - x1), (y2 - y1), FALSE, FALSE);
if (gimp_drawable_has_alpha(map_x->id))
xm_alpha = 1;
xm_bytes = gimp_drawable_bpp(map_x->id);
@ -541,7 +531,8 @@ displace (GDrawable *drawable)
if (dvals.displace_map_y != -1 && dvals.do_y)
{
map_y = gimp_drawable_get (dvals.displace_map_y);
gimp_pixel_rgn_init (&map_y_rgn, map_y, x1, y1, (x2 - x1), (y2 - y1), FALSE, FALSE);
gimp_pixel_rgn_init (&map_y_rgn, map_y,
x1, y1, (x2 - x1), (y2 - y1), FALSE, FALSE);
if (gimp_drawable_has_alpha(map_y->id))
ym_alpha = 1;
ym_bytes = gimp_drawable_bpp(map_y->id);
@ -549,7 +540,8 @@ displace (GDrawable *drawable)
else
map_y = NULL;
gimp_pixel_rgn_init (&dest_rgn, drawable, x1, y1, (x2 - x1), (y2 - y1), TRUE, TRUE);
gimp_pixel_rgn_init (&dest_rgn, drawable,
x1, y1, (x2 - x1), (y2 - y1), TRUE, TRUE);
/* Register the pixel regions */
if (dvals.do_x && dvals.do_y)
@ -683,19 +675,19 @@ displace_map_give_value (guchar *pt,
static GTile *
displace_pixel (GDrawable * drawable,
GTile * tile,
gint width,
gint height,
gint x1,
gint y1,
gint x2,
gint y2,
gint x,
gint y,
gint * row,
gint * col,
guchar * pixel)
displace_pixel (GDrawable *drawable,
GTile *tile,
gint width,
gint height,
gint x1,
gint y1,
gint x2,
gint y2,
gint x,
gint y,
gint *row,
gint *col,
guchar *pixel)
{
static guchar empty_pixel[4] = {0, 0, 0, 0};
guchar *data;
@ -776,9 +768,9 @@ bilinear (gdouble x,
/* Displace interface functions */
static gint
displace_map_constrain (gint32 image_id,
gint32 drawable_id,
gpointer data)
displace_map_constrain (gint32 image_id,
gint32 drawable_id,
gpointer data)
{
GDrawable *drawable;
@ -795,15 +787,15 @@ displace_map_constrain (gint32 image_id,
}
static void
displace_map_x_callback (gint32 id,
gpointer data)
displace_map_x_callback (gint32 id,
gpointer data)
{
dvals.displace_map_x = id;
}
static void
displace_map_y_callback (gint32 id,
gpointer data)
displace_map_y_callback (gint32 id,
gpointer data)
{
dvals.displace_map_y = id;
}
@ -815,66 +807,3 @@ displace_ok_callback (GtkWidget *widget,
dint.run = TRUE;
gtk_widget_destroy (GTK_WIDGET (data));
}
static void
displace_toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}
static void
displace_x_toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
if (dint.amount_x)
gtk_widget_set_sensitive (dint.amount_x, *toggle_val);
if (dint.menu_x)
gtk_widget_set_sensitive (dint.menu_x, *toggle_val);
}
static void
displace_y_toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
if (dint.amount_y)
gtk_widget_set_sensitive (dint.amount_y, *toggle_val);
if (dint.menu_y)
gtk_widget_set_sensitive (dint.menu_y, *toggle_val);
}
static void
displace_entry_callback (GtkWidget *widget,
gpointer data)
{
double *text_val;
text_val = (double *) data;
*text_val = atof (gtk_entry_get_text (GTK_ENTRY (widget)));
}

View file

@ -39,12 +39,9 @@
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include <plug-ins/megawidget/megawidget.h>
#include "libgimp/stdplugins-intl.h"
static mw_preview_t emboss_do_preview;
enum
{
FUNCTION_BUMPMAP = 0,
@ -87,6 +84,27 @@ struct embossFilter
gdouble bg;
} Filter;
/* preview stuff -- to be removed as soon as we have a real libgimp preview */
struct mwPreview
{
gint width;
gint height;
gint bpp;
gdouble scale;
guchar *bits;
};
#define PREVIEW_SIZE 100
static gint do_preview = TRUE;
static GtkWidget * mw_preview_new (GtkWidget *parent,
struct mwPreview *mwp);
static struct mwPreview * mw_preview_build (GDrawable *drw);
static void query (void);
static void run (gchar *name,
gint nparam,
@ -94,8 +112,10 @@ static void run (gchar *name,
gint *nretvals,
GParam **retvals);
static gint pluginCore (struct piArgs *argp);
static gint pluginCoreIA (struct piArgs *argp);
static gint pluginCore (struct piArgs *argp);
static gint pluginCoreIA (struct piArgs *argp);
static void emboss_do_preview (GtkWidget *preview);
static inline void EmbossInit (gdouble azimuth,
gdouble elevation,
@ -190,7 +210,7 @@ run (gchar *name,
args.img = param[1].data.d_image;
args.drw = param[2].data.d_drawable;
drw = gimp_drawable_get (args.drw);
thePreview = mw_preview_build(drw);
thePreview = mw_preview_build (drw);
if (pluginCoreIA (&args) == -1)
{
@ -223,7 +243,7 @@ run (gchar *name,
rvals[0].data.d_status = STATUS_EXECUTION_ERROR;
break;
}
break;
break;
case RUN_WITH_LAST_VALS:
INIT_I18N();
@ -533,7 +553,7 @@ pluginCoreIA (struct piArgs *argp)
gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
preview = mw_preview_new (hbox, thePreview, &emboss_do_preview);
preview = mw_preview_new (hbox, thePreview);
gtk_object_set_data (GTK_OBJECT (preview), "piArgs", argp);
emboss_do_preview (preview);
@ -648,3 +668,121 @@ emboss_do_preview (GtkWidget *w)
gdk_flush ();
g_free (dst);
}
static void
mw_preview_toggle_callback (GtkWidget *widget,
gpointer data)
{
gimp_toggle_button_update (widget, data);
if (do_preview)
emboss_do_preview (NULL);
}
static struct mwPreview *
mw_preview_build_virgin (GDrawable *drw)
{
struct mwPreview *mwp;
mwp = g_new (struct mwPreview, 1);
if (drw->width > drw->height)
{
mwp->scale = (gdouble) drw->width / (gdouble) PREVIEW_SIZE;
mwp->width = PREVIEW_SIZE;
mwp->height = drw->height / mwp->scale;
}
else
{
mwp->scale = (gdouble) drw->height / (gdouble) PREVIEW_SIZE;
mwp->height = PREVIEW_SIZE;
mwp->width = drw->width / mwp->scale;
}
mwp->bpp = 3;
mwp->bits = NULL;
return mwp;
}
static struct mwPreview *
mw_preview_build (GDrawable *drw)
{
struct mwPreview *mwp;
gint x, y, b;
guchar *bc;
guchar *drwBits;
GPixelRgn pr;
mwp = mw_preview_build_virgin (drw);
gimp_pixel_rgn_init (&pr, drw, 0, 0, drw->width, drw->height, FALSE, FALSE);
drwBits = g_new (guchar, drw->width * drw->bpp);
bc = mwp->bits = g_new (guchar, mwp->width * mwp->height * mwp->bpp);
for (y = 0; y < mwp->height; y++)
{
gimp_pixel_rgn_get_row (&pr, drwBits, 0, (int)(y*mwp->scale), drw->width);
for (x = 0; x < mwp->width; x++)
{
for (b = 0; b < mwp->bpp; b++)
*bc++ = *(drwBits +
((gint) (x * mwp->scale) * drw->bpp) + b % drw->bpp);
}
}
g_free (drwBits);
return mwp;
}
static GtkWidget *
mw_preview_new (GtkWidget *parent,
struct mwPreview *mwp)
{
GtkWidget *preview;
GtkWidget *frame;
GtkWidget *pframe;
GtkWidget *vbox;
GtkWidget *button;
guchar *color_cube;
gtk_preview_set_gamma (gimp_gamma ());
gtk_preview_set_install_cmap (gimp_install_cmap ());
color_cube = gimp_color_cube ();
gtk_preview_set_color_cube (color_cube[0], color_cube[1],
color_cube[2], color_cube[3]);
gtk_widget_set_default_visual (gtk_preview_get_visual ());
gtk_widget_set_default_colormap (gtk_preview_get_cmap ());
frame = gtk_frame_new (_("Preview"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_box_pack_start (GTK_BOX (parent), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
vbox = gtk_vbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
gtk_widget_show (vbox);
pframe = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME(pframe), GTK_SHADOW_IN);
gtk_box_pack_start (GTK_BOX (vbox), pframe, FALSE, FALSE, 0);
gtk_widget_show (pframe);
preview = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_size (GTK_PREVIEW (preview), mwp->width, mwp->height);
gtk_container_add (GTK_CONTAINER (pframe), preview);
gtk_widget_show (preview);
button = gtk_check_button_new_with_label (_("Do Preview"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), do_preview);
gtk_signal_connect (GTK_OBJECT (button), "toggled",
GTK_SIGNAL_FUNC (mw_preview_toggle_callback),
&do_preview);
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
gtk_widget_show (button);
return preview;
}

View file

@ -263,6 +263,8 @@ doDialog (void)
GtkWidget *dialog;
GtkWidget *mainbox;
GtkWidget *frame;
GtkWidget *abox;
GtkWidget *pframe;
GtkWidget *table;
GtkWidget *colorbutton;
GtkObject *adj;
@ -319,9 +321,19 @@ doDialog (void)
gtk_box_pack_start (GTK_BOX (mainbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
abox = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
gtk_container_add (GTK_CONTAINER (frame), abox);
gtk_widget_show (abox);
pframe = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (pframe), GTK_SHADOW_IN);
gtk_container_set_border_width (GTK_CONTAINER (pframe), 4);
gtk_container_add (GTK_CONTAINER (abox), pframe);
gtk_widget_show (pframe);
preview = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_size (GTK_PREVIEW (preview), prev_width, prev_height);
gtk_container_add (GTK_CONTAINER (frame), preview);
gtk_container_add (GTK_CONTAINER (pframe), preview);
update_preview ();
gtk_widget_show (preview);

File diff suppressed because it is too large Load diff

View file

@ -37,19 +37,21 @@
#include <gtk/gtk.h>
#include "libgimp/gimp.h"
#include "libgimp/gimpui.h"
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include "app/brush_header.h"
#include "libgimp/stdplugins-intl.h"
#include "app/brush_header.h"
/* Declare local data types
*/
typedef struct {
char description[256];
unsigned int spacing;
typedef struct
{
gchar description[256];
gint spacing;
} t_info;
t_info info =
@ -58,19 +60,19 @@ t_info info =
10
};
int run_flag = 0;
gint run_flag = FALSE;
/* Declare some local functions.
*/
static void query (void);
static void run (char *name,
int nparams,
static void run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals);
static gint32 load_image (char *filename);
static gint save_image (char *filename,
static gint32 load_image (gchar *filename);
static gint save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID);
@ -83,17 +85,17 @@ static void entry_callback (GtkWidget *widget,
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN ()
static void
query ()
query (void)
{
static GParamDef load_args[] =
{
@ -101,13 +103,13 @@ query ()
{ PARAM_STRING, "filename", "The name of the file to load" },
{ PARAM_STRING, "raw_filename", "The name of the file to load" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static GParamDef load_return_vals[] =
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
@ -119,7 +121,7 @@ query ()
{ PARAM_INT32, "spacing", "Spacing of the brush" },
{ PARAM_STRING, "description", "Short description of the brush" },
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -147,31 +149,35 @@ query ()
nsave_args, 0,
save_args, NULL);
gimp_register_magic_load_handler ("file_gbr_load", "gbr", "", "20,string,GIMP");
gimp_register_save_handler ("file_gbr_save", "gbr", "");
gimp_register_magic_load_handler ("file_gbr_load",
"gbr",
"",
"20,string,GIMP");
gimp_register_save_handler ("file_gbr_save",
"gbr",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
gint32 image_ID;
gint32 drawable_ID;
GStatusType status = STATUS_SUCCESS;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
GimpExportReturnType export = EXPORT_CANCEL;
run_mode = param[0].data.d_int32;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = -1;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_gbr_load") == 0)
{
@ -179,12 +185,14 @@ run (char *name,
if (image_ID != -1)
{
values[0].data.d_status = STATUS_SUCCESS;
*nreturn_vals = 2;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
} else {
values[0].data.d_status = STATUS_EXECUTION_ERROR;
}
*nreturn_vals = 2;
}
else
{
status = STATUS_EXECUTION_ERROR;
}
}
else if (strcmp (name, "file_gbr_save") == 0)
{
@ -196,59 +204,72 @@ run (char *name,
{
case RUN_INTERACTIVE:
case RUN_WITH_LAST_VALS:
INIT_I18N_UI();
INIT_I18N_UI();
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "GBR",
CAN_HANDLE_GRAY);
if (export == EXPORT_CANCEL)
{
*nreturn_vals = 1;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
default:
INIT_I18N();
INIT_I18N();
break;
}
switch (run_mode)
{
case RUN_INTERACTIVE:
/* Possibly retrieve data */
gimp_get_data("file_gbr_save", &info);
if (!save_dialog())
return;
/* Possibly retrieve data */
gimp_get_data ("file_gbr_save", &info);
if (! save_dialog ())
status = STATUS_CANCEL;
break;
case RUN_NONINTERACTIVE: /* FIXME - need a real RUN_NONINTERACTIVE */
if (nparams != 7)
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS)
{
status = STATUS_CALLING_ERROR;
}
else
{
info.spacing = (param[5].data.d_int32);
strncpy (info.description, param[6].data.d_string, 256);
}
break;
case RUN_WITH_LAST_VALS:
gimp_get_data ("file_gbr_save", &info);
break;
}
*nreturn_vals = 1;
if (save_image (param[3].data.d_string, image_ID, drawable_ID))
if (status == STATUS_SUCCESS)
{
gimp_set_data ("file_gbr_save", &info, sizeof(info));
values[0].data.d_status = STATUS_SUCCESS;
} else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (save_image (param[3].data.d_string, image_ID, drawable_ID))
{
gimp_set_data ("file_gbr_save", &info, sizeof(info));
}
else
{
status = STATUS_EXECUTION_ERROR;
}
}
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
else
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
static gint32
load_image (char *filename)
load_image (gchar *filename)
{
char *temp;
int fd;
@ -323,7 +344,8 @@ load_image (char *filename)
gimp_image_set_filename (image_ID, filename);
layer_ID = gimp_layer_new (image_ID, _("Background"), ph.width, ph.height,
(ph.bytes >= 3) ? RGB_IMAGE : GRAY_IMAGE, 100, NORMAL_MODE);
(ph.bytes >= 3) ? RGB_IMAGE : GRAY_IMAGE, 100,
NORMAL_MODE);
gimp_image_add_layer (image_ID, layer_ID, 0);
drawable = gimp_drawable_get (layer_ID);
@ -378,7 +400,7 @@ save_image (char *filename,
if (fd == -1)
{
g_message( _("Unable to open %s"), filename);
return 0;
return FALSE;
}
ph.header_size = g_htonl(sizeof(ph) + strlen(info.description) + 1);
@ -392,14 +414,14 @@ save_image (char *filename,
if (write(fd, &ph, sizeof(ph)) != sizeof(ph))
{
close(fd);
return 0;
return FALSE;
}
if (write(fd, info.description, strlen(info.description) + 1) !=
strlen(info.description) + 1)
{
close(fd);
return 0;
return FALSE;
}
buffer = g_malloc(drawable->width * drawable->bpp);
@ -409,7 +431,7 @@ save_image (char *filename,
if (write(fd, buffer, drawable->width * drawable->bpp) !=
drawable->width * drawable->bpp) {
close(fd);
return 0;
return FALSE;
}
gimp_progress_update((double) line / (double) drawable->height);
}
@ -417,11 +439,11 @@ save_image (char *filename,
close(fd);
return 1;
return TRUE;
}
static void
init_gtk ()
init_gtk (void)
{
gchar **argv;
gint argc;
@ -438,10 +460,10 @@ static gint
save_dialog (void)
{
GtkWidget *dlg;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *table;
gchar buffer[12];
GtkWidget *entry;
GtkWidget *spinbutton;
GtkObject *adj;
dlg = gimp_dialog_new (_("Save as Brush"), "gbr",
gimp_plugin_help_func, "filters/gbr.html",
@ -461,57 +483,30 @@ save_dialog (void)
/* The main table */
table = gtk_table_new (2, 2, FALSE);
gtk_container_border_width (GTK_CONTAINER (table), 6);
gtk_container_set_border_width (GTK_CONTAINER (table), 6);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), table, TRUE, TRUE, 0);
gtk_widget_show (table);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
/**********************
* label
**********************/
label = gtk_label_new (_("Spacing:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label);
/************************
* The entry
************************/
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_widget_set_usize (entry, 200, 0);
g_snprintf (buffer, sizeof (buffer), "%i", info.spacing);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
GTK_SIGNAL_FUNC (entry_callback),
spinbutton = gimp_spin_button_new (&adj,
info.spacing, 1, 1000, 1, 10, 0, 1, 0);
gimp_table_attach_aligned (GTK_TABLE (table), 0,
_("Spacing:"), 1.0, 0.5,
spinbutton, TRUE);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
&info.spacing);
gtk_widget_show (entry);
/**********************
* label
**********************/
label = gtk_label_new (_("Description:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label);
/************************
* The entry
************************/
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_widget_set_usize (entry, 200, 0);
gimp_table_attach_aligned (GTK_TABLE (table), 1,
_("Description:"), 1.0, 0.5,
entry, FALSE);
gtk_entry_set_text (GTK_ENTRY (entry), info.description);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
GTK_SIGNAL_FUNC (entry_callback),
info.description);
gtk_widget_show (entry);
gtk_widget_show (dlg);
@ -533,8 +528,5 @@ static void
entry_callback (GtkWidget *widget,
gpointer data)
{
if (data == info.description)
strncpy (info.description, gtk_entry_get_text (GTK_ENTRY (widget)), 256);
else if (data == &info.spacing)
info.spacing = atoi (gtk_entry_get_text (GTK_ENTRY (widget)));
strncpy (info.description, gtk_entry_get_text (GTK_ENTRY (widget)), 256);
}

View file

@ -36,8 +36,8 @@
#include <gtk/gtk.h>
#include "libgimp/gimp.h"
#include "libgimp/gimpui.h"
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include "libgimp/stdplugins-intl.h"
@ -54,13 +54,13 @@ typedef struct
/* Declare some local functions.
*/
static void query (void);
static void run (char *name,
int nparams,
static void run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals);
static gint32 load_image (char *filename);
static gint save_image (char *filename,
static gint32 load_image (gchar *filename);
static gint save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID);
@ -74,10 +74,10 @@ static void entry_callback (GtkWidget *widget,
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
static GIconSaveVals givals =
@ -93,7 +93,7 @@ static GIconSaveInterface giint =
MAIN ()
static void
query ()
query (void)
{
static GParamDef load_args[] =
{
@ -105,8 +105,9 @@ query ()
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
@ -117,7 +118,7 @@ query ()
{ PARAM_STRING, "raw_filename", "The name of the file to save the image in" },
{ PARAM_STRING, "icon_name", "The name of the icon" }
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -145,31 +146,34 @@ query ()
nsave_args, 0,
save_args, NULL);
gimp_register_load_handler ("file_gicon_load", "ico", "");
gimp_register_save_handler ("file_gicon_save", "ico", "");
gimp_register_load_handler ("file_gicon_load",
"ico",
"");
gimp_register_save_handler ("file_gicon_save",
"ico",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
gint32 image_ID;
gint32 drawable_ID;
GStatusType status = STATUS_SUCCESS;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
GimpExportReturnType export = EXPORT_CANCEL;
run_mode = param[0].data.d_int32;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = -1;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_gicon_load") == 0)
{
@ -177,14 +181,14 @@ run (char *name,
if (image_ID != -1)
{
values[0].data.d_status = STATUS_SUCCESS;
*nreturn_vals = 2;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = STATUS_EXECUTION_ERROR;
}
*nreturn_vals = 2;
}
else if (strcmp (name, "file_gicon_save") == 0)
{
@ -196,18 +200,19 @@ run (char *name,
{
case RUN_INTERACTIVE:
case RUN_WITH_LAST_VALS:
INIT_I18N_UI();
INIT_I18N_UI();
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "GIcon",
(CAN_HANDLE_GRAY | CAN_HANDLE_ALPHA));
(CAN_HANDLE_GRAY |
CAN_HANDLE_ALPHA));
if (export == EXPORT_CANCEL)
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
default:
INIT_I18N();
INIT_I18N();
break;
}
@ -219,15 +224,19 @@ run (char *name,
/* First acquire information with a dialog */
if (! save_dialog ())
return;
status = STATUS_CANCEL;
break;
case RUN_NONINTERACTIVE:
/* Make sure all the arguments are there! */
if (nparams != 6)
status = STATUS_CALLING_ERROR;
{
status = STATUS_CALLING_ERROR;
}
else
strncpy (givals.icon_name, param[5].data.d_string, 256);
{
strncpy (givals.icon_name, param[5].data.d_string, 256);
}
break;
case RUN_WITH_LAST_VALS:
@ -239,24 +248,32 @@ run (char *name,
break;
}
*nreturn_vals = 1;
if (save_image (param[3].data.d_string, image_ID, drawable_ID))
if (status == STATUS_SUCCESS)
{
/* Store persistent data */
gimp_set_data ("file_gicon_save", &givals, sizeof (GIconSaveVals));
values[0].data.d_status = STATUS_SUCCESS;
if (save_image (param[3].data.d_string, image_ID, drawable_ID))
{
/* Store persistent data */
gimp_set_data ("file_gicon_save", &givals, sizeof (GIconSaveVals));
}
else
{
status = STATUS_EXECUTION_ERROR;
}
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
else
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
static gint32
load_image (char *filename)
load_image (gchar *filename)
{
GDrawable *drawable;
GPixelRgn pixel_rgn;
@ -427,9 +444,8 @@ static gint
save_dialog (void)
{
GtkWidget *dlg;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *table;
GtkWidget *entry;
dlg = gimp_dialog_new (_("Save as GIcon"), "gicon",
gimp_plugin_help_func, "filters/gicon.html",
@ -449,29 +465,18 @@ save_dialog (void)
/* The main table */
table = gtk_table_new (1, 2, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_container_set_border_width (GTK_CONTAINER (table), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), table, TRUE, TRUE, 0);
gtk_widget_show (table);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
/**********************
* label
**********************/
label = gtk_label_new (_("Icon Name:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label);
/************************
* The entry
************************/
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_widget_set_usize (entry, 200, 0);
gimp_table_attach_aligned (GTK_TABLE (table), 0,
_("Icon Name:"), 1.0, 0.5,
entry, FALSE);
gtk_entry_set_text (GTK_ENTRY (entry), givals.icon_name);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
GTK_SIGNAL_FUNC (entry_callback),
@ -491,6 +496,7 @@ ok_callback (GtkWidget *widget,
gpointer data)
{
giint.run = TRUE;
gtk_widget_destroy (GTK_WIDGET (data));
}

View file

@ -270,8 +270,8 @@
#include <string.h>
#include <ctype.h>
#include "libgimp/gimp.h"
#include "libgimp/gimpui.h"
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include "libgimp/stdplugins-intl.h"
@ -286,13 +286,19 @@
/* PS: I know that technically facehuggers aren't parasites,
the pupal-forms are. But facehuggers are ky00te. */
enum
{
DISPOSE_UNSPECIFIED,
DISPOSE_COMBINE,
DISPOSE_REPLACE
};
typedef struct
{
int interlace;
int loop;
int default_delay;
int default_dispose;
gint interlace;
gint loop;
gint default_delay;
gint default_dispose;
} GIFSaveVals;
typedef struct
@ -305,12 +311,12 @@ typedef struct
/* Declare some local functions.
*/
static void query (void);
static void run (char *name,
int nparams,
static void run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals);
static gint save_image (char *filename,
static gint save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID,
gint32 orig_image_ID);
@ -320,40 +326,31 @@ static gboolean boundscheck (gint32 image_ID);
static gboolean badbounds_dialog (void);
static void cropok_callback (GtkWidget *widget, gpointer data);
static void cropcancel_callback (GtkWidget *widget, gpointer data);
static gint save_dialog (gint32 image_ID);
static void save_ok_callback (GtkWidget *widget, gpointer data);
static void save_cancel_callback (GtkWidget *widget, gpointer data);
static void disposal_select_callback (GtkWidget *widget, gpointer data);
static void save_toggle_update (GtkWidget *widget, gpointer data);
static void save_entry_callback (GtkWidget *widget, gpointer data);
static void comment_entry_callback (GtkWidget *widget, gpointer data);
static gint radio_pressed[3];
static gboolean comment_was_edited = FALSE;
static gboolean can_crop;
static gboolean can_crop = FALSE;
static GRunModeType run_mode;
#ifdef FACEHUGGERS
Parasite* comment_parasite = NULL;
#endif
/* For compression code */
static int Interlace;
static gint Interlace;
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
static GIFSaveVals gsvals =
@ -370,11 +367,10 @@ static GIFSaveInterface gsint =
};
MAIN ()
static void
query ()
query (void)
{
static GParamDef save_args[] =
{
@ -388,7 +384,7 @@ query ()
{ PARAM_INT32, "default_delay", "(animated gif) Default delay between framese in milliseconds" },
{ PARAM_INT32, "default_dispose", "(animated gif) Default disposal type (0=`don't care`, 1=combine, 2=replace)" }
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
gimp_install_procedure ("file_gif_save",
@ -403,38 +399,39 @@ query ()
nsave_args, 0,
save_args, NULL);
gimp_register_save_handler ("file_gif_save", "gif", "");
gimp_register_save_handler ("file_gif_save",
"gif",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
gint32 orig_image_ID;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
gint32 orig_image_ID;
GimpExportReturnType export = EXPORT_CANCEL;
run_mode = param[0].data.d_int32;
*nreturn_vals = 2;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_gif_save") == 0)
{
INIT_I18N_UI();
init_gtk ();
image_ID = orig_image_ID = param[1].data.d_int32;
drawable_ID = param[2].data.d_int32;
image_ID = orig_image_ID = param[1].data.d_int32;
drawable_ID = param[2].data.d_int32;
/* eventually export the image */
switch (run_mode)
@ -442,12 +439,13 @@ run (char *name,
case RUN_INTERACTIVE:
case RUN_WITH_LAST_VALS:
export = gimp_export_image (&image_ID, &drawable_ID, "GIF",
(CAN_HANDLE_INDEXED | CAN_HANDLE_GRAY |
CAN_HANDLE_ALPHA | CAN_HANDLE_LAYERS_AS_ANIMATION));
(CAN_HANDLE_INDEXED |
CAN_HANDLE_GRAY |
CAN_HANDLE_ALPHA |
CAN_HANDLE_LAYERS_AS_ANIMATION));
if (export == EXPORT_CANCEL)
{
*nreturn_vals = 1;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
@ -462,42 +460,25 @@ run (char *name,
switch (run_mode)
{
case RUN_INTERACTIVE:
{
/* Possibly retrieve data */
gimp_get_data ("file_gif_save", &gsvals);
/* Possibly retrieve data */
gimp_get_data ("file_gif_save", &gsvals);
/* First acquire information with a dialog */
radio_pressed[0] =
radio_pressed[1] =
radio_pressed[2] = FALSE;
radio_pressed[gsvals.default_dispose] = TRUE;
if (! save_dialog (image_ID))
{
*nreturn_vals = 1;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
fflush(stdout);
return;
}
if (radio_pressed[0]) gsvals.default_dispose = 0x00;
else
if (radio_pressed[1]) gsvals.default_dispose = 0x01;
else
if (radio_pressed[2]) gsvals.default_dispose = 0x02;
}
/* First acquire information with a dialog */
if (! save_dialog (image_ID))
status = STATUS_CANCEL;
break;
case RUN_NONINTERACTIVE:
/* Make sure all the arguments are there! */
if (nparams != 9)
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS)
{
status = STATUS_CALLING_ERROR;
}
else
{
gsvals.interlace = (param[5].data.d_int32) ? TRUE : FALSE;
gsvals.loop = (param[6].data.d_int32) ? TRUE : FALSE;
gsvals.default_delay = param[7].data.d_int32;
gsvals.loop = (param[6].data.d_int32) ? TRUE : FALSE;
gsvals.default_delay = param[7].data.d_int32;
gsvals.default_dispose = param[8].data.d_int32;
}
break;
@ -511,32 +492,34 @@ run (char *name,
break;
}
*nreturn_vals = 1;
if (save_image (param[3].data.d_string,
image_ID,
drawable_ID,
orig_image_ID))
if (status == STATUS_SUCCESS)
{
/* Store psvals data */
gimp_set_data ("file_gif_save", &gsvals, sizeof (GIFSaveVals));
values[0].data.d_status = STATUS_SUCCESS;
if (save_image (param[3].data.d_string,
image_ID,
drawable_ID,
orig_image_ID))
{
/* Store psvals data */
gimp_set_data ("file_gif_save", &gsvals, sizeof (GIFSaveVals));
}
else
{
status = STATUS_EXECUTION_ERROR;
}
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
}
else /* Some layers were out of bounds and the user wishes
to abort. */
{
*nreturn_vals = 1;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = STATUS_CANCEL;
}
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
}
values[0].data.d_status = status;
}
#define MAXCOLORMAPSIZE 256
@ -546,12 +529,12 @@ run (char *name,
#define GRAYSCALE 1
#define COLOR 2
typedef unsigned char CMap[3][MAXCOLORMAPSIZE];
typedef guchar CMap[3][MAXCOLORMAPSIZE];
int verbose = FALSE;
char *globalcomment = NULL;
gint globalusecomment = TRUE;
gint verbose = FALSE;
gchar *globalcomment = NULL;
gint globalusecomment = TRUE;
@ -848,7 +831,7 @@ boundscheck (gint32 image_ID)
static gint
save_image (char *filename,
save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID,
gint32 orig_image_ID)
@ -1143,13 +1126,13 @@ save_image (char *filename,
}
static void
init_gtk ()
init_gtk (void)
{
gchar **argv;
gint argc;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("gif");
gtk_init (&argc, &argv);
@ -1157,15 +1140,13 @@ init_gtk ()
}
static gboolean
badbounds_dialog ( void )
badbounds_dialog (void)
{
GtkWidget *dlg;
GtkWidget *label;
GtkWidget *frame;
GtkWidget *vbox;
can_crop = FALSE;
dlg = gimp_dialog_new (_("GIF Warning"), "gif_warning",
gimp_plugin_help_func, "filters/gif.html#warning",
GTK_WIN_POS_MOUSE,
@ -1173,8 +1154,8 @@ badbounds_dialog ( void )
_("OK"), cropok_callback,
NULL, NULL, NULL, TRUE, FALSE,
_("Cancel"), cropcancel_callback,
NULL, NULL, NULL, FALSE, TRUE,
_("Cancel"), gtk_widget_destroy,
NULL, 1, NULL, FALSE, TRUE,
NULL);
@ -1185,12 +1166,12 @@ badbounds_dialog ( void )
/* the warning message */
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
vbox = gtk_vbox_new (FALSE, 5);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
gtk_container_add (GTK_CONTAINER (frame), vbox);
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
label= gtk_label_new (_("The image which you are trying to save as a GIF\n"
"contains layers which extend beyond the actual\n"
@ -1199,17 +1180,14 @@ badbounds_dialog ( void )
"You may choose whether to crop all of the layers to\n"
"the image borders, or cancel this save."));
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
gtk_widget_show(label);
gtk_widget_show (label);
gtk_widget_show(vbox);
gtk_widget_show(frame);
gtk_widget_show (vbox);
gtk_widget_show (frame);
gtk_widget_show(dlg);
gtk_widget_show (dlg);
gtk_main ();
gtk_widget_destroy (GTK_WIDGET (dlg));
gdk_flush ();
return can_crop;
@ -1220,14 +1198,15 @@ static gint
save_dialog (gint32 image_ID)
{
GtkWidget *dlg;
GtkWidget *main_vbox;
GtkWidget *toggle;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *spinbutton;
GtkObject *adj;
GtkWidget *text;
GtkWidget *frame;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *menu;
GtkWidget *disposal_option_menu;
GtkWidget *com_table;
GtkWidget *vscrollbar;
@ -1235,7 +1214,6 @@ save_dialog (gint32 image_ID)
Parasite* GIF2_CMNT;
#endif
gchar buffer[10];
gint32 nlayers;
gimp_image_get_layers (image_ID, &nlayers);
@ -1247,8 +1225,8 @@ save_dialog (gint32 image_ID)
_("OK"), save_ok_callback,
NULL, NULL, NULL, TRUE, FALSE,
_("Cancel"), save_cancel_callback,
NULL, NULL, NULL, FALSE, TRUE,
_("Cancel"), gtk_widget_destroy,
NULL, 1, NULL, FALSE, TRUE,
NULL);
@ -1256,37 +1234,40 @@ save_dialog (gint32 image_ID)
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
main_vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 6);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dlg)->vbox), main_vbox);
gtk_widget_show (main_vbox);
/* regular gif parameter settings */
frame = gtk_frame_new (_("GIF Options"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width (GTK_CONTAINER (frame), 10);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
vbox = gtk_vbox_new (FALSE, 5);
gtk_container_border_width (GTK_CONTAINER (vbox), 5);
gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
toggle = gtk_check_button_new_with_label (_("Interlace"));
gtk_box_pack_start (GTK_BOX (vbox), toggle, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) save_toggle_update,
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&gsvals.interlace);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), gsvals.interlace);
gtk_widget_show (toggle);
hbox = gtk_hbox_new(FALSE, 5);
gtk_container_border_width (GTK_CONTAINER (hbox), 0);
hbox = gtk_hbox_new (FALSE, 4);
gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
toggle = gtk_check_button_new_with_label (_("GIF Comment: "));
toggle = gtk_check_button_new_with_label (_("GIF Comment:"));
gtk_box_pack_start (GTK_BOX (hbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) save_toggle_update,
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&globalusecomment);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), 1);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), TRUE);
gtk_widget_show (toggle);
com_table = gtk_table_new (1, 1, FALSE);
/* gtk_container_border_width (GTK_CONTAINER (com_table), 10);*/
gtk_box_pack_start (GTK_BOX (hbox), com_table, TRUE, TRUE, 0);
text = gtk_text_new (NULL, NULL);
@ -1296,129 +1277,108 @@ save_dialog (gint32 image_ID)
GTK_EXPAND | GTK_SHRINK | GTK_FILL,
GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
if (globalcomment!=NULL)
if (globalcomment != NULL)
{
g_free(globalcomment);
g_free (globalcomment);
}
#ifdef FACEHUGGERS
GIF2_CMNT = gimp_image_parasite_find (image_ID, "gimp-comment");
if (GIF2_CMNT)
{
globalcomment = g_malloc(GIF2_CMNT->size);
strcpy(globalcomment, GIF2_CMNT->data);
}
else
{
if (GIF2_CMNT)
{
globalcomment = g_malloc (GIF2_CMNT->size);
strcpy (globalcomment, GIF2_CMNT->data);
}
else
{
#endif
/* globalcomment = g_malloc(1+strlen(_("Made with GIMP")));
/* globalcomment = g_malloc(1+strlen(_("Made with GIMP")));
strcpy(globalcomment, _("Made with GIMP")); */
globalcomment = NULL;
globalcomment = NULL;
#ifdef FACEHUGGERS
}
parasite_free (GIF2_CMNT);
}
parasite_free (GIF2_CMNT);
#endif
if (globalcomment)
gtk_text_insert(GTK_TEXT(text),NULL,NULL,NULL,globalcomment,-1);
gtk_signal_connect (GTK_OBJECT (text), "changed",
(GtkSignalFunc) comment_entry_callback,
NULL);
if (globalcomment)
gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, globalcomment, -1);
gtk_signal_connect (GTK_OBJECT (text), "changed",
GTK_SIGNAL_FUNC (comment_entry_callback),
NULL);
vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text)->vadj);
gtk_table_attach (GTK_TABLE (com_table), vscrollbar, 1, 2, 0, 1,
GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (vscrollbar);
gtk_widget_show (text);
gtk_widget_show (com_table);
gtk_widget_show (hbox);
gtk_widget_show (vbox);
gtk_widget_show (frame);
vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text)->vadj);
gtk_table_attach (GTK_TABLE (com_table), vscrollbar, 1, 2, 0, 1,
GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (vscrollbar);
gtk_widget_show (text);
gtk_widget_show (com_table);
gtk_widget_show (hbox);
gtk_widget_show (vbox);
gtk_widget_show (frame);
/* additional animated gif parameter settings */
frame = gtk_frame_new (_("Animated GIF Options"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width (GTK_CONTAINER (frame), 8);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
toggle = gtk_check_button_new_with_label (_("Loop forever"));
gtk_box_pack_start (GTK_BOX (vbox), toggle, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) save_toggle_update,
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&gsvals.loop);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), gsvals.loop);
gtk_widget_show (toggle);
/* default_delay entry field */
hbox = gtk_hbox_new (FALSE, 4);
gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
label = gtk_label_new (_("Delay between frames where unspecified: "));
label = gtk_label_new (_("Delay between Frames where Unspecified:"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
entry = gtk_entry_new ();
gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
gtk_widget_set_usize (entry, 80, 0);
g_snprintf (buffer, sizeof (buffer), "%d", gsvals.default_delay);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) save_entry_callback,
NULL);
gtk_widget_show (entry);
spinbutton = gimp_spin_button_new (&adj, gsvals.default_delay,
0, 65000, 10, 100, 0, 1, 0);
gtk_box_pack_start (GTK_BOX (hbox), spinbutton, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
&gsvals.default_delay);
gtk_widget_show (spinbutton);
label = gtk_label_new (_(" milliseconds"));
label = gtk_label_new (_("Milliseconds"));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
gtk_widget_show (hbox);
/* Disposal selector */
hbox = gtk_hbox_new (FALSE, 4);
gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
label = gtk_label_new (_("Frame disposal where unspecified: "));
label = gtk_label_new (_("Frame Disposal where Unspecified: "));
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
disposal_option_menu = gtk_option_menu_new();
{
GtkWidget *menu_item;
disposal_option_menu =
gimp_option_menu_new (gimp_menu_item_update,
&gsvals.default_dispose,
(gpointer) gsvals.default_dispose,
menu = gtk_menu_new();
{
menu_item = gtk_menu_item_new_with_label (_("I don't care"));
gtk_signal_connect( GTK_OBJECT(menu_item), "activate",
(GtkSignalFunc) disposal_select_callback,
&radio_pressed[0]);
gtk_container_add(GTK_CONTAINER(menu), menu_item);
gtk_widget_show(menu_item);
menu_item = gtk_menu_item_new_with_label (_("Cumulative layers (combine)"));
gtk_signal_connect( GTK_OBJECT(menu_item), "activate",
(GtkSignalFunc) disposal_select_callback,
&radio_pressed[1]);
gtk_container_add(GTK_CONTAINER(menu), menu_item);
gtk_widget_show(menu_item);
menu_item = gtk_menu_item_new_with_label (_("One frame per layer (replace)"));
gtk_signal_connect( GTK_OBJECT(menu_item), "activate",
(GtkSignalFunc) disposal_select_callback,
&radio_pressed[2]);
gtk_container_add(GTK_CONTAINER(menu), menu_item);
gtk_widget_show(menu_item);
}
}
gtk_option_menu_set_menu (GTK_OPTION_MENU(disposal_option_menu), menu);
gtk_option_menu_set_history(GTK_OPTION_MENU(disposal_option_menu),
gsvals.default_dispose);
gtk_widget_show(disposal_option_menu);
gtk_box_pack_start(GTK_BOX(hbox), disposal_option_menu, TRUE, TRUE, 2);
_("I don't Care"),
(gpointer) DISPOSE_UNSPECIFIED, NULL,
_("Cumulative Layers (Combine)"),
(gpointer) DISPOSE_COMBINE, NULL,
_("One Frame per Layer (Replace)"),
(gpointer) DISPOSE_REPLACE, NULL,
NULL);
gtk_box_pack_start (GTK_BOX (hbox), disposal_option_menu, FALSE, FALSE, 0);
gtk_widget_show (disposal_option_menu);
gtk_widget_show (hbox);
gtk_widget_show (vbox);
@ -1430,8 +1390,6 @@ save_dialog (gint32 image_ID)
gtk_widget_show (frame);
gtk_widget_show (dlg);
gtk_main ();
@ -1508,16 +1466,16 @@ GetPixel (int x,
*
*****************************************************************************/
static int Width, Height;
static int curx, cury;
static long CountDown;
static int Pass = 0;
static gint Width, Height;
static gint curx, cury;
static glong CountDown;
static gint Pass = 0;
/*
* Bump the 'curx' and 'cury' to point to the next pixel
*/
static void
BumpPixel ()
BumpPixel (void)
{
/*
* Bump the current X position
@ -2444,7 +2402,7 @@ char_out (int c)
* Flush the packet to disk, and reset the accumulator
*/
static void
flush_char ()
flush_char (void)
{
if (a_count > 0)
{
@ -2462,18 +2420,10 @@ cropok_callback (GtkWidget *widget,
gpointer data)
{
can_crop = TRUE;
gtk_main_quit ();
}
static void
cropcancel_callback (GtkWidget *widget,
gpointer data)
{
can_crop = FALSE;
gtk_main_quit ();
gtk_widget_destroy (GTK_WIDGET (data));
}
/* Save interface functions */
static void
@ -2481,56 +2431,10 @@ save_ok_callback (GtkWidget *widget,
gpointer data)
{
gsint.run = TRUE;
gtk_widget_destroy (GTK_WIDGET (data));
}
static void
save_cancel_callback (GtkWidget *widget,
gpointer data)
{
gsint.run = FALSE;
gtk_widget_destroy (GTK_WIDGET (data));
}
static void
disposal_select_callback (GtkWidget *widget,
gpointer data)
{
int* valptr;
valptr = (int*) data;
radio_pressed[0] = radio_pressed[1] = radio_pressed[2] = 0;
*valptr = 1;
}
static void
save_toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}
static void
save_entry_callback (GtkWidget *widget,
gpointer data)
{
gsvals.default_delay = atoi (gtk_entry_get_text (GTK_ENTRY (widget)));
if (gsvals.default_delay < 0)
gsvals.default_delay = 0;
if (gsvals.default_delay > 65000)
gsvals.default_delay = 65000;
}
static void
comment_entry_callback (GtkWidget *widget,
gpointer data)
@ -2538,27 +2442,25 @@ comment_entry_callback (GtkWidget *widget,
gint ssize;
gchar* str;
str = gtk_editable_get_chars(GTK_EDITABLE (widget),0,-1);
ssize = strlen(str);
str = gtk_editable_get_chars (GTK_EDITABLE (widget), 0, -1);
ssize = strlen (str);
/* Temporary kludge for overlength strings - just return */
if (ssize>240)
if (ssize > 240)
{
g_message (_("GIF save: Your comment string is too long.\n"));
g_free(str);
g_free (str);
return;
}
if (globalcomment!=NULL) g_free(globalcomment);
globalcomment = g_malloc(ssize+1);
if (globalcomment != NULL) g_free (globalcomment);
globalcomment = g_malloc (ssize + 1);
/*strcpy(globalcomment, gtk_entry_get_text (GTK_ENTRY (widget)));*/
strcpy(globalcomment, str);
g_free(str);
strcpy (globalcomment, str);
g_free (str);
comment_was_edited = TRUE;
/*g_print ("COMMENT: %s\n",globalcomment);*/
}
/* The End */

View file

@ -61,14 +61,17 @@
/* | provided "as is" without express or implied warranty. | */
/* +-------------------------------------------------------------------+ */
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "gtk/gtk.h"
#include "libgimp/gimp.h"
#include <gtk/gtk.h>
#include <libgimp/gimp.h>
#include "libgimp/stdplugins-intl.h"
@ -85,19 +88,15 @@
the pupal-forms are. But facehuggers are ky00te. */
/* Declare some local functions.
*/
static void query (void);
static void run (char *name,
int nparams,
static void run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals);
static gint32 load_image (char *filename);
static gint32 load_image (gchar *filename);
static guchar used_cmap[3][256];
@ -110,22 +109,19 @@ Parasite* comment_parasite = NULL;
#endif
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN ()
static void
query ()
query (void)
{
static GParamDef load_args[] =
{
@ -137,8 +133,9 @@ query ()
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
INIT_I18N();
@ -154,26 +151,30 @@ query ()
nload_args, nload_return_vals,
load_args, load_return_vals);
gimp_register_magic_load_handler ("file_gif_load", "gif", "", "0,string,GIF8");
gimp_register_magic_load_handler ("file_gif_load",
"gif",
"",
"0,string,GIF8");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
gint32 image_ID;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
run_mode = param[0].data.d_int32;
*nreturn_vals = 2;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_gif_load") == 0)
{
@ -201,15 +202,21 @@ run (char *name,
if (image_ID != -1)
{
values[0].data.d_status = STATUS_SUCCESS;
values[1].type = PARAM_IMAGE;
*nreturn_vals = 1;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = STATUS_EXECUTION_ERROR;
}
}
else
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
@ -271,7 +278,7 @@ static gint32 ReadImage (FILE *, char *, int, int, CMap, int, int, int, int,
static gint32
load_image (char *filename)
load_image (gchar *filename)
{
FILE *fd;
char * name_buf;

View file

@ -119,7 +119,8 @@ query (void)
{ PARAM_INT32, "spacing", "Spacing of the brush" },
{ PARAM_STRING, "description", "Short description of the brush" },
};
static int ngpb_save_args = sizeof (gpb_save_args) / sizeof (gpb_save_args[0]);
static gint ngpb_save_args = (sizeof (gpb_save_args) /
sizeof (gpb_save_args[0]));
static GParamDef gih_save_args[] =
{
@ -131,7 +132,8 @@ query (void)
{ PARAM_INT32, "spacing", "Spacing of the brush" },
{ PARAM_STRING, "description", "Short description of the brush pipe" },
};
static int ngih_save_args = sizeof (gih_save_args) / sizeof (gih_save_args[0]);
static gint ngih_save_args = (sizeof (gih_save_args) /
sizeof (gih_save_args[0]));
INIT_I18N();
@ -147,7 +149,9 @@ query (void)
ngpb_save_args, 0,
gpb_save_args, NULL);
gimp_register_save_handler ("file_gpb_save", "gpb", "");
gimp_register_save_handler ("file_gpb_save",
"gpb",
"");
gimp_install_procedure ("file_gih_save",
_("saves images in GIMP pixmap brush pipe format"),
@ -161,30 +165,25 @@ query (void)
ngih_save_args, 0,
gih_save_args, NULL);
gimp_register_save_handler ("file_gih_save", "gih", "");
gimp_register_save_handler ("file_gih_save",
"gih",
"");
}
static void
init_gtk (void)
{
gchar **argv;
gint argc;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("gpb");
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("gpb_save");
gtk_init (&argc, &argv);
gtk_rc_parse (gimp_gtkrc ());
}
static void
adjustment_callback (GtkWidget *widget,
gpointer data)
{
*((gint *) data) = GTK_ADJUSTMENT (widget)->value;
}
static void
size_adjustment_callback (GtkWidget *widget,
gpointer data)
@ -278,9 +277,7 @@ static void
common_save_dialog (GtkWidget *dlg,
GtkWidget *table)
{
GtkWidget *label;
GtkObject *adjustment;
GtkWidget *box;
GtkWidget *spinbutton;
GtkWidget *entry;
@ -296,55 +293,27 @@ common_save_dialog (GtkWidget *dlg,
/*
* Spacing: __
*/
gtk_table_resize (GTK_TABLE (table),
GTK_TABLE (table)->nrows + 1,
GTK_TABLE (table)->ncols);
label = gtk_label_new (_("Spacing (Percent):"));
gtk_misc_set_alignment (GTK_MISC (label), 1.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);
spinbutton = gimp_spin_button_new (&adjustment,
info.spacing, 1, 1000, 1, 10, 10,
1, 0);
box = gtk_hbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, TRUE, 0);
gtk_table_attach (GTK_TABLE (table), box, 1, 2,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
spinbutton = gimp_spin_button_new (&adjustment, info.spacing,
1, 1000, 1, 10, 10, 1, 0);
gimp_table_attach_aligned (GTK_TABLE (table), 0,
_("Spacing (Percent):"), 1.0, 0.5,
spinbutton, TRUE);
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
GTK_SIGNAL_FUNC (adjustment_callback),
GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
&info.spacing);
gtk_widget_show (spinbutton);
gtk_widget_show (box);
/*
* Description: ___________
*/
gtk_table_resize (GTK_TABLE (table),
GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols);
label = gtk_label_new (_("Description:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.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);
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry, 1, 2,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_widget_set_usize (entry, 200, 0);
gtk_entry_set_text (GTK_ENTRY (entry), info.description);
gimp_table_attach_aligned (GTK_TABLE (table), 1,
_("Description:"), 1.0, 0.5,
entry, FALSE);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
GTK_SIGNAL_FUNC (entry_callback),
info.description);
gtk_widget_show (entry);
}
static gint
@ -365,15 +334,14 @@ gpb_save_dialog (void)
/* The main table */
table = gtk_table_new (2, 2, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 4);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_container_set_border_width (GTK_CONTAINER (table), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), table, TRUE, TRUE, 0);
gtk_widget_show (table);
common_save_dialog (dlg, table);
gtk_table_set_row_spacings (GTK_TABLE (table), 4);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_widget_show (dlg);
gtk_main ();
@ -422,8 +390,10 @@ gih_save_dialog (gint32 image_ID)
NULL);
/* The main table */
table = gtk_table_new (2, 2, FALSE);
gtk_container_border_width (GTK_CONTAINER (table), 10);
table = gtk_table_new (8, 2, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 4);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_container_set_border_width (GTK_CONTAINER (table), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), table, TRUE, TRUE, 0);
gtk_widget_show (table);
@ -432,17 +402,6 @@ gih_save_dialog (gint32 image_ID)
/*
* 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), 1.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, 4);
spinbutton = gimp_spin_button_new (&adjustment,
@ -486,42 +445,25 @@ gih_save_dialog (gint32 image_ID)
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);
gimp_table_attach_aligned (GTK_TABLE (table), 2,
_("Cell Size:"), 1.0, 0.5,
box, FALSE);
g_free (layer_ID);
/*
* Number of cells: ___
*/
gtk_table_resize (GTK_TABLE (table),
GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols);
label = gtk_label_new (_("Number of Cells:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.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);
gtk_table_attach (GTK_TABLE (table), box, 1, 2,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_widget_show (box);
spinbutton = gimp_spin_button_new (&adjustment,
gihparms.ncells, 1, 1000, 1, 10, 10,
1, 0);
gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, TRUE, 0);
gimp_table_attach_aligned (GTK_TABLE (table), 3,
_("Number of Cells:"), 1.0, 0.5,
spinbutton, TRUE);
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
GTK_SIGNAL_FUNC (adjustment_callback),
GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
&gihparms.ncells);
gtk_widget_show (spinbutton);
if (gihparms.dim == 1)
cellw_adjust.ncells = cellh_adjust.ncells = adjustment;
@ -531,16 +473,6 @@ gih_save_dialog (gint32 image_ID)
/*
* Display as: __ rows x __ cols
*/
gtk_table_resize (GTK_TABLE (table),
GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols);
label = gtk_label_new (_("Display as:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.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);
g_snprintf (buffer, sizeof (buffer), "%2d", gihparms.rows);
@ -574,56 +506,26 @@ gih_save_dialog (gint32 image_ID)
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);
gtk_widget_show (box);
gimp_table_attach_aligned (GTK_TABLE (table), 4,
_("Display as:"), 1.0, 0.5,
box, FALSE);
/*
* Dimension: ___
*/
gtk_table_resize (GTK_TABLE (table),
GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols);
label = gtk_label_new (_("Dimension:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.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);
adjustment = gtk_adjustment_new (gihparms.dim, 1, 5, 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);
box = gtk_hbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, FALSE, 0);
gtk_table_attach (GTK_TABLE (table), box, 1, 2,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
spinbutton = gimp_spin_button_new (&adjustment, gihparms.dim,
1, 5, 1, 1, 1, 1, 0);
gimp_table_attach_aligned (GTK_TABLE (table), 5,
_("Dimension:"), 1.0, 0.5,
spinbutton, TRUE);
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
(GtkSignalFunc) adjustment_callback, &gihparms.dim);
gtk_widget_show (spinbutton);
gtk_widget_show (box);
GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
&gihparms.dim);
/*
* Ranks: __ __ __ __ __
*/
gtk_table_resize (GTK_TABLE (table),
GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols);
label = gtk_label_new (_("Ranks:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.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);
dimtable = gtk_table_new (1, PIXPIPE_MAXDIM, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (dimtable), 4);
for (i = 0; i < PIXPIPE_MAXDIM; i++)
@ -638,7 +540,7 @@ gih_save_dialog (gint32 image_ID)
1, 0);
gtk_box_pack_start (GTK_BOX (box), spinbutton, FALSE, TRUE, 0);
gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
GTK_SIGNAL_FUNC (adjustment_callback),
GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
&gihparms.rank[i]);
gtk_widget_show (spinbutton);
if (i == 0)
@ -649,25 +551,13 @@ gih_save_dialog (gint32 image_ID)
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,
GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_widget_show (dimtable);
gimp_table_attach_aligned (GTK_TABLE (table), 6,
_("Ranks:"), 1.0, 0.5,
dimtable, FALSE);
/*
* Selection: ______ ______ ______ ______ ______
*/
gtk_table_resize (GTK_TABLE (table),
GTK_TABLE (table)->nrows + 1, GTK_TABLE (table)->ncols);
label = gtk_label_new (_("Selection:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.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);
cbitems = g_list_append (cbitems, "incremental");
cbitems = g_list_append (cbitems, "angular");
cbitems = g_list_append (cbitems, "random");
@ -676,7 +566,7 @@ gih_save_dialog (gint32 image_ID)
cbitems = g_list_append (cbitems, "xtilt");
cbitems = g_list_append (cbitems, "ytilt");
box = gtk_hbox_new (FALSE, 4);
box = gtk_hbox_new (TRUE, 4);
for (i = 0; i < PIXPIPE_MAXDIM; i++)
{
cb = gtk_combo_new ();
@ -694,14 +584,9 @@ gih_save_dialog (gint32 image_ID)
&gihparms.selection[i]);
gtk_widget_show (cb);
}
gtk_table_attach (GTK_TABLE (table), box, 1, 2,
GTK_TABLE (table)->nrows - 1, GTK_TABLE (table)->nrows,
GTK_SHRINK, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_widget_show (box);
gtk_table_set_row_spacings (GTK_TABLE (table), 4);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gimp_table_attach_aligned (GTK_TABLE (table), 7,
_("Selection:"), 1.0, 0.5,
box, FALSE);
gtk_widget_show (dlg);
@ -1028,22 +913,23 @@ run (char *name,
GParam **return_vals)
{
static GParam values[1];
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
Parasite *pipe_parasite;
gint32 image_ID;
gint32 orig_image_ID;
gint32 drawable_ID, *layer_ID;
gint nlayers, layer;
gchar *layer_name;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
Parasite *pipe_parasite;
gint32 image_ID;
gint32 orig_image_ID;
gint32 drawable_ID;
gint32 *layer_ID;
gint nlayers, layer;
gchar *layer_name;
GimpExportReturnType export = EXPORT_CANCEL;
run_mode = param[0].data.d_int32;
*return_vals = values;
*return_vals = values;
*nreturn_vals = 1;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (run_mode == RUN_INTERACTIVE)
{
@ -1066,12 +952,12 @@ run (char *name,
case RUN_WITH_LAST_VALS:
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "GPB",
(CAN_HANDLE_RGB | CAN_HANDLE_ALPHA |
(CAN_HANDLE_RGB |
CAN_HANDLE_ALPHA |
NEEDS_ALPHA ));
if (export == EXPORT_CANCEL)
{
*nreturn_vals = 1;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
@ -1085,37 +971,38 @@ run (char *name,
/* Possibly retrieve data */
gimp_get_data ("file_gpb_save", &info);
if (!gpb_save_dialog ())
goto finish_gpb;
status = STATUS_CANCEL;
break;
case RUN_NONINTERACTIVE: /* FIXME - need a real RUN_NONINTERACTIVE */
if (nparams != 7)
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS)
{
status = STATUS_CALLING_ERROR;
}
else
{
info.spacing = param[5].data.d_int32;
strncpy (info.description, param[6].data.d_string, MAXDESCLEN);
info.description[MAXDESCLEN] = 0;
}
break;
case RUN_WITH_LAST_VALS:
gimp_get_data ("file_gpb_save", &info);
break;
}
if (gpb_save_image (param[3].data.d_string, image_ID, drawable_ID))
if (status == STATUS_SUCCESS)
{
gimp_set_data ("file_gpb_save", &info, sizeof (info));
status = STATUS_SUCCESS;
if (gpb_save_image (param[3].data.d_string, image_ID, drawable_ID))
{
gimp_set_data ("file_gpb_save", &info, sizeof (info));
}
else
{
status = STATUS_EXECUTION_ERROR;
}
}
else
status = STATUS_EXECUTION_ERROR;
finish_gpb:
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
else if (strcmp (name, "file_gih_save") == 0)
{
@ -1129,12 +1016,13 @@ run (char *name,
case RUN_WITH_LAST_VALS:
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "GIH",
(CAN_HANDLE_RGB | CAN_HANDLE_ALPHA |
CAN_HANDLE_LAYERS | NEEDS_ALPHA));
(CAN_HANDLE_RGB |
CAN_HANDLE_ALPHA |
CAN_HANDLE_LAYERS |
NEEDS_ALPHA));
if (export == EXPORT_CANCEL)
{
*nreturn_vals = 1;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
@ -1149,13 +1037,13 @@ run (char *name,
if (!gimp_drawable_has_alpha (layer_ID[layer]))
{
layer_name = gimp_layer_get_name (layer_ID[layer]);
g_message ( _("Layer %s doesn't have an alpha channel, skipped"),
g_message (_("Layer %s doesn't have an alpha channel, skipped"),
layer_name);
g_free (layer_name);
}
num_layers_with_alpha++;
}
IFDBG(2) g_message ("nlayers:%d num_layers_with_alpha:%d",
nlayers, num_layers_with_alpha);
switch (run_mode)
@ -1163,19 +1051,23 @@ run (char *name,
case RUN_INTERACTIVE:
/* Possibly retrieve data */
gimp_get_data ("file_gih_save", &info);
pipe_parasite = gimp_image_parasite_find (orig_image_ID, "gimp-brush-pipe-parameters");
pipe_parasite =
gimp_image_parasite_find (orig_image_ID,
"gimp-brush-pipe-parameters");
pixpipeparams_init (&gihparms);
if (pipe_parasite)
pixpipeparams_parse (pipe_parasite->data, &gihparms);
if (!gih_save_dialog (image_ID))
goto finish_gih;
status = STATUS_CANCEL;
break;
case RUN_NONINTERACTIVE: /* FIXME - need a real RUN_NONINTERACTIVE */
if (nparams != 7)
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS)
{
status = STATUS_CALLING_ERROR;
}
else
{
info.spacing = param[5].data.d_int32;
strncpy (info.description, param[6].data.d_string, MAXDESCLEN);
@ -1185,27 +1077,31 @@ run (char *name,
case RUN_WITH_LAST_VALS:
gimp_get_data ("file_gih_save", &info);
pipe_parasite = gimp_image_parasite_find (orig_image_ID, "gimp-brush-pipe-parameters");
pipe_parasite =
gimp_image_parasite_find (orig_image_ID,
"gimp-brush-pipe-parameters");
pixpipeparams_init (&gihparms);
if (pipe_parasite)
pixpipeparams_parse (pipe_parasite->data, &gihparms);
break;
}
if (gih_save_image (param[3].data.d_string,
image_ID, orig_image_ID, drawable_ID))
if (status == STATUS_SUCCESS)
{
gimp_set_data ("file_gih_save", &info, sizeof (info));
status = STATUS_SUCCESS;
if (gih_save_image (param[3].data.d_string,
image_ID, orig_image_ID, drawable_ID))
{
gimp_set_data ("file_gih_save", &info, sizeof (info));
}
else
{
status = STATUS_EXECUTION_ERROR;
}
}
else
status = STATUS_EXECUTION_ERROR;
finish_gih:
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
values[0].data.d_status = status;
}

View file

@ -46,13 +46,13 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <gtk/gtk.h>
#include "libgimp/gimp.h"
#include "libgimp/gimpui.h"
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include <libgimp/gimpmath.h>
#include "libgimp/stdplugins-intl.h"
@ -70,11 +70,12 @@
typedef gfloat vreg[3];
typedef struct _info {
int transformSequence [MAX_TRANSFORMS];
int source [MAX_TRANSFORMS];
int control [MAX_TRANSFORMS];
int dest [MAX_TRANSFORMS];
typedef struct _info
{
gint transformSequence [MAX_TRANSFORMS];
gint source [MAX_TRANSFORMS];
gint control [MAX_TRANSFORMS];
gint dest [MAX_TRANSFORMS];
} s_info;
#define PROJECTION 0
@ -89,20 +90,26 @@ typedef struct _info {
/** prototypes **************************************************************/
void query (void);
void run (char *name, int nparams, GParam *param, int *nreturn_vals, GParam **return_vals);
static void query (void);
static void run (gchar *name,
gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals);
void dialog_cancel ();
void dialog_new_variations (GtkWidget *widget, gpointer data);
void dialog_update_previews (GtkWidget *widget, gpointer data);
void dialog_select_preview (GtkWidget *widget, s_info *n_info);
int dialog_create ();
static gint dialog_create (void);
static void dialog_new_variations (GtkWidget *widget,
gpointer data);
static void dialog_update_previews (GtkWidget *widget,
gpointer data);
static void dialog_select_preview (GtkWidget *widget,
s_info *n_info);
s_info qbist_info;
static s_info qbist_info;
/** qbist functions *********************************************************/
void
static void
create_info (s_info *info)
{
int k;
@ -116,7 +123,7 @@ create_info (s_info *info)
info->dest[rand() % MAX_TRANSFORMS]=0;
}
void
static void
modify_info (s_info *o_info,
s_info *n_info)
{
@ -138,10 +145,10 @@ modify_info (s_info *o_info,
/*
* Optimizer
*/
int used_trans_flag[MAX_TRANSFORMS];
int used_reg_flag[NUM_REGISTERS];
static gint used_trans_flag[MAX_TRANSFORMS];
static gint used_reg_flag[NUM_REGISTERS];
void
static void
check_last_modified (s_info info,
int p,
int n)
@ -158,7 +165,7 @@ check_last_modified (s_info info,
}
}
void
static void
optimize (s_info info)
{
int i;
@ -182,14 +189,15 @@ optimize (s_info info)
check_last_modified(info, MAX_TRANSFORMS, 0);
}
void qbist (s_info info,
gchar *buffer,
int xp,
int yp,
int num,
int width,
int height,
int bpp)
static void
qbist (s_info info,
gchar *buffer,
int xp,
int yp,
int num,
int width,
int height,
int bpp)
{
gushort gx;
vreg reg [NUM_REGISTERS];
@ -302,55 +310,48 @@ void qbist (s_info info,
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run /* run_proc */
};
/* Definition of parameters */
GParamDef args[] =
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
{ PARAM_IMAGE, "image", "Input image (unused)" },
{ PARAM_DRAWABLE, "drawable", "Input drawable" }
};
GParamDef *return_vals = NULL;
int nargs = sizeof(args) / sizeof(args[0]);
int nreturn_vals = 0;
MAIN()
void
static void
query (void)
{
GParamDef args[] =
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
{ PARAM_IMAGE, "image", "Input image (unused)" },
{ PARAM_DRAWABLE, "drawable", "Input drawable" }
};
gint nargs = sizeof (args) / sizeof (args[0]);
INIT_I18N();
gimp_install_procedure (PLUG_IN_NAME,
_("Create images based on a random genetic formula"),
_("This Plug-in is based on an article by Jörn Loviscach (appeared in c't 10/95, page 326). It generates modern art pictures from a random genetic formula."),
"Jörn Loviscach, Jens Ch. Restemeier",
"Jörn Loviscach, Jens Ch. Restemeier",
PLUG_IN_VERSION,
N_("<Image>/Filters/Render/Pattern/Qbist..."),
"RGB*",
PROC_PLUG_IN,
nargs,
nreturn_vals,
args,
return_vals);
gimp_install_procedure (PLUG_IN_NAME,
_("Create images based on a random genetic formula"),
_("This Plug-in is based on an article by Jörn Loviscach (appeared in c't 10/95, page 326). It generates modern art pictures from a random genetic formula."),
"Jörn Loviscach, Jens Ch. Restemeier",
"Jörn Loviscach, Jens Ch. Restemeier",
PLUG_IN_VERSION,
N_("<Image>/Filters/Render/Pattern/Qbist..."),
"RGB*",
PROC_PLUG_IN,
nargs, 0,
args, NULL);
}
/* Return values */
GParam values[1];
void run (char *name,
int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals)
static void
run (gchar *name,
gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[1];
gint sel_x1, sel_y1, sel_x2, sel_y2;
gint img_height, img_width, img_bpp, img_has_alpha;
@ -458,26 +459,20 @@ void run (char *name,
/** User interface ***********************************************************/
GtkWidget *preview[9];
s_info info[9];
gint result;
static GtkWidget *preview[9];
static s_info info[9];
static gint result = FALSE;
void
dialog_cancel (GtkWidget *widget,
gpointer data)
{
gtk_widget_destroy (GTK_WIDGET (data));
}
void dialog_ok (GtkWidget *widget,
gpointer data)
static void
dialog_ok (GtkWidget *widget,
gpointer data)
{
result = TRUE;
gtk_widget_destroy (GTK_WIDGET (data));
}
void
static void
dialog_new_variations (GtkWidget *widget,
gpointer data)
{
@ -487,7 +482,7 @@ dialog_new_variations (GtkWidget *widget,
modify_info (&(info[0]), &(info[i]));
}
void
static void
dialog_update_previews (GtkWidget *widget,
gpointer data)
{
@ -508,7 +503,7 @@ dialog_update_previews (GtkWidget *widget,
}
}
void
static void
dialog_select_preview (GtkWidget *widget,
s_info *n_info)
{
@ -525,8 +520,8 @@ dialog_select_preview (GtkWidget *widget,
#define GETMACUSHORT(f) ((fgetc(f)<<8)+(fgetc(f)))
#define PUTMACUSHORT(u, f) fprintf(f, "%c%c", HIBITE(u), LOBITE(u));
int
load_data (char *name)
static gint
load_data (gchar *name)
{
int i;
FILE *f;
@ -544,8 +539,8 @@ load_data (char *name)
return 1;
}
void
save_data (char *name)
static void
save_data (gchar *name)
{
int i=0;
FILE *f;
@ -560,7 +555,7 @@ save_data (char *name)
fclose (f);
}
void
static void
file_selection_save (GtkWidget *widget,
GtkWidget *file_select)
{
@ -568,7 +563,7 @@ file_selection_save (GtkWidget *widget,
gtk_widget_destroy (file_select);
}
void
static void
file_selection_load (GtkWidget *widget,
GtkWidget *file_select)
{
@ -578,16 +573,9 @@ file_selection_load (GtkWidget *widget,
dialog_update_previews (widget, NULL);
}
void
file_selection_cancel (GtkWidget *widget,
GtkWidget *file_select)
{
gtk_widget_destroy (file_select);
}
void
static void
dialog_load (GtkWidget *widget,
gpointer d)
gpointer data)
{
GtkWidget *file_select;
@ -597,18 +585,20 @@ dialog_load (GtkWidget *widget,
"filters/gqbist.html");
gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (file_select)->ok_button),
"clicked", (GtkSignalFunc) file_selection_load,
(gpointer)file_select);
gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (file_select)->cancel_button),
"clicked", (GtkSignalFunc) file_selection_cancel,
(gpointer)file_select);
"clicked",
GTK_SIGNAL_FUNC (file_selection_load),
(gpointer) file_select);
gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (file_select)->cancel_button),
"clicked",
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (file_select));
gtk_widget_show (file_select);
}
void
static void
dialog_save (GtkWidget *widget,
gpointer d)
gpointer data)
{
GtkWidget *file_select;
@ -618,20 +608,24 @@ dialog_save (GtkWidget *widget,
gimp_help_connect_help_accel (file_select, gimp_plugin_help_func,
"filters/gqbist.html");
gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (file_select)->ok_button),
"clicked", (GtkSignalFunc) file_selection_save,
(gpointer)file_select);
gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (file_select)->cancel_button),
"clicked", (GtkSignalFunc) file_selection_cancel,
gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (file_select)->ok_button),
"clicked",
GTK_SIGNAL_FUNC (file_selection_save),
(gpointer)file_select);
gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (file_select)->cancel_button),
"clicked",
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (file_select));
gtk_widget_show (file_select);
}
int
static gint
dialog_create (void)
{
GtkWidget *dialog;
GtkWidget *vbox;
GtkWidget *bbox;
GtkWidget *button;
GtkWidget *table;
@ -667,12 +661,8 @@ dialog_create (void)
_("OK"), dialog_ok,
NULL, NULL, NULL, TRUE, FALSE,
_("Load"), dialog_load,
NULL, NULL, NULL, FALSE, FALSE,
_("Save"), dialog_save,
NULL, NULL, NULL, FALSE, FALSE,
_("Cancel"), dialog_cancel,
NULL, NULL, NULL, FALSE, TRUE,
_("Cancel"), gtk_widget_destroy,
NULL, 1, NULL, FALSE, TRUE,
NULL);
@ -680,12 +670,16 @@ dialog_create (void)
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
vbox = gtk_vbox_new (FALSE, 6);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox,
FALSE, FALSE, 0);
gtk_widget_show (vbox);
table = gtk_table_new (3, 3, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 5);
gtk_table_set_col_spacings (GTK_TABLE (table), 5);
gtk_container_set_border_width (GTK_CONTAINER (table), 5);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), table,
TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
gtk_widget_show (table);
memcpy ((char *) &(info[0]), (char *) &qbist_info, sizeof (s_info));
@ -693,12 +687,12 @@ dialog_create (void)
for (i = 0; i < 9; i++)
{
button = gtk_button_new();
button = gtk_button_new ();
gtk_signal_connect (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) dialog_select_preview,
GTK_SIGNAL_FUNC (dialog_select_preview),
(gpointer) &(info[(i+5)%9]));
gtk_table_attach (GTK_TABLE (table), button, i%3, (i%3)+1, i/3, (i/3)+1,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (button);
preview[i] = gtk_preview_new (GTK_PREVIEW_COLOR);
@ -707,11 +701,29 @@ dialog_create (void)
gtk_widget_show (preview[i]);
}
bbox = gtk_hbutton_box_new ();
gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, FALSE, 0);
gtk_widget_show (bbox);
button = gtk_button_new_with_label (_("Load"));
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_container_add (GTK_CONTAINER (bbox), button);
gtk_signal_connect (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (dialog_load),
NULL);
gtk_widget_show (button);
button = gtk_button_new_with_label (_("Save"));
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_container_add (GTK_CONTAINER (bbox), button);
gtk_signal_connect (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (dialog_save),
NULL);
gtk_widget_show (button);
dialog_update_previews (NULL, NULL);
gtk_widget_show (dialog);
result = FALSE;
gtk_main ();
gdk_flush ();

View file

@ -56,28 +56,30 @@
#include <gtk/gtk.h>
#include "libgimp/gimp.h"
#include "libgimp/gimpui.h"
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include "libgimp/stdplugins-intl.h"
/* Typedefs */
typedef struct {
char captiontxt[256];
char cellcontent[256];
char clwidth[256];
char clheight[256];
gint fulldoc;
gint caption;
gint border;
gint spantags;
gint tdcomp;
gint cellpadding;
gint cellspacing;
typedef struct
{
gchar captiontxt[256];
gchar cellcontent[256];
gchar clwidth[256];
gchar clheight[256];
gint fulldoc;
gint caption;
gint border;
gint spantags;
gint tdcomp;
gint cellpadding;
gint cellspacing;
} GTMValues;
typedef struct {
typedef struct
{
gint run;
} GTMInterface;
@ -106,37 +108,42 @@ static GTMValues gtmvals =
/* Declare some local functions */
static void query (void);
static void run (char *name,
int nparams,
static void run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals);
static gint save_image (char *filename,
GDrawable *drawable);
static gint save_dialog ();
static gint color_comp (guchar *buffer, guchar *buf2);
static void gtm_entry_callback (GtkWidget *widget, gpointer data);
static void gtm_toggle_callback (GtkWidget *widget, gpointer data);
static void save_ok_callback (GtkWidget *widget, gpointer data);
static void gtm_caption_callback (GtkWidget *widget, gpointer data);
static void gtm_cellcontent_callback (GtkWidget *widget, gpointer data);
static void gtm_clwidth_callback (GtkWidget *widget, gpointer data);
static void gtm_clheight_callback (GtkWidget *widget, gpointer data);
static gint save_image (gchar *filename,
GDrawable *drawable);
static gint save_dialog (void);
static gint color_comp (guchar *buffer,
guchar *buf2);
static void save_ok_callback (GtkWidget *widget,
gpointer data);
static void gtm_caption_callback (GtkWidget *widget,
gpointer data);
static void gtm_cellcontent_callback (GtkWidget *widget,
gpointer data);
static void gtm_clwidth_callback (GtkWidget *widget,
gpointer data);
static void gtm_clheight_callback (GtkWidget *widget,
gpointer data);
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN ()
static void
query ()
query (void)
{
static GParamDef save_args[] =
{
@ -146,8 +153,7 @@ query ()
{ PARAM_STRING, "filename", "The name of the file to save the image in" },
{ PARAM_STRING, "raw_filename", "The name of the file to save the image in" },
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -163,17 +169,20 @@ query ()
nsave_args, 0,
save_args, NULL);
gimp_register_save_handler ("file_GTM_save", "html,htm", "");
gimp_register_save_handler ("file_GTM_save",
"html,htm",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GStatusType status = STATUS_SUCCESS;
GDrawable *drawable;
INIT_I18N_UI();
@ -181,24 +190,34 @@ run (char *name,
drawable = gimp_drawable_get (param[2].data.d_int32);
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
gimp_get_data ("file_GTM_save", &gtmvals);
if (save_dialog ()) {
save_image (param[3].data.d_string, drawable);
values[0].data.d_status = STATUS_SUCCESS;
}
if (save_dialog ())
{
if (save_image (param[3].data.d_string, drawable))
{
gimp_set_data ("file_GTM_save", &gtmvals, sizeof (GTMValues));
}
else
{
status = STATUS_EXECUTION_ERROR;
}
}
else
{
status = STATUS_CANCEL;
}
gimp_set_data ("file_GTM_save", &gtmvals, sizeof (GTMValues));
values[0].data.d_status = status;
}
static gint
save_image (char *filename,
GDrawable *drawable)
save_image (gchar *filename,
GDrawable *drawable)
{
int row,col, cols, rows, x, y;
int colcount, colspan, rowspan;
@ -334,13 +353,15 @@ static gint
save_dialog (void)
{
GtkWidget *dlg;
GtkWidget *main_vbox;
GtkWidget *frame;
GtkWidget *vbox;
GtkWidget *table;
GtkWidget *label;
GtkWidget *spinbutton;
GtkObject *adj;
GtkWidget *entry;
GtkWidget *toggle;
gchar **argv;
gchar buffer[32];
gint argc;
bint.run = FALSE;
@ -371,17 +392,25 @@ save_dialog (void)
/* Initialize Tooltips */
gimp_help_init ();
/* HTML Page Options */
main_vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), main_vbox,
TRUE, TRUE, 0);
/* HTML Page Options */
frame = gtk_frame_new (_("HTML Page Options"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg) -> vbox), frame, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
vbox = gtk_vbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
gtk_widget_show (vbox);
toggle = gtk_check_button_new_with_label (_("Generate Full HTML Document"));
gtk_container_add (GTK_CONTAINER (frame), toggle);
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (gtm_toggle_callback),
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&gtmvals.fulldoc);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), gtmvals.fulldoc);
gtk_widget_show (toggle);
@ -391,24 +420,25 @@ save_dialog (void)
"the table html."),
NULL);
gtk_widget_show (main_vbox);
gtk_widget_show (frame);
/* HTML Table Creation Options */
frame = gtk_frame_new (_("Table Creation Options"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg) -> vbox), frame, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
table = gtk_table_new (3, 2, FALSE);
gtk_container_border_width (GTK_CONTAINER (table), 10);
table = gtk_table_new (4, 2, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_container_set_border_width (GTK_CONTAINER (table), 4);
gtk_container_add (GTK_CONTAINER (frame), table);
toggle = gtk_check_button_new_with_label (_("Use Cellspan"));
gtk_table_attach (GTK_TABLE (table), toggle, 0, 1, 0, 1, GTK_FILL, 0, 5, 0);
gtk_table_attach (GTK_TABLE (table), toggle, 0, 2, 0, 1, GTK_FILL, 0, 0, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (gtm_toggle_callback),
&gtmvals.spantags);
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&gtmvals.spantags);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), gtmvals.spantags);
gtk_widget_show (toggle);
gimp_help_set_help_data (toggle,
@ -418,9 +448,9 @@ save_dialog (void)
NULL);
toggle = gtk_check_button_new_with_label (_("Compress TD tags"));
gtk_table_attach (GTK_TABLE (table), toggle, 1, 2, 0, 1, GTK_FILL, 0, 5, 0);
gtk_table_attach (GTK_TABLE (table), toggle, 0, 2, 1, 2, GTK_FILL, 0, 0, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (gtm_toggle_callback),
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&gtmvals.tdcomp);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), gtmvals.tdcomp);
gtk_widget_show (toggle);
@ -432,10 +462,10 @@ save_dialog (void)
NULL);
toggle = gtk_check_button_new_with_label (_("Caption"));
gtk_table_attach (GTK_TABLE (table), toggle, 0, 1, 1, 2, GTK_FILL, 0, 5, 0);
gtk_table_attach (GTK_TABLE (table), toggle, 0, 1, 2, 3, GTK_FILL, 0, 0, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (gtm_toggle_callback),
&gtmvals.caption);
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&gtmvals.caption);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), gtmvals.caption);
gtk_widget_show (toggle);
gimp_help_set_help_data (toggle,
@ -444,8 +474,9 @@ save_dialog (void)
NULL);
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, GTK_FILL, 0, 5, 0);
gtk_widget_set_usize (entry, 100, 0);
gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
GTK_FILL | GTK_EXPAND, 0, 0, 0);
gtk_widget_set_usize (entry, 200, 0);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
GTK_SIGNAL_FUNC (gtm_caption_callback),
NULL);
@ -453,13 +484,14 @@ save_dialog (void)
gtk_widget_show (entry);
gimp_help_set_help_data (entry, _("The text for the table caption."), NULL);
label = gtk_label_new (_("Cell Content"));
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, GTK_FILL, 0, 5, 0);
gtk_widget_show (label);
gtk_object_set_data (GTK_OBJECT (toggle), "set_sensitive", entry);
gtk_widget_set_sensitive (entry, gtmvals.caption);
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3, GTK_FILL, 0, 5, 0);
gtk_widget_set_usize (entry, 100, 0);
gtk_widget_set_usize (entry, 200, 0);
gimp_table_attach_aligned (GTK_TABLE (table), 3,
_("Cell Content:"), 1.0, 0.5,
entry, FALSE);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
GTK_SIGNAL_FUNC (gtm_cellcontent_callback),
NULL);
@ -471,111 +503,81 @@ save_dialog (void)
gtk_widget_show (frame);
/* HTML Table Options */
frame = gtk_frame_new ( _("Table Options"));
frame = gtk_frame_new (_("Table Options"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg) -> vbox), frame, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
table = gtk_table_new (5, 4, FALSE);
gtk_container_border_width (GTK_CONTAINER (table), 10);
table = gtk_table_new (5, 2, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_container_set_border_width (GTK_CONTAINER (table), 4);
gtk_container_add (GTK_CONTAINER (frame), table);
label = gtk_label_new (_("Border"));
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_FILL, 0, 5, 0);
gtk_widget_show (label);
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_set_usize (entry, 35, 0);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
GTK_SIGNAL_FUNC (gtm_entry_callback),
spinbutton = gimp_spin_button_new (&adj, gtmvals.border,
0, 1000, 1, 10, 0, 1, 0);
gimp_table_attach_aligned (GTK_TABLE (table), 0,
_("Border:"), 1.0, 0.5,
spinbutton, TRUE);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
&gtmvals.border);
g_snprintf (buffer, sizeof (buffer), "%d", gtmvals.border);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gtk_widget_show (entry);
gimp_help_set_help_data (entry,
_("The number of pixels in the table border. "
"Can only be a number."),
gimp_help_set_help_data (spinbutton,
_("The number of pixels in the table border."),
NULL);
label = gtk_label_new (_("Width"));
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_FILL, 0, 5, 0);
gtk_widget_show (label);
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_set_usize (entry, 35, 0);
gtk_widget_set_usize (entry, 60, 0);
gimp_table_attach_aligned (GTK_TABLE (table), 1,
_("Width:"), 1.0, 0.5,
entry, TRUE);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
GTK_SIGNAL_FUNC (gtm_clwidth_callback),
NULL);
gtk_entry_set_text (GTK_ENTRY (entry), gtmvals.clwidth);
gtk_widget_show (entry);
gimp_help_set_help_data (entry,
_("The width for each table cell. "
"Can be a number or a percent."),
NULL);
label = gtk_label_new (_("Height"));
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, GTK_FILL, 0, 5, 0);
gtk_widget_show (label);
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_set_usize (entry, 35, 0);
gtk_widget_set_usize (entry, 60, 0);
gimp_table_attach_aligned (GTK_TABLE (table), 2,
_("Height:"), 1.0, 0.5,
entry, TRUE);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
GTK_SIGNAL_FUNC (gtm_clheight_callback),
NULL);
gtk_entry_set_text (GTK_ENTRY (entry), gtmvals.clheight);
gtk_widget_show (entry);
gimp_help_set_help_data (entry,
_("The height for each table cell. "
"Can be a number or a percent."),
NULL);
label = gtk_label_new (_("Cell-Padding"));
gtk_table_attach (GTK_TABLE (table), label, 2, 3, 0, 1, GTK_FILL, 0, 5, 0);
gtk_widget_show (label);
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 0, 1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_set_usize (entry, 35, 0);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
GTK_SIGNAL_FUNC (gtm_entry_callback),
spinbutton = gimp_spin_button_new (&adj, gtmvals.cellpadding,
0, 1000, 1, 10, 0, 1, 0);
gimp_table_attach_aligned (GTK_TABLE (table), 3,
_("Cell-Padding:"), 1.0, 0.5,
spinbutton, TRUE);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
&gtmvals.cellpadding);
g_snprintf (buffer, sizeof (buffer), "%d", gtmvals.cellpadding);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gtk_widget_show (entry);
gimp_help_set_help_data (entry,
_("The amount of cellpadding. "
"Can only be a number."),
NULL);
gimp_help_set_help_data (spinbutton,
_("The amount of cellpadding."), NULL);
label = gtk_label_new (_("Cell-Spacing"));
gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2, GTK_FILL, 0, 5, 0);
gtk_widget_show (label);
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry, 3, 4, 1, 2,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_set_usize (entry, 35, 0);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
GTK_SIGNAL_FUNC (gtm_entry_callback),
spinbutton = gimp_spin_button_new (&adj, gtmvals.cellspacing,
0, 1000, 1, 10, 0, 1, 0);
gimp_table_attach_aligned (GTK_TABLE (table), 4,
_("Cell-Spacing:"), 1.0, 0.5,
spinbutton, TRUE);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
&gtmvals.cellspacing);
g_snprintf (buffer, sizeof (buffer), "%d", gtmvals.cellspacing);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gtk_widget_show (entry);
gimp_help_set_help_data (entry,
_("The amount of cellspacing. "
"Can only be a number."),
NULL);
gimp_help_set_help_data (spinbutton,
_("The amount of cellspacing."), NULL);
gtk_widget_show (frame);
gtk_widget_show (table);
gtk_widget_show (frame);
gtk_widget_show (dlg);
gtk_main ();
@ -596,35 +598,12 @@ color_comp (guchar *buffer,
/* Save interface functions */
static void
gtm_toggle_callback (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}
static void
gtm_entry_callback (GtkWidget *widget,
gpointer data)
{
gint *text_val;
text_val = (gint*)data;
*text_val = atoi (gtk_entry_get_text (GTK_ENTRY (widget)));
}
static void
save_ok_callback (GtkWidget *widget,
gpointer data)
{
bint.run = TRUE;
gtk_widget_destroy (GTK_WIDGET (data));
}

View file

@ -88,10 +88,11 @@
#include <process.h>
#endif
#include "config.h"
#include "libgimp/gimp.h"
#include <libgimp/gimp.h>
#include "libgimp/stdplugins-intl.h"
/* Author 1: Josh MacDonald (url.c) */
/* Author 2: Daniel Risacher (gz.c) */
@ -100,34 +101,37 @@
* that metric, I figure this plug-in is worth about $10,000 USD */
/* But you got it free. Magic of Gnu. */
static void query (void);
static void run (char *name,
int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals);
static gint32 load_image (char *filename, gint32 run_mode);
static gint save_image (char *filename,
gint32 image_ID,
gint32 drawable_ID,
gint32 run_mode);
static void query (void);
static void run (gchar *name,
gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals);
static int valid_file (char* filename) ;
static char* find_extension (char* filename);
static gint32 load_image (gchar *filename,
gint32 run_mode,
GStatusType *status /* return value */);
static GStatusType save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID,
gint32 run_mode);
static gboolean valid_file (gchar *filename);
static gchar * find_extension (gchar *filename);
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN ()
static void
query ()
query (void)
{
static GParamDef load_args[] =
{
@ -135,14 +139,13 @@ query ()
{ PARAM_STRING, "filename", "The name of the file to load" },
{ PARAM_STRING, "raw_filename", "The name entered" },
};
static GParamDef load_return_vals[] =
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
@ -152,7 +155,7 @@ query ()
{ PARAM_STRING, "filename", "The name of the file to save the image in" },
{ PARAM_STRING, "raw_filename", "The name of the file to save the image in" }
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -179,50 +182,50 @@ query ()
PROC_PLUG_IN,
nsave_args, 0,
save_args, NULL);
gimp_register_magic_load_handler ("file_gz_load", "xcf.gz,gz,xcfgz",
"", "0,string,\037\213");
gimp_register_save_handler ("file_gz_save", "xcf.gz,gz,xcfgz", "");
gimp_register_magic_load_handler ("file_gz_load",
"xcf.gz,gz,xcfgz",
"",
"0,string,\037\213");
gimp_register_save_handler ("file_gz_save",
"xcf.gz,gz,xcfgz",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
run_mode = param[0].data.d_int32;
INIT_I18N();
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_gz_load") == 0)
{
image_ID = load_image (param[1].data.d_string,
param[0].data.d_int32);
if (image_ID != -1)
param[0].data.d_int32,
&status);
if (image_ID != -1 &&
status == STATUS_SUCCESS)
{
*nreturn_vals = 2;
values[0].data.d_status = STATUS_SUCCESS;
values[1].type = PARAM_IMAGE;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
}
}
else if (strcmp (name, "file_gz_save") == 0)
{
@ -234,7 +237,7 @@ run (char *name,
/* Make sure all the arguments are there! */
if (nparams != 4)
status = STATUS_CALLING_ERROR;
break;
case RUN_WITH_LAST_VALS:
break;
@ -242,70 +245,76 @@ run (char *name,
break;
}
*nreturn_vals = 1;
if (save_image (param[3].data.d_string,
param[1].data.d_int32,
param[2].data.d_int32,
param[0].data.d_int32 ))
if (status == STATUS_SUCCESS)
{
values[0].data.d_status = STATUS_SUCCESS;
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = save_image (param[3].data.d_string,
param[1].data.d_int32,
param[2].data.d_int32,
param[0].data.d_int32);
}
}
else
g_assert (FALSE);
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
#ifdef __EMX__
static int spawn_gzip(char *filename, char* tmpname, char *parms, int *pid)
static gint
spawn_gzip (gchar *filename,
gchar *tmpname,
gchar *parms,
gint *pid)
{
FILE *f;
int tfd;
gint tfd;
if (!(f = fopen(filename,"w"))){
g_message("gz: fopen failed: %s\n", g_strerror(errno));
return -1;
}
if (!(f = fopen (filename,"w")))
{
g_message ("gz: fopen failed: %s\n", g_strerror (errno));
return -1;
}
/* save fileno(stdout) */
tfd = dup(fileno(stdout));
tfd = dup (fileno (stdout));
/* make stdout for this process be the output file */
if (dup2(fileno(f),fileno(stdout)) == -1)
if (dup2 (fileno (f), fileno (stdout)) == -1)
{
g_message ("gz: dup2 failed: %s\n", g_strerror(errno));
close(tfd);
g_message ("gz: dup2 failed: %s\n", g_strerror (errno));
close (tfd);
return -1;
}
fcntl(tfd, F_SETFD, FD_CLOEXEC);
fcntl (tfd, F_SETFD, FD_CLOEXEC);
*pid = spawnlp (P_NOWAIT, "gzip", "gzip", parms, tmpname, NULL);
fclose(f);
fclose (f);
/* restore fileno(stdout) */
dup2(tfd,fileno(stdout));
close(tfd);
dup2 (tfd, fileno (stdout));
close (tfd);
if (*pid == -1)
{
g_message ("gz: spawn failed: %s\n", g_strerror(errno));
g_message ("gz: spawn failed: %s\n", g_strerror (errno));
return -1;
}
return 0;
return 0;
}
#endif
static gint
save_image (char *filename,
static GStatusType
save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID,
gint32 run_mode)
{
GParam* params;
gint retvals;
char* ext;
char* tmpname;
gchar *ext;
gchar *tmpname;
#ifndef G_OS_WIN32
FILE* f;
int pid;
int status;
FILE *f;
gint pid;
gint status;
#else
SECURITY_ATTRIBUTES secattr;
HANDLE f;
@ -314,11 +323,11 @@ save_image (char *filename,
gchar *cmdline;
#endif
ext = find_extension(filename);
if (0 == *ext) {
g_message( _("gz: no sensible extension, saving as gzip'd xcf\n"));
ext = ".xcf";
}
if (NULL == (ext = find_extension (filename)))
{
g_message (_("gz: no sensible extension, saving as gzip'd xcf\n"));
ext = ".xcf";
}
/* get a temp name with the right extension and save into it. */
@ -326,6 +335,7 @@ save_image (char *filename,
&retvals,
PARAM_STRING, ext + 1,
PARAM_END);
tmpname = g_strdup (params[1].data.d_string);
gimp_destroy_params (params, retvals);
@ -338,11 +348,13 @@ save_image (char *filename,
PARAM_STRING, tmpname,
PARAM_END);
if (params[0].data.d_status == FALSE || !valid_file(tmpname)) {
unlink (tmpname);
g_free (tmpname);
return -1;
}
if (!valid_file (tmpname) ||
params[0].data.d_status != STATUS_SUCCESS)
{
unlink (tmpname);
g_free (tmpname);
return params[0].data.d_status;
}
/* if (! file_save(image_ID, tmpname, tmpname)) { */
/* unlink (tmpname); */
@ -350,48 +362,47 @@ save_image (char *filename,
/* } */
#ifndef G_OS_WIN32
#ifndef __EMX__
/* fork off a gzip process */
if ((pid = fork()) < 0)
if ((pid = fork ()) < 0)
{
g_message ("gz: fork failed: %s\n", g_strerror(errno));
g_message ("gz: fork failed: %s\n", g_strerror (errno));
g_free (tmpname);
return -1;
return STATUS_EXECUTION_ERROR;
}
else if (pid == 0)
{
if (!(f = fopen(filename,"w"))) {
g_message("gz: fopen failed: %s\n", g_strerror(errno));
g_free (tmpname);
_exit(127);
}
if (!(f = fopen (filename, "w")))
{
g_message ("gz: fopen failed: %s\n", g_strerror (errno));
g_free (tmpname);
_exit (127);
}
/* make stdout for this process be the output file */
if (-1 == dup2(fileno(f),fileno(stdout)))
g_message ("gz: dup2 failed: %s\n", g_strerror(errno));
if (-1 == dup2 (fileno (f), fileno (stdout)))
g_message ("gz: dup2 failed: %s\n", g_strerror (errno));
/* and gzip into it */
execlp ("gzip", "gzip", "-cf", tmpname, NULL);
g_message ("gz: exec failed: gzip: %s\n", g_strerror(errno));
g_message ("gz: exec failed: gzip: %s\n", g_strerror (errno));
g_free (tmpname);
_exit(127);
}
else
#else /* __EMX__ */
if (spawn_gzip(filename, tmpname, "-cf", &pid) == -1)
#else /* __EMX__ */
if (spawn_gzip (filename, tmpname, "-cf", &pid) == -1)
{
g_free (tmpname);
return -1;
return STATUS_EXECUTION_ERROR;
}
#endif
{
waitpid (pid, &status, 0);
if (!WIFEXITED(status) ||
WEXITSTATUS(status) != 0)
if (!WIFEXITED (status) ||
WEXITSTATUS (status) != 0)
{
g_message ("gz: gzip exited abnormally on file %s\n", tmpname);
g_free (tmpname);
@ -402,7 +413,7 @@ save_image (char *filename,
secattr.nLength = sizeof (SECURITY_ATTRIBUTES);
secattr.lpSecurityDescriptor = NULL;
secattr.bInheritHandle = TRUE;
if ((f = CreateFile (filename, GENERIC_WRITE, FILE_SHARE_READ,
&secattr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL))
== INVALID_HANDLE_VALUE)
@ -438,25 +449,26 @@ save_image (char *filename,
CloseHandle (f);
CloseHandle (processinfo.hThread);
WaitForSingleObject (processinfo.hProcess, INFINITE);
#endif /* G_OS_WIN32 */
unlink (tmpname);
g_free (tmpname);
return TRUE;
return STATUS_SUCCESS;
}
static gint32
load_image (char *filename, gint32 run_mode)
load_image (gchar *filename,
gint32 run_mode,
GStatusType *status /* return value */)
{
GParam* params;
gint retvals;
char* ext;
char* tmpname;
gchar *ext;
gchar *tmpname;
#ifndef G_OS_WIN32
int pid;
int status;
gint pid;
gint process_status;
#else
SECURITY_ATTRIBUTES secattr;
HANDLE f;
@ -465,10 +477,10 @@ load_image (char *filename, gint32 run_mode)
gchar *cmdline;
#endif
ext = find_extension(filename);
if (0 == *ext) {
g_message( _("gz: no sensible extension, attempting to load with file magic\n"));
}
if (NULL == (ext = find_extension (filename)))
{
g_message (_("gz: no sensible extension, attempting to load with file magic\n"));
}
/* find a temp name */
params = gimp_run_procedure ("gimp_temp_name",
@ -480,54 +492,56 @@ load_image (char *filename, gint32 run_mode)
gimp_destroy_params (params, retvals);
#ifndef G_OS_WIN32
#ifndef __EMX__
/* fork off a g(un)zip and wait for it */
if ((pid = fork()) < 0)
if ((pid = fork ()) < 0)
{
g_message ("gz: fork failed: %s\n", g_strerror(errno));
g_message ("gz: fork failed: %s\n", g_strerror (errno));
g_free (tmpname);
*status = STATUS_EXECUTION_ERROR;
return -1;
}
else if (pid == 0) /* child process */
{
FILE* f;
if (!(f = fopen(tmpname,"w"))){
g_message("gz: fopen failed: %s\n", g_strerror(errno));
g_free (tmpname);
_exit(127);
}
FILE *f;
if (!(f = fopen (tmpname, "w")))
{
g_message ("gz: fopen failed: %s\n", g_strerror (errno));
g_free (tmpname);
_exit(127);
}
/* make stdout for this child process be the temp file */
if (-1 == dup2(fileno(f),fileno(stdout)))
if (-1 == dup2 (fileno (f), fileno (stdout)))
{
g_free (tmpname);
g_message ("gz: dup2 failed: %s\n", g_strerror(errno));
g_message ("gz: dup2 failed: %s\n", g_strerror (errno));
}
/* and unzip into it */
execlp ("gzip", "gzip", "-cfd", filename, NULL);
g_message ("gz: exec failed: gunzip: %s\n", g_strerror(errno));
g_message ("gz: exec failed: gunzip: %s\n", g_strerror (errno));
g_free (tmpname);
_exit(127);
}
else /* parent process */
#else /* __EMX__ */
if (spawn_gzip(tmpname, filename, "-cfd", &pid) == -1)
if (spawn_gzip (tmpname, filename, "-cfd", &pid) == -1)
{
g_free (tmpname);
*status = STATUS_EXECUTION_ERROR;
return -1;
}
#endif
{
waitpid (pid, &status, 0);
waitpid (pid, &process_status, 0);
if (!WIFEXITED(status) ||
WEXITSTATUS(status) != 0)
if (!WIFEXITED (process_status) ||
WEXITSTATUS (process_status) != 0)
{
g_message ("gz: gzip exited abnormally on file %s\n", filename);
g_free (tmpname);
*status = STATUS_EXECUTION_ERROR;
return -1;
}
}
@ -535,7 +549,7 @@ load_image (char *filename, gint32 run_mode)
secattr.nLength = sizeof (SECURITY_ATTRIBUTES);
secattr.lpSecurityDescriptor = NULL;
secattr.bInheritHandle = TRUE;
if ((f = CreateFile (tmpname, GENERIC_WRITE, FILE_SHARE_READ,
&secattr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL))
== INVALID_HANDLE_VALUE)
@ -571,7 +585,6 @@ load_image (char *filename, gint32 run_mode)
CloseHandle (f);
CloseHandle (processinfo.hThread);
WaitForSingleObject (processinfo.hProcess, INFINITE);
#endif /* G_OS_WIN32 */
/* now that we un-gziped it, load the temp file */
@ -585,8 +598,12 @@ load_image (char *filename, gint32 run_mode)
unlink (tmpname);
g_free (tmpname);
if (params[0].data.d_status == FALSE)
return -1;
*status = params[0].data.d_status;
if (params[0].data.d_status != STATUS_SUCCESS)
{
return -1;
}
else
{
gimp_image_set_filename (params[1].data.d_int32, filename);
@ -594,46 +611,52 @@ load_image (char *filename, gint32 run_mode)
}
}
static int valid_file (char* filename)
static gboolean
valid_file (gchar *filename)
{
int stat_res;
gint stat_res;
struct stat buf;
stat_res = stat(filename, &buf);
if ((0 == stat_res) && (buf.st_size > 0))
return 1;
return TRUE;
else
return 0;
return FALSE;
}
static char* find_extension (char* filename)
static gchar *
find_extension (gchar *filename)
{
char* filename_copy;
char* ext;
gchar *filename_copy;
gchar *ext;
/* we never free this copy - aren't we evil! */
filename_copy = malloc(strlen(filename)+1);
strcpy(filename_copy, filename);
filename_copy = g_malloc (strlen (filename) + 1);
strcpy (filename_copy, filename);
/* find the extension, boy! */
ext = strrchr (filename_copy, '.');
while (1) {
if (!ext || ext[1] == 0 || strchr(ext, '/'))
{
return "";
}
if (0 == strcmp(ext, ".xcfgz")) {
return ".xcf"; /* we've found it */
while (1)
{
if (!ext || ext[1] == 0 || strchr (ext, '/'))
{
return NULL;
}
if (0 == strcmp (ext, ".xcfgz"))
{
return ".xcf"; /* we've found it */
}
if (0 != strcmp (ext,".gz"))
{
return ext;
}
else
{
/* we found ".gz" so strip it, loop back, and look again */
*ext = 0;
ext = strrchr (filename_copy, '.');
}
}
if (0 != strcmp(ext,".gz")) {
return ext;
} else {
/* we found ".gz" so strip it, loop back, and look again */
*ext = 0;
ext = strrchr (filename_copy, '.');
}
}
}

View file

@ -1,39 +1,61 @@
/* 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 <string.h>
#include <stdio.h>
#include "config.h"
#include "gtk/gtk.h"
#include "libgimp/gimp.h"
#include "libgimp/gimpui.h"
#include <gtk/gtk.h>
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include "libgimp/stdplugins-intl.h"
/* Declare some local functions.
*/
static void query (void);
static void run (char *name,
int nparams,
static void run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals);
static void init_gtk (void);
static int save_image (char *filename,
gint32 image_ID,
gint32 drawable_ID);
static gint save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID);
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN ()
static void
query ()
query (void)
{
static GParamDef save_args[] =
{
@ -43,7 +65,7 @@ query ()
{ PARAM_STRING, "filename", "The name of the file to save the image in" },
{ PARAM_STRING, "raw_filename", "The name of the file to save the image in" },
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -59,32 +81,34 @@ query ()
nsave_args, 0,
save_args, NULL);
gimp_register_save_handler ("file_header_save", "h", "");
gimp_register_save_handler ("file_header_save",
"h",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
gint32 image_ID;
gint32 drawable_ID;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
GimpExportReturnType export = EXPORT_CANCEL;
run_mode = param[0].data.d_int32;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_header_save") == 0)
{
*nreturn_vals = 1;
image_ID = param[1].data.d_int32;
drawable_ID = param[2].data.d_int32;
@ -93,13 +117,14 @@ run (char *name,
{
case RUN_INTERACTIVE:
case RUN_WITH_LAST_VALS:
INIT_I18N_UI();
INIT_I18N_UI();
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "Header",
(CAN_HANDLE_RGB | CAN_HANDLE_INDEXED));
(CAN_HANDLE_RGB |
CAN_HANDLE_INDEXED));
if (export == EXPORT_CANCEL)
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
@ -107,32 +132,38 @@ run (char *name,
break;
}
if (save_image (param[3].data.d_string, image_ID, drawable_ID))
values[0].data.d_status = STATUS_SUCCESS;
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (! save_image (param[3].data.d_string, image_ID, drawable_ID))
{
status = STATUS_EXECUTION_ERROR;
}
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
else
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
static void
init_gtk ()
init_gtk (void)
{
gchar **argv;
gint argc;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("header");
gtk_init (&argc, &argv);
gtk_rc_parse (gimp_gtkrc ());
}
static int
save_image (char *filename,
save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID)
{
@ -140,22 +171,23 @@ save_image (char *filename,
GDrawable *drawable;
GDrawableType drawable_type;
FILE *fp;
int x, y, b, c;
gint x, y, b, c;
gchar *backslash = "\\\\";
gchar *quote = "\\\"";
gchar *newline = "\"\n\t\"";
gchar buf[4];
guchar *d = NULL;
guchar *data;
unsigned char *cmap;
int colors;
guchar *cmap;
gint colors;
if ((fp = fopen (filename, "w")) == NULL)
return FALSE;
drawable = gimp_drawable_get (drawable_ID);
drawable_type = gimp_drawable_type (drawable_ID);
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0, drawable->width, drawable->height, FALSE, FALSE);
gimp_pixel_rgn_init (&pixel_rgn, drawable,
0, 0, drawable->width, drawable->height, FALSE, FALSE);
fprintf (fp, "/* GIMP header image file format (%s): %s */\n\n",
RGB_IMAGE == drawable_type ? "RGB" : "INDEXED", filename);

View file

@ -61,15 +61,14 @@
#include <gtk/gtk.h>
#include "libgimp/gimp.h"
#include "libgimp/gimpui.h"
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include "libgimp/stdplugins-intl.h"
/* Declare local data types
*/
typedef struct
{
gint run; /* run */
@ -79,29 +78,25 @@ typedef struct
/* Declare some local functions.
*/
static void query (void);
static void run (char *name,
int nparams,
static void run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals);
static gint32 load_image (char *filename);
static gint save_image (char *filename,
gint32 image_ID,
gint32 drawable_ID);
static gint32 load_image (gchar *filename);
static gint save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID);
static void init_gtk (void);
static gint save_dialog (void);
static void save_ok_callback (GtkWidget *widget,
gpointer data);
static void init_gtk (void);
/*
static void save_toggle_update (GtkWidget *widget,
gpointer data);
static gint save_dialog (void);
static void save_ok_callback (GtkWidget *widget,
gpointer data);
*/
#define hrzscanner_eof(s) ((s)->eof)
#define hrzscanner_fp(s) ((s)->fp)
#define hrzscanner_fp(s) ((s)->fp)
/* Checks for a fatal error */
#define CHECK_FOR_ERROR(predicate, jmpbuf, errmsg) \
@ -110,22 +105,24 @@ static void save_toggle_update (GtkWidget *widget,
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
/*
static HRZSaveInterface psint =
{
FALSE /* run */
FALSE / * run * /
};
*/
MAIN ()
static void
query ()
query (void)
{
static GParamDef load_args[] =
{
@ -137,8 +134,9 @@ query ()
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
@ -148,7 +146,7 @@ query ()
{ PARAM_STRING, "filename", "The name of the file to save the image in" },
{ PARAM_STRING, "raw_filename", "The name of the file to save the image in" }
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -176,30 +174,35 @@ query ()
nsave_args, 0,
save_args, NULL);
gimp_register_magic_load_handler ("file_hrz_load", "hrz", "", "0,size,184320");
gimp_register_save_handler ("file_hrz_save", "hrz", "");
gimp_register_magic_load_handler ("file_hrz_load",
"hrz",
"",
"0,size,184320");
gimp_register_save_handler ("file_hrz_save",
"hrz",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
GimpExportReturnType export = EXPORT_CANCEL;
run_mode = param[0].data.d_int32;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_hrz_load") == 0)
{
@ -209,13 +212,12 @@ run (char *name,
if (image_ID != -1)
{
*nreturn_vals = 2;
values[0].data.d_status = STATUS_SUCCESS;
values[1].type = PARAM_IMAGE;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = STATUS_EXECUTION_ERROR;
}
}
else if (strcmp (name, "file_hrz_save") == 0)
@ -231,10 +233,11 @@ run (char *name,
INIT_I18N_UI();
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "HRZ",
(CAN_HANDLE_RGB | CAN_HANDLE_GRAY));
(CAN_HANDLE_RGB |
CAN_HANDLE_GRAY));
if (export == EXPORT_CANCEL)
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
@ -246,16 +249,18 @@ run (char *name,
switch (run_mode)
{
case RUN_INTERACTIVE:
/* First acquire information with a dialog */
/* Save dialog has no options (yet???)
if (! save_dialog ())
return;
status = STATUS_CANCEL;
*/
break;
case RUN_NONINTERACTIVE:
/* Make sure all the arguments are there! */
if (nparams != 4)
status = STATUS_CALLING_ERROR;
break;
case RUN_WITH_LAST_VALS:
break;
@ -264,17 +269,23 @@ run (char *name,
break;
}
*nreturn_vals = 1;
if (save_image (param[3].data.d_string, image_ID, drawable_ID))
if (status == STATUS_SUCCESS)
{
values[0].data.d_status = STATUS_SUCCESS;
if (! save_image (param[3].data.d_string, image_ID, drawable_ID))
{
status = STATUS_EXECUTION_ERROR;
}
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
else
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
/************ load HRZ image row *********************/
@ -283,8 +294,8 @@ do_hrz_load (void *mapped,
GPixelRgn *pixel_rgn)
{
guchar *data, *d;
int x, y;
int start, end, scanlines;
gint x, y;
gint start, end, scanlines;
data = g_malloc (gimp_tile_height () * 256 * 3);
@ -296,10 +307,14 @@ do_hrz_load (void *mapped,
scanlines = end - start;
d = data;
memcpy(d, ((unsigned char *) mapped)+256*3*y, 256*3*scanlines); /* this is gross */
memcpy (d, ((guchar *) mapped) + 256 * 3 * y,
256 * 3 * scanlines); /* this is gross */
/* scale 0..63 into 0..255 properly */
for (x=0; x<256*3*scanlines; x++) d[x] = (d[x]>>4) | (d[x]<<2);
d += 256*3*y;
for (x = 0; x < 256 * 3 * scanlines; x++)
d[x] = (d[x]>>4) | (d[x]<<2);
d += 256 * 3 * y;
gimp_progress_update ((double) y / 240.0);
gimp_pixel_rgn_set_rect (pixel_rgn, data, 0, y, 256, scanlines);
@ -311,14 +326,14 @@ do_hrz_load (void *mapped,
/********************* Load HRZ image **********************/
static gint32
load_image (char *filename)
load_image (gchar *filename)
{
GPixelRgn pixel_rgn;
gint32 image_ID;
gint32 layer_ID;
GDrawable *drawable;
int filedes;
char *temp;
gint filedes;
gchar *temp;
void *mapped; /* memory mapped file data */
struct stat statbuf; /* must check file size */
@ -327,7 +342,7 @@ load_image (char *filename)
g_free (temp);
/* open the file */
filedes = open(filename, O_RDONLY | _O_BINARY);
filedes = open (filename, O_RDONLY | _O_BINARY);
if (filedes == -1)
{
@ -336,24 +351,24 @@ load_image (char *filename)
return -1;
}
/* stat the file to see if it is the right size */
fstat(filedes, &statbuf);
if(statbuf.st_size != 256*240*3)
fstat (filedes, &statbuf);
if (statbuf.st_size != 256*240*3)
{
fprintf(stderr, "hrz filter: file is not HRZ type\n");
g_message ("hrz: file is not HRZ type");
return -1;
}
#ifdef HAVE_MMAP
mapped = mmap(NULL, 256*240*3, PROT_READ, MAP_PRIVATE, filedes, 0);
if(mapped == (void *)(-1))
if (mapped == (void *)(-1))
{
fprintf(stderr, "hrz filter: could not map file\n");
g_message ("hrz: could not map file");
return -1;
}
#else
mapped = g_malloc(256*240*3);
if (read(filedes, mapped, 256*240*3) != 256*240*3)
if (read (filedes, mapped, 256*240*3) != 256*240*3)
{
fprintf(stderr, "hrz filter: file read error\n");
g_message ("hrz: file read error");
return -1;
}
#endif
@ -369,16 +384,16 @@ load_image (char *filename)
gimp_image_add_layer (image_ID, layer_ID, 0);
drawable = gimp_drawable_get (layer_ID);
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0, drawable->width, drawable->height, TRUE, FALSE);
gimp_pixel_rgn_init (&pixel_rgn, drawable,
0, 0, drawable->width, drawable->height, TRUE, FALSE);
do_hrz_load(mapped, &pixel_rgn);
do_hrz_load (mapped, &pixel_rgn);
/* close the file */
#ifdef HAVE_MMAP
munmap(mapped, 256*240*3);
munmap (mapped, 256*240*3);
#else
g_free(mapped);
g_free (mapped);
#endif
/* Tell the GIMP to display the image.
@ -388,37 +403,37 @@ load_image (char *filename)
return image_ID;
}
/************** Writes out RGB raw rows ************/
static void
saverow (FILE *fp, unsigned char *data)
saverow (FILE *fp,
guchar *data)
{
int loop = 256*3;
unsigned char *walk = data;
while(loop--)
gint loop = 256*3;
guchar *walk = data;
while (loop--)
{
*walk = (*walk >> 2);
walk++;
}
fwrite(data, 1, 256*3, fp);
fwrite (data, 1, 256 * 3, fp);
}
/********************* save image *********************/
static gint
save_image (char *filename,
save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID)
{
GPixelRgn pixel_rgn;
GDrawable *drawable;
GDrawableType drawable_type;
unsigned char *data;
unsigned char *d; /* FIX */
unsigned char *rowbuf;
char *temp;
int np = 3;
int xres, yres;
int ypos, yend;
guchar *data;
guchar *d; /* FIX */
guchar *rowbuf;
gchar *temp;
gint np = 3;
gint xres, yres;
gint ypos, yend;
FILE *fp;
/* initialize */
@ -427,7 +442,8 @@ save_image (char *filename,
drawable = gimp_drawable_get (drawable_ID);
drawable_type = gimp_drawable_type (drawable_ID);
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0, drawable->width, drawable->height, FALSE, FALSE);
gimp_pixel_rgn_init (&pixel_rgn, drawable,
0, 0, drawable->width, drawable->height, FALSE, FALSE);
/* Make sure we're not saving an image with an alpha channel */
if (gimp_drawable_has_alpha (drawable_ID))
@ -437,11 +453,11 @@ save_image (char *filename,
}
/* open the file */
fp = fopen(filename, "wb");
fp = fopen (filename, "wb");
if (fp == NULL)
{
/* Ought to pass errno back... */
fprintf (stderr, "hrz: can't open \"%s\"\n", filename);
g_message ("hrz: can't open \"%s\"\n", filename);
return FALSE;
}
@ -450,12 +466,12 @@ save_image (char *filename,
if ((xres != 256) || (yres != 240))
{
fprintf (stderr, "hrz: Image must be 256x240 for HRZ format.\n");
g_message ("hrz: Image must be 256x240 for HRZ format.");
return FALSE;
}
if (drawable_type == INDEXED_IMAGE)
{
fprintf (stderr, "hrz: Image must be RGB for HRZ format.\n");
g_message ("hrz: Image must be RGB or GRAY for HRZ format.");
return FALSE;
}
@ -463,11 +479,11 @@ save_image (char *filename,
gimp_progress_init (temp);
g_free (temp);
/* allocate a buffer for retrieving information from the pixel region */
data = (unsigned char *) g_malloc (gimp_tile_height () * drawable->width * drawable->bpp);
data = (guchar *) g_malloc (gimp_tile_height () * drawable->width *
drawable->bpp);
rowbuf = g_malloc(256*3);
rowbuf = g_malloc (256 * 3);
/* Write the body out */
for (ypos = 0; ypos < yres; ypos++)
@ -476,22 +492,23 @@ save_image (char *filename,
{
yend = ypos + gimp_tile_height ();
yend = MIN (yend, yres);
gimp_pixel_rgn_get_rect (&pixel_rgn, data, 0, ypos, xres, (yend - ypos));
gimp_pixel_rgn_get_rect (&pixel_rgn, data,
0, ypos, xres, (yend - ypos));
d = data;
}
saverow(fp, d);
d += xres*np;
saverow (fp, d);
d += xres * np;
if (!(ypos & 0x0f))
gimp_progress_update( (double)ypos / 240.0 );
gimp_progress_update ((double)ypos / 240.0 );
}
/* close the file */
fclose (fp);
g_free(rowbuf);
g_free(data);
g_free (rowbuf);
g_free (data);
gimp_drawable_detach (drawable);
@ -502,17 +519,18 @@ static void
init_gtk (void)
{
gchar **argv;
gint argc;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("hrz");
gtk_init (&argc, &argv);
gtk_rc_parse (gimp_gtkrc ());
}
/*********** Save dialog ************/
/*
static gint
save_dialog (void)
{
@ -540,9 +558,6 @@ save_dialog (void)
return psint.run;
}
/********** Save interface functions **********/
static void
save_ok_callback (GtkWidget *widget,
gpointer data)
@ -551,19 +566,4 @@ save_ok_callback (GtkWidget *widget,
gtk_widget_destroy (GTK_WIDGET (data));
}
/*
static void
save_toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}
*/

View file

@ -297,6 +297,7 @@ static int
dialog (void)
{
GtkWidget *window;
GtkWidget *frame;
GtkWidget *table;
GtkWidget *spinbutton;
GtkObject *adj;
@ -326,13 +327,17 @@ dialog (void)
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
/* table */
frame = gtk_frame_new (_("Parameter Settings"));
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), frame,
FALSE, FALSE, 0 );
gtk_widget_show (frame);
table = gtk_table_new (1, 2, FALSE);
gtk_container_set_border_width (GTK_CONTAINER (table), 6);
gtk_container_set_border_width (GTK_CONTAINER (table), 4);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), table,
TRUE, TRUE, 0 );
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_widget_show (table);
spinbutton = gimp_spin_button_new (&adj, parameters.division,

View file

@ -164,21 +164,21 @@
#define DEFAULT_COMMENT "Created with The GIMP"
/* sg - these should not be global... */
gint32 volatile image_ID_global = -1, orig_image_ID_global, drawable_ID_global = -1, layer_ID_global = -1;
GtkWidget *preview_size = NULL;
GDrawable *drawable_global = NULL;
static gint32 volatile image_ID_global = -1, orig_image_ID_global, drawable_ID_global = -1, layer_ID_global = -1;
static GtkWidget *preview_size = NULL;
static GDrawable *drawable_global = NULL;
typedef struct
{
gdouble quality;
gdouble smoothing;
gint optimize;
gint progressive;
gint baseline;
gint subsmp;
gint restart;
gint dct;
gint preview;
gint optimize;
gint progressive;
gint baseline;
gint subsmp;
gint restart;
gint dct;
gint preview;
} JpegSaveVals;
typedef struct
@ -189,25 +189,21 @@ typedef struct
typedef struct
{
struct jpeg_compress_struct cinfo;
gint tile_height;
FILE *outfile;
gint has_alpha;
gint rowstride;
guchar *temp;
guchar *data;
guchar *src;
gint tile_height;
FILE *outfile;
gint has_alpha;
gint rowstride;
guchar *temp;
guchar *data;
guchar *src;
GDrawable *drawable;
GPixelRgn pixel_rgn;
char *file_name;
gint abort_me;
GPixelRgn pixel_rgn;
gchar *file_name;
gint abort_me;
} preview_persistent;
gint *abort_me = NULL;
typedef void (*MenuItemCallback) (GtkWidget *widget,
gpointer user_data);
/* Declare local functions.
*/
static void query (void);
@ -228,7 +224,7 @@ static gint save_image (gchar *filename,
static void add_menu_item (GtkWidget *menu,
char *label,
guint op_no,
MenuItemCallback callback);
GtkSignalFunc callback);
static void init_gtk (void);
static gint save_dialog (void);
@ -263,10 +259,10 @@ static void dct_callback (GtkWidget *widget,
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
static JpegSaveVals jsvals =
@ -295,7 +291,7 @@ static GtkWidget *restart_markers_label = NULL;
MAIN ()
static void
query ()
query (void)
{
static GParamDef load_args[] =
{
@ -307,8 +303,9 @@ query ()
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
@ -327,7 +324,7 @@ query ()
{ PARAM_INT32, "restart", "Frequency of restart markers (in rows, 0 = no restart markers)" },
{ PARAM_INT32, "dct", "DCT algorithm to use (speed/quality tradeoff)" }
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -355,41 +352,41 @@ query ()
nsave_args, 0,
save_args, NULL);
gimp_register_magic_load_handler ("file_jpeg_load", "jpg,jpeg", "", "6,string,JFIF");
gimp_register_save_handler ("file_jpeg_save", "jpg,jpeg", "");
gimp_register_magic_load_handler ("file_jpeg_load",
"jpg,jpeg",
"",
"6,string,JFIF");
gimp_register_save_handler ("file_jpeg_save",
"jpg,jpeg",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
gint32 orig_image_ID;
gint32 display_ID = -1;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
gint32 orig_image_ID;
gint32 display_ID = -1;
#ifdef GIMP_HAVE_PARASITES
Parasite *parasite;
Parasite *parasite;
#endif /* GIMP_HAVE_PARASITES */
int err;
gint err;
GimpExportReturnType export = EXPORT_CANCEL;
run_mode = param[0].data.d_int32;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
#if 0
printf ("JPEG: Waiting (pid %d)...\n", getpid());
kill (getpid(), SIGSTOP);
#endif
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_jpeg_load") == 0)
{
@ -400,13 +397,12 @@ run (char *name,
if (image_ID != -1)
{
*nreturn_vals = 2;
values[0].data.d_status = STATUS_SUCCESS;
values[1].type = PARAM_IMAGE;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = STATUS_EXECUTION_ERROR;
}
}
else if (strcmp (name, "file_jpeg_save") == 0)
@ -423,7 +419,8 @@ run (char *name,
case RUN_WITH_LAST_VALS:
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "JPEG",
(CAN_HANDLE_RGB | CAN_HANDLE_GRAY));
(CAN_HANDLE_RGB |
CAN_HANDLE_GRAY));
switch (export)
{
case EXPORT_EXPORT:
@ -434,8 +431,7 @@ run (char *name,
case EXPORT_IGNORE:
break;
case EXPORT_CANCEL:
*nreturn_vals = 1;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
break;
}
@ -443,7 +439,7 @@ run (char *name,
default:
break;
}
if (image_comment)
{
g_free (image_comment);
@ -460,16 +456,16 @@ run (char *name,
if (!image_comment)
image_comment = g_strdup (DEFAULT_COMMENT);
jsvals.quality = DEFAULT_QUALITY;
jsvals.smoothing = DEFAULT_SMOOTHING;
jsvals.optimize = DEFAULT_OPTIMIZE;
jsvals.quality = DEFAULT_QUALITY;
jsvals.smoothing = DEFAULT_SMOOTHING;
jsvals.optimize = DEFAULT_OPTIMIZE;
jsvals.progressive = DEFAULT_PROGRESSIVE;
jsvals.baseline = DEFAULT_BASELINE;
jsvals.subsmp = DEFAULT_SUBSMP;
jsvals.restart = DEFAULT_RESTART;
jsvals.dct = DEFAULT_DCT;
jsvals.preview = DEFAULT_PREVIEW;
jsvals.baseline = DEFAULT_BASELINE;
jsvals.subsmp = DEFAULT_SUBSMP;
jsvals.restart = DEFAULT_RESTART;
jsvals.dct = DEFAULT_DCT;
jsvals.preview = DEFAULT_PREVIEW;
switch (run_mode)
{
case RUN_INTERACTIVE:
@ -478,7 +474,8 @@ run (char *name,
#ifdef GIMP_HAVE_PARASITES
/* load up the previously used values */
parasite = gimp_image_parasite_find (orig_image_ID, "jpeg-save-options");
parasite = gimp_image_parasite_find (orig_image_ID,
"jpeg-save-options");
if (parasite)
{
jsvals.quality = ((JpegSaveVals *)parasite->data)->quality;
@ -493,7 +490,7 @@ run (char *name,
parasite_free(parasite);
}
#endif /* GIMP_HAVE_PARASITES */
/* we start an undo_group and immediately freeze undo saving
so that we can avoid sucking up tile cache with our unneeded
preview steps. */
@ -513,7 +510,7 @@ run (char *name,
gimp_undo_push_group_end (image_ID);
if (!err)
return;
status = STATUS_CANCEL;
break;
case RUN_NONINTERACTIVE:
@ -521,8 +518,10 @@ run (char *name,
/* pw - added two more progressive and comment */
/* sg - added subsampling, preview, baseline, restarts and DCT */
if (nparams != 14)
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS)
{
status = STATUS_CALLING_ERROR;
}
else
{
jsvals.quality = param[5].data.d_float;
jsvals.smoothing = param[6].data.d_float;
@ -540,26 +539,24 @@ run (char *name,
if (image_comment)
g_free (image_comment);
image_comment = g_strdup (param[9].data.d_string);
if (jsvals.quality < 0.0 || jsvals.quality > 1.0)
status = STATUS_CALLING_ERROR;
else if (jsvals.smoothing < 0.0 || jsvals.smoothing > 1.0)
status = STATUS_CALLING_ERROR;
else if (jsvals.subsmp < 0 || jsvals.subsmp > 2)
status = STATUS_CALLING_ERROR;
else if (jsvals.dct < 0 || jsvals.dct > 2)
status = STATUS_CALLING_ERROR;
}
if (status == STATUS_SUCCESS &&
(jsvals.quality < 0.0 || jsvals.quality > 1.0))
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS &&
(jsvals.smoothing < 0.0 || jsvals.smoothing > 1.0))
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS &&
(jsvals.subsmp < 0 || jsvals.subsmp > 2))
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS &&
(jsvals.dct < 0 || jsvals.dct > 2))
status = STATUS_CALLING_ERROR;
break;
case RUN_WITH_LAST_VALS:
/* Possibly retrieve data */
gimp_get_data ("file_jpeg_save", &jsvals);
#ifdef GIMP_HAVE_PARASITES
parasite = gimp_image_parasite_find (orig_image_ID, "jpeg-save-options");
parasite = gimp_image_parasite_find (orig_image_ID,
"jpeg-save-options");
if (parasite)
{
jsvals.quality = ((JpegSaveVals *)parasite->data)->quality;
@ -580,26 +577,28 @@ run (char *name,
break;
}
*nreturn_vals = 1;
if (save_image (param[3].data.d_string,
image_ID,
drawable_ID,
orig_image_ID,
FALSE))
if (status == STATUS_SUCCESS)
{
/* Store mvals data */
gimp_set_data ("file_jpeg_save", &jsvals, sizeof (JpegSaveVals));
values[0].data.d_status = STATUS_SUCCESS;
if (save_image (param[3].data.d_string,
image_ID,
drawable_ID,
orig_image_ID,
FALSE))
{
/* Store mvals data */
gimp_set_data ("file_jpeg_save", &jsvals, sizeof (JpegSaveVals));
}
else
{
status = STATUS_EXECUTION_ERROR;
}
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (export == EXPORT_EXPORT)
{
/* If the image was exported, delete the new display. */
/* This also deletes the image. */
if (display_ID > -1)
gimp_display_delete (display_ID);
else
@ -607,7 +606,6 @@ run (char *name,
}
#ifdef GIMP_HAVE_PARASITES
/* pw - now we need to change the defaults to be whatever
* was used to save this image. Dump the old parasites
* and add new ones. */
@ -627,14 +625,18 @@ run (char *name,
parasite = parasite_new ("jpeg-save-options", 0, sizeof (jsvals), &jsvals);
gimp_image_parasite_attach (orig_image_ID, parasite);
parasite_free (parasite);
#endif /* Have Parasites */
}
else
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
/* Read next byte */
static unsigned int
static guint
jpeg_getc (j_decompress_ptr cinfo)
{
struct jpeg_source_mgr * datasrc = cinfo->src;
@ -889,7 +891,8 @@ load_image (char *filename,
}
else
{
image_ID = gimp_image_new (cinfo.output_width, cinfo.output_height, image_type);
image_ID = gimp_image_new (cinfo.output_width, cinfo.output_height,
image_type);
gimp_image_set_filename (image_ID, filename);
}
@ -899,7 +902,7 @@ load_image (char *filename,
cinfo.output_width,
cinfo.output_height,
layer_type, 100, NORMAL_MODE);
}
}
else
{
layer_ID = gimp_layer_new (image_ID, _("Background"),
@ -909,47 +912,49 @@ load_image (char *filename,
}
drawable_global = drawable = gimp_drawable_get (layer_ID);
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0, drawable->width, drawable->height, TRUE, FALSE);
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0,
drawable->width, drawable->height, TRUE, FALSE);
/* Step 5.1: if the file had resolution information, set it on the
* image */
#ifdef GIMP_HAVE_RESOLUTION_INFO
/* Step 5.1: if the file had resolution information, set it on the image */
if (!preview && cinfo.saw_JFIF_marker)
{
float xresolution;
float yresolution;
float asymmetry;
{
gdouble xresolution;
gdouble yresolution;
gdouble asymmetry;
xresolution = cinfo.X_density;
yresolution = cinfo.Y_density;
xresolution = cinfo.X_density;
yresolution = cinfo.Y_density;
switch (cinfo.density_unit)
{
case 0: /* unknown */
asymmetry = xresolution / yresolution;
xresolution = 72 * asymmetry;
yresolution = 72;
break;
case 1: /* dots per inch */
break;
switch (cinfo.density_unit)
{
case 0: /* unknown -> set the aspect ratio but use the default
* image resolution
*/
asymmetry = xresolution / yresolution;
gimp_image_get_resolution (image_ID, &xresolution, &yresolution);
xresolution *= asymmetry;
break;
case 2: /* dots per cm */
xresolution *= 2.54;
yresolution *= 2.54;
break;
case 1: /* dots per inch */
break;
default:
g_message ("unknown density unit %d\nassuming dots per inch",
cinfo.density_unit);
break;
}
case 2: /* dots per cm */
xresolution *= 2.54;
yresolution *= 2.54;
gimp_image_set_unit (image_ID, UNIT_MM);
break;
gimp_image_set_resolution (image_ID, xresolution, yresolution);
}
default:
g_message ("unknown density unit %d\nassuming dots per inch",
cinfo.density_unit);
break;
}
gimp_image_set_resolution (image_ID, xresolution, yresolution);
}
#endif /* GIMP_HAVE_RESOLUTION_INFO */
/* Step 6: while (scan lines remain to be read) */
/* jpeg_read_scanlines(...); */
@ -1345,20 +1350,36 @@ save_image (char *filename,
#ifdef GIMP_HAVE_RESOLUTION_INFO
{
double xresolution;
double yresolution;
gdouble xresolution;
gdouble yresolution;
gimp_image_get_resolution (orig_image_ID, &xresolution, &yresolution);
if (xresolution > 1e-5 && yresolution > 1e-5)
{
cinfo.density_unit = 1; /* dots per inch */
gdouble factor;
factor = gimp_unit_get_factor (gimp_image_get_unit (orig_image_ID));
if (factor == 2.54 /* cm */ ||
factor == 25.4 /* mm */)
{
cinfo.density_unit = 2; /* dots per cm */
xresolution /= 2.54;
yresolution /= 2.54;
}
else
{
cinfo.density_unit = 1; /* dots per inch */
}
cinfo.X_density = xresolution;
cinfo.Y_density = yresolution;
}
}
#endif /* GIMP_HAVE_RESOLUTION_INFO */
/* Step 4: Start compressor */
/* TRUE ensures that we will write a complete interchange-JPEG file.
@ -1526,7 +1547,7 @@ static void
add_menu_item (GtkWidget *menu,
char *label,
guint op_no,
MenuItemCallback callback)
GtkSignalFunc callback)
{
GtkWidget *menu_item = gtk_menu_item_new_with_label (label);
gtk_container_add (GTK_CONTAINER (menu), menu_item);

View file

@ -33,6 +33,7 @@
/* Some of the code is based on code by Steinar Haugen (thanks!), the Perlin */
/* noise function is practically ripped as is :) */
/*********************************************************************************/
#include "config.h"
#include <stdio.h>
@ -82,25 +83,32 @@ rgbpixel background;
gdouble G[numx][numy][2];
typedef struct {
glong filtlen,noisemag,intsteps,minv,maxv;
typedef struct
{
gdouble filtlen;
gdouble noisemag;
gdouble intsteps;
gdouble minv;
gdouble maxv;
gboolean create_new_image;
guchar effect_channel;
guchar effect_operator;
guchar effect_convolve;
gint32 effect_image_id;
gint effect_channel;
gint effect_operator;
gint effect_convolve;
gint32 effect_image_id;
} LicValues;
LicValues licvals;
gdouble l=10.0,dx=2.0,dy=2.0,minv=-2.5,maxv=2.5,isteps=20.0;
GDrawable *input_drawable,*output_drawable;
GPixelRgn source_region,dest_region;
GDrawable *input_drawable;
GDrawable *output_drawable;
GPixelRgn source_region;
GPixelRgn dest_region;
gint imgtype,width,height,in_channels,out_channels;
gint border_x1,border_y1,border_x2,border_y2;
glong maxcounter;
gint imgtype,width,height,in_channels,out_channels;
gint border_x1,border_y1,border_x2,border_y2;
glong maxcounter;
guchar *scalarfield;
GtkWidget *dialog;
@ -109,21 +117,26 @@ GtkWidget *dialog;
/* Convenience routines */
/************************/
void rgb_add(rgbpixel *a,rgbpixel *b)
static void
rgb_add (rgbpixel *a,
rgbpixel *b)
{
a->r=a->r+b->r;
a->g=a->g+b->g;
a->b=a->b+b->b;
}
void rgb_mul(rgbpixel *a,gdouble b)
static void
rgb_mul (rgbpixel *a,
gdouble b)
{
a->r=a->r*b;
a->g=a->g*b;
a->b=a->b*b;
}
void rgb_clamp(rgbpixel *a)
static void
rgb_clamp (rgbpixel *a)
{
if (a->r>1.0)
a->r=1.0;
@ -144,25 +157,9 @@ void rgb_clamp(rgbpixel *a)
a->b=0.0;
}
void set_color(rgbpixel *a,gdouble r,gdouble g,gdouble b)
{
a->r=r; a->g=g; a->b=b;
}
glong xy_to_index(gint x,gint y)
{
return((glong)in_channels*((glong)x+(glong)y*(glong)width));
}
gboolean checkbounds(gint x,gint y)
{
if (x<0 || y<0 || x>width-1 || y>height-1)
return(FALSE);
return(TRUE);
}
rgbpixel peek(gint x,gint y)
static rgbpixel
peek (gint x,
gint y)
{
static guchar data[4];
rgbpixel color;
@ -186,7 +183,10 @@ rgbpixel peek(gint x,gint y)
return(color);
}
void poke(gint x,gint y,rgbpixel *color)
static void
poke (gint x,
gint y,
rgbpixel *color)
{
static guchar data[4];
@ -198,17 +198,13 @@ void poke(gint x,gint y,rgbpixel *color)
gimp_pixel_rgn_set_pixel(&dest_region,data,x,y);
}
void pos_to_int(gdouble x,gdouble y,gint *scr_x,gint *scr_y)
{
*scr_x=(gint)((x*(gdouble)width));
*scr_y=(gint)((y*(gdouble)height));
}
/****************************************/
/* Allocate memory for temporary images */
/****************************************/
gint image_setup(GDrawable *drawable,gint interactive)
static gint
image_setup (GDrawable *drawable,
gint interactive)
{
/* Get some useful info on the input drawable */
/* ========================================== */
@ -241,7 +237,10 @@ gint image_setup(GDrawable *drawable,gint interactive)
return(TRUE);
}
guchar peekmap(guchar *image,gint x,gint y)
static guchar
peekmap (guchar *image,
gint x,
gint y)
{
glong index;
@ -263,7 +262,10 @@ guchar peekmap(guchar *image,gint x,gint y)
/* (It's a varation of the Sobel kernels, really) */
/***************************************************/
gint gradx(guchar *image,gint x,gint y)
static gint
gradx (guchar *image,
gint x,
gint y)
{
gint val=0;
@ -285,7 +287,10 @@ gint gradx(guchar *image,gint x,gint y)
return(val);
}
gint grady(guchar *image,gint x,gint y)
static gint
grady (guchar *image,
gint x,
gint y)
{
gint val=0;
@ -310,7 +315,8 @@ gint grady(guchar *image,gint x,gint y)
/* A nice 2nd order cubic spline :) */
/************************************/
gdouble cubic(gdouble t)
static gdouble
cubic (gdouble t)
{
gdouble at=fabs(t);
@ -320,7 +326,11 @@ gdouble cubic(gdouble t)
return(0.0);
}
gdouble omega(gdouble u,gdouble v,gint i,gint j)
static gdouble
omega (gdouble u,
gdouble v,
gint i,
gint j)
{
while (i<0)
i+=numx;
@ -338,7 +348,9 @@ gdouble omega(gdouble u,gdouble v,gint i,gint j)
/* The noise function (2D variant of Perlins noise function) */
/*************************************************************/
gdouble noise(gdouble x,gdouble y)
static gdouble
noise (gdouble x,
gdouble y)
{
gint i,sti=(gint)floor(x/dx);
gint j,stj=(gint)floor(y/dy);
@ -361,7 +373,8 @@ gdouble noise(gdouble x,gdouble y)
/* Generates pseudo-random vectors with length 1 */
/*************************************************/
void generatevectors(void)
static void
generatevectors (void)
{
gdouble alpha;
gint i,j;
@ -380,7 +393,8 @@ void generatevectors(void)
/* A simple triangle filter */
/* ======================== */
gdouble filter(gdouble u)
static gdouble
filter (gdouble u)
{
gdouble f=1.0-fabs(u)/l;
@ -394,7 +408,11 @@ gdouble filter(gdouble u)
/* Compute the Line Integral Convolution (LIC) at x,y */
/******************************************************/
gdouble lic_noise(gint x,gint y,gdouble vx,gdouble vy)
static gdouble
lic_noise (gint x,
gint y,
gdouble vx,
gdouble vy)
{
gdouble i=0.0;
gdouble f1=0.0,f2=0.0;
@ -433,7 +451,10 @@ gdouble lic_noise(gint x,gint y,gdouble vx,gdouble vy)
return(i);
}
static rgbpixel bilinear(gdouble x, gdouble y, rgbpixel *p)
static rgbpixel
bilinear (gdouble x,
gdouble y,
rgbpixel *p)
{
gdouble m0, m1;
gdouble ix, iy;
@ -478,7 +499,10 @@ static rgbpixel bilinear(gdouble x, gdouble y, rgbpixel *p)
return(v);
} /* bilinear */
void getpixel(rgbpixel *p,gdouble u,gdouble v)
static void
getpixel (rgbpixel *p,
gdouble u,
gdouble v)
{
register gint x1, y1, x2, y2;
static rgbpixel pp[4];
@ -507,7 +531,12 @@ void getpixel(rgbpixel *p,gdouble u,gdouble v)
*p=bilinear(u,v,pp);
}
void lic_image(gint x,gint y,gdouble vx,gdouble vy,rgbpixel *color)
static void
lic_image (gint x,
gint y,
gdouble vx,
gdouble vy,
rgbpixel *color)
{
gdouble u,step=2.0*l/isteps;
gdouble xx=(gdouble)x,yy=(gdouble)y;
@ -546,7 +575,10 @@ void lic_image(gint x,gint y,gdouble vx,gdouble vy,rgbpixel *color)
*color=col;
}
gdouble maximum(gdouble a,gdouble b,gdouble c)
static gdouble
maximum (gdouble a,
gdouble b,
gdouble c)
{
gdouble max=a;
@ -558,7 +590,10 @@ gdouble maximum(gdouble a,gdouble b,gdouble c)
return(max);
}
gdouble minimum(gdouble a,gdouble b,gdouble c)
static gdouble
minimum (gdouble a,
gdouble b,
gdouble c)
{
gdouble min=a;
@ -570,7 +605,9 @@ gdouble minimum(gdouble a,gdouble b,gdouble c)
return(min);
}
void get_hue(rgbpixel *col,gdouble *hue)
static void
get_hue (rgbpixel *col,
gdouble *hue)
{
gdouble max,min,delta;
@ -594,7 +631,9 @@ void get_hue(rgbpixel *col,gdouble *hue)
}
}
void get_saturation(rgbpixel *col,gdouble *sat)
static void
get_saturation (rgbpixel *col,
gdouble *sat)
{
gdouble max,min,l;
@ -613,7 +652,9 @@ void get_saturation(rgbpixel *col,gdouble *sat)
}
}
void get_brightness(rgbpixel *col,gdouble *bri)
static void
get_brightness (rgbpixel *col,
gdouble *bri)
{
gdouble max,min;
@ -623,7 +664,9 @@ void get_brightness(rgbpixel *col,gdouble *bri)
*bri=(max+min)/2.0;
}
void rgb_to_hue(GDrawable *image,guchar **map)
static void
rgb_to_hue (GDrawable *image,
guchar **map)
{
guchar *themap,data[4];
gint w,h,x,y;
@ -661,7 +704,9 @@ void rgb_to_hue(GDrawable *image,guchar **map)
*map=themap;
}
void rgb_to_saturation(GDrawable *image,guchar **map)
static void
rgb_to_saturation (GDrawable *image,
guchar **map)
{
guchar *themap,data[4];
gint w,h,x,y;
@ -699,7 +744,9 @@ void rgb_to_saturation(GDrawable *image,guchar **map)
*map=themap;
}
void rgb_to_brightness(GDrawable *image,guchar **map)
static void
rgb_to_brightness (GDrawable *image,
guchar **map)
{
guchar *themap,data[4];
gint w,h,x,y;
@ -737,7 +784,8 @@ void rgb_to_brightness(GDrawable *image,guchar **map)
*map=themap;
}
void compute_lic_derivative(void)
static void
compute_lic_derivative (void)
{
gint xcount,ycount;
glong counter=0;
@ -783,7 +831,8 @@ void compute_lic_derivative(void)
}
}
void compute_lic_gradient(void)
static void
compute_lic_gradient (void)
{
gint xcount,ycount;
glong counter=0;
@ -831,7 +880,8 @@ void compute_lic_gradient(void)
}
}
void compute_image(void)
static void
compute_image (void)
{
gint32 new_image_id=-1,new_layer_id=-1;
GDrawable *effect;
@ -913,68 +963,47 @@ void compute_image(void)
/* Below is only UI stuff */
/**************************/
void ok_button_clicked(GtkWidget *widget, gpointer client_data)
static void
ok_button_clicked (GtkWidget *widget,
gpointer data)
{
gtk_widget_hide((GtkWidget *)client_data);
gdk_flush();
compute_image();
gtk_main_quit();
gtk_widget_hide (GTK_WIDGET (data));
gdk_flush ();
compute_image ();
gtk_main_quit ();
}
void effect_channel_callback(GtkWidget *widget,gpointer client_data)
{
if (GTK_TOGGLE_BUTTON(widget)->active)
{
licvals.effect_channel=(guchar)((glong)client_data);
}
}
void effect_operator_callback(GtkWidget *widget,gpointer client_data)
{
if (GTK_TOGGLE_BUTTON(widget)->active)
{
licvals.effect_operator=(guchar)((glong)client_data);
}
}
void effect_convolve_callback(GtkWidget *widget,gpointer client_data)
{
if (GTK_TOGGLE_BUTTON(widget)->active)
licvals.effect_convolve=(guchar)((glong)client_data);
}
gint effect_image_constrain(gint32 image_id, gint32 drawable_id, gpointer data)
static gint
effect_image_constrain (gint32 image_id,
gint32 drawable_id,
gpointer data)
{
if (drawable_id == -1)
return(TRUE);
return(gimp_drawable_is_rgb(drawable_id));
return gimp_drawable_is_rgb (drawable_id);
}
void effect_image_callback(gint32 id, gpointer data)
static void
effect_image_callback (gint32 id,
gpointer data)
{
licvals.effect_image_id=id;
licvals.effect_image_id = id;
}
void effect_parameter_update(GtkAdjustment *adjustment, gpointer client_data)
{
*((glong *)client_data)=(gdouble)adjustment->value;
}
void create_main_dialog(void)
static void
create_main_dialog (void)
{
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *vbox2;
GtkWidget *frame;
GtkWidget *vbox,*hbox,*vbox2,*hbox2;
GtkWidget *label;
GtkWidget *table;
GtkWidget *option_menu;
GtkWidget *menu;
GtkWidget *button;
GtkWidget *scale;
GtkObject *scale_data;
GSList *group=NULL;
/* Dialog */
dialog = gimp_dialog_new (_("Van Gogh (LIC)"), "lic",
gimp_plugin_help_func, "filters/lic.html",
GTK_WIN_POS_MOUSE,
@ -987,271 +1016,148 @@ void create_main_dialog(void)
NULL);
hbox = gtk_hbox_new(FALSE,5);
gtk_container_border_width(GTK_CONTAINER(hbox),5);
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),hbox);
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox);
gtk_widget_show (vbox);
vbox=gtk_vbox_new(FALSE,0);
gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 5);
hbox = gtk_hbox_new (FALSE, 6);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
frame = gtk_frame_new( _("Options"));
gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_ETCHED_IN);
gtk_container_add(GTK_CONTAINER(vbox),frame);
frame = gtk_frame_new (_("Options"));
gtk_container_add (GTK_CONTAINER (hbox), frame);
gtk_widget_show (frame);
hbox2=gtk_hbox_new(FALSE,5);
gtk_container_add(GTK_CONTAINER(frame),hbox2);
vbox2 = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox2), 2);
gtk_container_add (GTK_CONTAINER (frame), vbox2);
gtk_widget_show (vbox2);
button = gtk_check_button_new_with_label( _("Create new image"));
if (licvals.create_new_image==TRUE)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),TRUE);
gtk_container_add(GTK_CONTAINER(hbox2),button);
button = gtk_check_button_new_with_label( _("Create\nNew Image"));
gtk_label_set_justify (GTK_LABEL (GTK_BIN (button)->child), GTK_JUSTIFY_LEFT);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
licvals.create_new_image == TRUE);
gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
gtk_widget_show(button);
gtk_widget_show(hbox2);
gtk_widget_show(frame);
frame = gtk_frame_new( _("Effect channel"));
gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_ETCHED_IN);
gtk_container_add(GTK_CONTAINER(vbox),frame);
frame = gimp_radio_group_new2 (TRUE, _("Effect Channel"),
gimp_radio_button_update,
&licvals.effect_channel,
(gpointer) licvals.effect_channel,
vbox2=gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(frame),vbox2);
_("Hue"), (gpointer) 0, NULL,
_("Saturation"), (gpointer) 1, NULL,
_("Brightness"), (gpointer) 2, NULL,
button = gtk_radio_button_new_with_label(NULL, _("Hue"));
group = gtk_radio_button_group(GTK_RADIO_BUTTON(button));
if (licvals.effect_channel==0)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
NULL);
gtk_container_add (GTK_CONTAINER (hbox), frame);
gtk_widget_show (frame);
gtk_signal_connect(GTK_OBJECT(button), "toggled",
(GtkSignalFunc)effect_channel_callback,
(gpointer)0);
frame = gimp_radio_group_new2 (TRUE, _("Effect Operator"),
gimp_radio_button_update,
&licvals.effect_operator,
(gpointer) licvals.effect_operator,
gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 0);
gtk_widget_show(button);
_("Derivative"), (gpointer) 0, NULL,
_("Gradient"), (gpointer) 1, NULL,
button = gtk_radio_button_new_with_label(group, _("Saturation"));
if (licvals.effect_channel==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
NULL);
gtk_container_add (GTK_CONTAINER (hbox), frame);
gtk_widget_show (frame);
gtk_signal_connect(GTK_OBJECT(button), "toggled",
(GtkSignalFunc)effect_channel_callback,
(gpointer)1);
frame = gimp_radio_group_new2 (TRUE, _("Convolve"),
gimp_radio_button_update,
&licvals.effect_convolve,
(gpointer) licvals.effect_convolve,
gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 0);
gtk_widget_show(button);
_("With White Noise"), (gpointer) 0, NULL,
_("With Source Image"), (gpointer) 1, NULL,
button = gtk_radio_button_new_with_label(group, _("Brightness"));
if (licvals.effect_channel==2)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
NULL);
gtk_container_add (GTK_CONTAINER (hbox), frame);
gtk_widget_show (frame);
gtk_signal_connect(GTK_OBJECT(button), "toggled",
(GtkSignalFunc)effect_channel_callback,
(gpointer)2);
frame = gtk_frame_new (_("Parameters"));
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 0);
gtk_widget_show(button);
gtk_widget_show(vbox2);
gtk_widget_show(frame);
frame = gtk_frame_new( _("Effect operator"));
gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_ETCHED_IN);
gtk_container_add(GTK_CONTAINER(vbox),frame);
vbox2=gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(frame),vbox2);
button = gtk_radio_button_new_with_label(NULL, _("Derivative"));
group = gtk_radio_button_group(GTK_RADIO_BUTTON(button));
if (licvals.effect_operator==0)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
gtk_signal_connect(GTK_OBJECT(button), "toggled",
(GtkSignalFunc)effect_operator_callback,
(gpointer)0);
gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 0);
gtk_widget_show(button);
button = gtk_radio_button_new_with_label(group, _("Gradient"));
if (licvals.effect_operator==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
gtk_signal_connect(GTK_OBJECT(button), "toggled",
(GtkSignalFunc)effect_operator_callback,
(gpointer)1);
gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 0);
gtk_widget_show(button);
gtk_widget_show(vbox2);
gtk_widget_show(frame);
frame = gtk_frame_new( _("Convolve"));
gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_ETCHED_IN);
gtk_container_add(GTK_CONTAINER(vbox),frame);
vbox2=gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(frame),vbox2);
button = gtk_radio_button_new_with_label(NULL, _("With white noise"));
group = gtk_radio_button_group(GTK_RADIO_BUTTON(button));
if (licvals.effect_convolve==0)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
gtk_signal_connect(GTK_OBJECT(button), "toggled",
(GtkSignalFunc)effect_convolve_callback,
(gpointer)0);
gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 0);
gtk_widget_show(button);
button = gtk_radio_button_new_with_label(group, _("With source image"));
if (licvals.effect_convolve==1)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
gtk_signal_connect(GTK_OBJECT(button), "toggled",
(GtkSignalFunc)effect_convolve_callback,
(gpointer)1);
gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 0);
gtk_widget_show(button);
gtk_widget_show(vbox2);
gtk_widget_show(frame);
gtk_widget_show(vbox);
vbox=gtk_vbox_new(FALSE,0);
gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 5);
frame = gtk_frame_new( _("Parameters"));
gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_ETCHED_IN);
gtk_container_add(GTK_CONTAINER(vbox),frame);
table = gtk_table_new (6, 3, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_container_set_border_width (GTK_CONTAINER (table), 4);
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_widget_show (table);
/* Effect image menu */
vbox2=gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(frame),vbox2);
hbox2=gtk_hbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(vbox2),hbox2);
label = gtk_label_new( _("Effect image:"));
gtk_container_add(GTK_CONTAINER(hbox2),label);
gtk_widget_show(label);
option_menu = gtk_option_menu_new();
option_menu = gtk_option_menu_new ();
menu = gimp_drawable_menu_new(effect_image_constrain,
effect_image_callback,
NULL,
licvals.effect_image_id);
gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu);
gimp_table_attach_aligned (GTK_TABLE (table), 0,
_("Effect Image:"), 1.0, 0.5,
option_menu, TRUE);
gtk_option_menu_set_menu(GTK_OPTION_MENU(option_menu), menu);
scale_data = gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
_("Filter Length"), 0, 0,
licvals.filtlen, 0, 64, 1.0, 8.0, 1,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT(scale_data), "value_changed",
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&licvals.filtlen);
gtk_container_add(GTK_CONTAINER(hbox2),option_menu);
gtk_widget_show(option_menu);
gtk_widget_show(hbox2);
scale_data = gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
_("Noise Magnitude:"), 0, 0,
licvals.noisemag, 1, 5, 0.1, 1.0, 1,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT(scale_data), "value_changed",
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&licvals.noisemag);
label = gtk_label_new( _("Filter length:"));
gtk_misc_set_alignment(GTK_MISC(label), 0.5, 1.0);
gtk_container_add(GTK_CONTAINER(vbox2),label);
gtk_widget_show(label);
scale_data = gimp_scale_entry_new (GTK_TABLE (table), 0, 3,
_("Integration Steps:"), 0, 0,
licvals.intsteps, 1, 40, 1.0, 5.0, 1,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT(scale_data), "value_changed",
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&licvals.intsteps);
scale_data = gtk_adjustment_new(licvals.filtlen, 0, 64, 1.0, 1.0, 0.0);
gtk_signal_connect(GTK_OBJECT(scale_data), "value_changed",
(GtkSignalFunc)effect_parameter_update,
(gpointer)&licvals.filtlen);
scale = gtk_hscale_new(GTK_ADJUSTMENT(scale_data));
gtk_range_set_update_policy(GTK_RANGE(scale), GTK_UPDATE_CONTINUOUS);
gtk_container_add(GTK_CONTAINER(vbox2),scale);
gtk_widget_show(scale);
scale_data = gimp_scale_entry_new (GTK_TABLE (table), 0, 4,
_("Minimum Value:"), 0, 0,
licvals.minv, -100, 0, 1, 10, 1,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT(scale_data), "value_changed",
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&licvals.minv);
label = gtk_label_new( _("Noise magnitude:"));
gtk_misc_set_alignment(GTK_MISC(label), 0.5, 1.0);
gtk_container_add(GTK_CONTAINER(vbox2),label);
gtk_widget_show(label);
scale_data = gimp_scale_entry_new (GTK_TABLE (table), 0, 5,
_("Maximum Value:"), 0, 0,
licvals.maxv, 0, 100, 1, 10, 1,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT(scale_data), "value_changed",
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&licvals.maxv);
scale_data = gtk_adjustment_new(licvals.noisemag, 1, 5, 1.0, 1.0, 0.0);
gtk_signal_connect(GTK_OBJECT(scale_data), "value_changed",
(GtkSignalFunc)effect_parameter_update,
(gpointer)&licvals.noisemag);
scale = gtk_hscale_new(GTK_ADJUSTMENT(scale_data));
gtk_range_set_update_policy(GTK_RANGE(scale), GTK_UPDATE_CONTINUOUS);
gtk_container_add(GTK_CONTAINER(vbox2),scale);
gtk_widget_show(scale);
label = gtk_label_new( _("Integration steps:"));
gtk_misc_set_alignment(GTK_MISC(label), 0.5, 1.0);
gtk_container_add(GTK_CONTAINER(vbox2),label);
gtk_widget_show(label);
scale_data = gtk_adjustment_new(licvals.intsteps, 1, 40, 1.0, 1.0, 0.0);
gtk_signal_connect(GTK_OBJECT(scale_data), "value_changed",
(GtkSignalFunc)effect_parameter_update,
(gpointer)&licvals.intsteps);
scale = gtk_hscale_new(GTK_ADJUSTMENT(scale_data));
gtk_range_set_update_policy(GTK_RANGE(scale), GTK_UPDATE_CONTINUOUS);
gtk_container_add(GTK_CONTAINER(vbox2),scale);
gtk_widget_show(scale);
label = gtk_label_new( _("Minimum value:"));
gtk_misc_set_alignment(GTK_MISC(label), 0.5, 1.0);
gtk_container_add(GTK_CONTAINER(vbox2),label);
gtk_widget_show(label);
scale_data = gtk_adjustment_new(licvals.minv, -100, 0, 1.0, 1.0, 0.0);
gtk_signal_connect(GTK_OBJECT(scale_data), "value_changed",
(GtkSignalFunc)effect_parameter_update,
(gpointer)&licvals.minv);
scale = gtk_hscale_new(GTK_ADJUSTMENT(scale_data));
gtk_range_set_update_policy(GTK_RANGE(scale), GTK_UPDATE_CONTINUOUS);
gtk_container_add(GTK_CONTAINER(vbox2),scale);
gtk_widget_show(scale);
label = gtk_label_new( _("Maximum value:"));
gtk_misc_set_alignment(GTK_MISC(label), 0.5, 1.0);
gtk_container_add(GTK_CONTAINER(vbox2),label);
gtk_widget_show(label);
scale_data = gtk_adjustment_new(licvals.maxv, 0, 100, 1.0, 1.0, 0.0);
gtk_signal_connect(GTK_OBJECT(scale_data), "value_changed",
(GtkSignalFunc)effect_parameter_update,
(gpointer)&licvals.maxv);
scale = gtk_hscale_new(GTK_ADJUSTMENT(scale_data));
gtk_range_set_update_policy(GTK_RANGE(scale), GTK_UPDATE_CONTINUOUS);
gtk_container_add(GTK_CONTAINER(vbox2),scale);
gtk_widget_show(scale);
gtk_widget_show(vbox2);
gtk_widget_show(frame);
gtk_widget_show(vbox);
gtk_widget_show(hbox);
/* Done */
gtk_widget_show(dialog);
gtk_widget_show (dialog);
}
/******************/
/* Implementation */
/******************/
void lic_interactive (GDrawable *drawable);
void lic_noninteractive (GDrawable *drawable);
static void lic_interactive (GDrawable *drawable);
/*
static void lic_noninteractive (GDrawable *drawable);
*/
/*************************************/
/* Set parameters to standard values */
/*************************************/
void set_default_settings(void)
static void
set_default_settings (void)
{
licvals.filtlen=5;
licvals.noisemag=2;
@ -1265,14 +1171,15 @@ void set_default_settings(void)
licvals.effect_image_id=0;
}
static void query(void)
static void
query (void)
{
static GParamDef args[] =
{
{ PARAM_INT32, "run_mode", "Interactive" },
{ PARAM_IMAGE, "image", "Input image" },
{ PARAM_DRAWABLE, "drawable", "Input drawable" },
};
{
{ PARAM_INT32, "run_mode", "Interactive" },
{ PARAM_IMAGE, "image", "Input image" },
{ PARAM_DRAWABLE, "drawable", "Input drawable" },
};
static GParamDef *return_vals = NULL;
static gint nargs = sizeof (args) / sizeof (args[0]);
@ -1293,11 +1200,12 @@ static void query(void)
args, return_vals);
}
static void run(gchar *name,
gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals)
static void
run (gchar *name,
gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[1];
GDrawable *drawable;
@ -1369,13 +1277,14 @@ static void run(gchar *name,
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
void lic_interactive(GDrawable *drawable)
static void
lic_interactive (GDrawable *drawable)
{
gchar **argv;
gint argc;
@ -1387,29 +1296,31 @@ void lic_interactive(GDrawable *drawable)
gtk_init (&argc, &argv);
gtk_rc_parse(gimp_gtkrc());
gdk_set_use_xshm(gimp_use_xshm());
gdk_set_use_xshm (gimp_use_xshm());
/* Create application window */
/* ========================= */
create_main_dialog();
create_main_dialog ();
/* Prepare images */
/* ============== */
image_setup(drawable,TRUE);
image_setup (drawable, TRUE);
/* Gtk main event loop */
/* =================== */
gtk_main();
gdk_flush();
gtk_main ();
gdk_flush ();
}
void lic_noninteractive(GDrawable *drawable)
/*
static void
lic_noninteractive (GDrawable *drawable)
{
printf("Noninteractive not yet implemented! Sorry.\n");
g_message ("Noninteractive not yet implemented! Sorry.\n");
}
*/
MAIN()

View file

@ -101,6 +101,8 @@
#define ENCAPSULATION_UUENCODE 0
#define ENCAPSULATION_MIME 1
#define BUFFER_SIZE 256
#include "config.h"
#include <stdlib.h>
@ -131,27 +133,29 @@ static void run (gchar *name,
gint *nreturn_vals,
GParam **return_vals);
static gint save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID,
gint32 run_mode);
static GStatusType save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID,
gint32 run_mode);
static gint save_dialog (void);
static void ok_callback (GtkWidget *widget, gpointer data);
static void encap_callback (GtkWidget *widget, gpointer data);
static void receipt_callback (GtkWidget *widget, gpointer data);
static void from_callback (GtkWidget *widget, gpointer data);
static void subject_callback (GtkWidget *widget, gpointer data);
static void comment_callback (GtkWidget *widget, gpointer data);
static void filename_callback (GtkWidget *widget, gpointer data);
static void mesg_body_callback (GtkWidget *widget, gpointer data);
static gint save_dialog (void);
static void ok_callback (GtkWidget *widget,
gpointer data);
static void mail_entry_callback (GtkWidget *widget,
gpointer data);
static void mesg_body_callback (GtkWidget *widget,
gpointer data);
static gint valid_file (gchar *filename);
static void create_headers (FILE * mailpipe);
static void create_headers (FILE *mailpipe);
static char * find_extension (gchar *filename);
static gint to64 (FILE *infile, FILE *outfile);
static void output64chunk (gint c1, gint c2, gint c3, gint pads,
FILE *outfile);
static gint to64 (FILE *infile,
FILE *outfile);
static void output64chunk (gint c1,
gint c2,
gint c3,
gint pads,
FILE *outfile);
GPlugInInfo PLUG_IN_INFO =
{
@ -163,11 +167,11 @@ GPlugInInfo PLUG_IN_INFO =
typedef struct
{
gchar receipt[256];
gchar subject[256];
gchar comment[256];
gchar from[256];
gchar filename[256];
gchar receipt[BUFFER_SIZE];
gchar subject[BUFFER_SIZE];
gchar comment[BUFFER_SIZE];
gchar from[BUFFER_SIZE];
gchar filename[BUFFER_SIZE];
gint encapsulation;
}
m_info;
@ -231,21 +235,21 @@ run (gchar *name,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
gint32 drawable_ID;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
INIT_I18N_UI();
run_mode = param[0].data.d_int32;
run_mode = param[0].data.d_int32;
image_ID = param[1].data.d_image;
drawable_ID = param[2].data.d_drawable;
image_ID = param[1].data.d_image;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "plug_in_mail_image") == 0)
{
@ -254,23 +258,27 @@ run (gchar *name,
case RUN_INTERACTIVE:
gimp_get_data ("plug_in_mail_image", &mail_info);
if (!save_dialog ())
return;
status = STATUS_CANCEL;
break;
case RUN_NONINTERACTIVE:
/* Make sure all the arguments are there! */
if (nparams != 9)
status = STATUS_CALLING_ERROR;
if(status == STATUS_SUCCESS)
{
status = STATUS_CALLING_ERROR;
}
else
{
/* this hasnt been tested yet */
strncpy (mail_info.filename, param[3].data.d_string,256);
strncpy (mail_info.receipt, param[4].data.d_string,256);
strncpy (mail_info.receipt, param[5].data.d_string,256);
strncpy (mail_info.subject, param[6].data.d_string,256);
strncpy (mail_info.comment, param[7].data.d_string,256);
strncpy (mail_info.filename, param[3].data.d_string, BUFFER_SIZE);
strncpy (mail_info.receipt, param[4].data.d_string, BUFFER_SIZE);
strncpy (mail_info.receipt, param[5].data.d_string, BUFFER_SIZE);
strncpy (mail_info.subject, param[6].data.d_string, BUFFER_SIZE);
strncpy (mail_info.comment, param[7].data.d_string, BUFFER_SIZE);
mail_info.encapsulation = param[8].data.d_int32;
}
break;
case RUN_WITH_LAST_VALS:
gimp_get_data ("plug_in_mail_image", &mail_info);
break;
@ -279,48 +287,53 @@ run (gchar *name,
break;
}
if (run_mode == RUN_INTERACTIVE)
gimp_set_data ("plug_in_mail_image", &mail_info, sizeof(m_info));
*nreturn_vals = 1;
if (save_image (mail_info.filename,
image_ID,
drawable_ID,
run_mode))
if (status == STATUS_SUCCESS)
{
values[0].data.d_status = STATUS_SUCCESS;
status = save_image (mail_info.filename,
image_ID,
drawable_ID,
run_mode);
if (status == STATUS_SUCCESS)
{
gimp_set_data ("plug_in_mail_image", &mail_info, sizeof(m_info));
}
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
}
else
g_assert (FALSE);
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
static gint
static GStatusType
save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID,
gint32 run_mode)
{
GParam *params;
gint retvals;
char *ext;
char *tmpname;
char mailcmdline[512];
int pid;
int status;
FILE *mailpipe;
FILE *infile;
gint retvals;
gchar *ext;
gchar *tmpname;
gchar mailcmdline[512];
gint pid;
gint status;
gint process_status;
FILE *mailpipe;
FILE *infile;
if (NULL == (ext = find_extension (filename)))
return -1;
return STATUS_CALLING_ERROR;
/* get a temp name with the right extension and save into it. */
params = gimp_run_procedure ("gimp_temp_name",
&retvals,
PARAM_STRING, ext + 1,
PARAM_END);
tmpname = g_strdup (params[1].data.d_string);
gimp_destroy_params (params, retvals);
@ -348,45 +361,48 @@ save_image (gchar *filename,
PARAM_STRING, tmpname,
PARAM_STRING, tmpname,
PARAM_END);
/* need to figure a way to make sure the user is trying to save in an approriate format */
/* but this can wait.... */
/* need to figure a way to make sure the user is trying to save
* in an approriate format but this can wait....
*/
if (params[0].data.d_status == FALSE || !valid_file (tmpname))
status = params[0].data.d_status;
if (! valid_file (tmpname) ||
status != STATUS_SUCCESS)
{
unlink (tmpname);
g_free (tmpname);
return -1;
return status;
}
if( mail_info.encapsulation == ENCAPSULATION_UUENCODE ) {
if (mail_info.encapsulation == ENCAPSULATION_UUENCODE)
{
#ifndef __EMX__
/* fork off a uuencode process */
if ((pid = fork ()) < 0)
{
g_message ("mail: fork failed: %s\n", g_strerror (errno));
g_free (tmpname);
return -1;
}
{
g_message ("mail: fork failed: %s\n", g_strerror (errno));
g_free (tmpname);
return STATUS_EXECUTION_ERROR;
}
else if (pid == 0)
{
if (-1 == dup2 (fileno (mailpipe), fileno (stdout)))
{
g_message ("mail: dup2 failed: %s\n", g_strerror (errno));
}
execlp (UUENCODE, UUENCODE, tmpname, filename, NULL);
/* What are we doing here? exec must have failed */
g_message ("mail: exec failed: uuencode: %s\n", g_strerror (errno));
/* close the pipe now */
pclose (mailpipe);
g_free (tmpname);
_exit (127);
}
{
if (-1 == dup2 (fileno (mailpipe), fileno (stdout)))
{
g_message ("mail: dup2 failed: %s\n", g_strerror (errno));
}
execlp (UUENCODE, UUENCODE, tmpname, filename, NULL);
/* What are we doing here? exec must have failed */
g_message ("mail: exec failed: uuencode: %s\n", g_strerror (errno));
/* close the pipe now */
pclose (mailpipe);
g_free (tmpname);
_exit (127);
}
else
#else /* __EMX__ */
int tfd;
@ -395,75 +411,73 @@ save_image (gchar *filename,
if (dup2 (fileno (mailpipe), fileno (stdout)) == -1)
{
g_message ("mail: dup2 failed: %s\n", g_strerror (errno));
close(tfd);
close (tfd);
g_free (tmpname);
return -1;
return STATUS_EXECUTION_ERROR;
}
fcntl(tfd, F_SETFD, FD_CLOEXEC);
fcntl (tfd, F_SETFD, FD_CLOEXEC);
pid = spawnlp (P_NOWAIT, UUENCODE, UUENCODE, tmpname, filename, NULL);
/* restore fileno(stdout) */
dup2 (tfd, fileno (stdout));
close(tfd);
close (tfd);
if (pid == -1)
{
g_message ("mail: spawn failed: %s\n", g_strerror (errno));
g_free (tmpname);
return -1;
return STATUS_EXECUTION_ERROR;
}
#endif
{
waitpid (pid, &status, 0);
if (!WIFEXITED (status) ||
WEXITSTATUS (status) != 0)
{
g_message ("mail: mail didnt work or something on file %s\n", tmpname);
g_free (tmpname);
return 0;
}
}
}
else { /* This must be MIME stuff. Base64 away... */
{
waitpid (pid, &process_status, 0);
if (!WIFEXITED (process_status) ||
WEXITSTATUS (process_status) != 0)
{
g_message ("mail: mail didnt work or something on file %s\n", tmpname);
g_free (tmpname);
return STATUS_EXECUTION_ERROR;
}
}
}
else
{ /* This must be MIME stuff. Base64 away... */
infile = fopen(tmpname,"r");
to64(infile,mailpipe);
/* close off mime */
if( mail_info.encapsulation == ENCAPSULATION_MIME ) {
fprintf(mailpipe, "\n--GUMP-MIME-boundary--\n");
}
}
if( mail_info.encapsulation == ENCAPSULATION_MIME )
{
fprintf (mailpipe, "\n--GUMP-MIME-boundary--\n");
}
}
/* delete the tmpfile that was generated */
unlink (tmpname);
g_free (tmpname);
return TRUE;
return STATUS_SUCCESS;
}
static gint
save_dialog (void)
{
/* argh, guess this all needs to be struct that i can pass to the ok_callback
so i can get the text from it then. Seems a bit ugly, but maybe its better.
I dunno. */
GtkWidget *dlg;
GtkWidget *entry;
GtkWidget *table;
GtkWidget *table2;
GtkWidget *label;
GtkWidget *button1;
GtkWidget *button2;
GtkWidget *vbox;
GtkWidget *text;
GtkWidget *vscrollbar;
GSList *group;
gint argc;
gchar **argv;
gchar buffer[32];
gchar buffer[BUFFER_SIZE];
gint nreturn_vals;
GParam *return_vals;
argc = 1;
argv = g_new (gchar *, 1);
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("mail");
gtk_init (&argc, &argv);
@ -478,7 +492,7 @@ save_dialog (void)
/* check to see if we actually got a value */
if (return_vals[0].data.d_status == STATUS_SUCCESS &&
return_vals[1].data.d_string != NULL)
strncpy (mail_info.from, return_vals[1].data.d_string , 256);
strncpy (mail_info.from, return_vals[1].data.d_string , BUFFER_SIZE);
gimp_destroy_params (return_vals, nreturn_vals);
@ -507,137 +521,71 @@ save_dialog (void)
gtk_table_set_row_spacings (GTK_TABLE (table), 4);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
/* To: Label */
label = gtk_label_new ("To:");
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label,
0, 1, 0, 1,
GTK_SHRINK | GTK_FILL,
GTK_SHRINK | GTK_FILL,
0, 0);
gtk_widget_show (label);
/* to: dialog */
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry,
1, 2, 0, 1,
GTK_EXPAND | GTK_FILL,
GTK_SHRINK | GTK_FILL,
0, 0);
gtk_widget_set_usize (entry, 200, 0);
sprintf (buffer, "%s", mail_info.receipt);
g_snprintf (buffer, sizeof (buffer), "%s", mail_info.receipt);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gimp_table_attach_aligned (GTK_TABLE (table), 0,
_("To:"), 1.0, 0.5,
entry, FALSE);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) receipt_callback, &mail_info.receipt);
gtk_widget_show (entry);
/* From Label */
label = gtk_label_new ("From:");
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label,
0, 1, 1, 2,
GTK_SHRINK | GTK_FILL,
GTK_SHRINK | GTK_FILL,
0, 0);
gtk_widget_show (label);
GTK_SIGNAL_FUNC (mail_entry_callback),
&mail_info.receipt);
/* From entry */
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry,
1, 2, 1, 2,
GTK_EXPAND | GTK_FILL,
GTK_SHRINK | GTK_FILL,
0, 0);
gtk_widget_set_usize (entry, 200, 0);
sprintf (buffer, "%s", mail_info.from);
g_snprintf (buffer, sizeof (buffer), "%s", mail_info.from);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gimp_table_attach_aligned (GTK_TABLE (table), 1,
_("From:"), 1.0, 0.5,
entry, FALSE);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) from_callback, &mail_info.from);
gtk_widget_show (entry);
/* Subject Label */
label = gtk_label_new ("Subject:");
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label,
0, 1, 2, 3,
GTK_SHRINK | GTK_FILL,
GTK_SHRINK | GTK_FILL,
0, 0);
gtk_widget_show (label);
GTK_SIGNAL_FUNC (mail_entry_callback),
&mail_info.from);
/* Subject entry */
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry,
1, 2, 2, 3,
GTK_EXPAND | GTK_FILL,
GTK_SHRINK | GTK_FILL,
0, 0);
gtk_widget_set_usize (entry, 200, 0);
sprintf (buffer, "%s", mail_info.subject);
g_snprintf (buffer, sizeof (buffer), "%s", mail_info.subject);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gimp_table_attach_aligned (GTK_TABLE (table), 2,
_("Subject:"), 1.0, 0.5,
entry, FALSE);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) subject_callback, &mail_info.subject);
gtk_widget_show (entry);
/* Comment label */
label = gtk_label_new ("Comment:");
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label,
0, 1, 3, 4,
GTK_SHRINK | GTK_FILL,
GTK_SHRINK | GTK_FILL,
0, 0);
gtk_widget_show (label);
GTK_SIGNAL_FUNC (mail_entry_callback),
&mail_info.subject);
/* Comment entry */
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry,
1, 2, 3, 4,
GTK_EXPAND | GTK_FILL,
GTK_SHRINK | GTK_FILL,
0, 0);
gtk_widget_set_usize (entry, 200, 0);
sprintf (buffer, "%s", mail_info.comment);
g_snprintf (buffer, sizeof (buffer), "%s", mail_info.comment);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gimp_table_attach_aligned (GTK_TABLE (table), 3,
_("Comment:"), 1.0, 0.5,
entry, FALSE);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) comment_callback, &mail_info.comment);
gtk_widget_show (entry);
/* Filename label */
label = gtk_label_new (_("Filename:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label,
0, 1, 4, 5,
GTK_SHRINK | GTK_FILL,
GTK_SHRINK | GTK_FILL,
0, 0);
gtk_widget_show (label);
GTK_SIGNAL_FUNC (mail_entry_callback),
&mail_info.comment);
/* Filename entry */
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry,
1, 2, 4, 5,
GTK_EXPAND | GTK_FILL,
GTK_SHRINK | GTK_FILL,
0, 0);
gtk_widget_set_usize (entry, 200, 0);
sprintf (buffer, "%s", mail_info.filename);
g_snprintf (buffer, sizeof (buffer), "%s", mail_info.filename);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gimp_table_attach_aligned (GTK_TABLE (table), 4,
_("Filename:"), 1.0, 0.5,
entry, FALSE);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) filename_callback, &mail_info.filename);
gtk_widget_show (entry);
GTK_SIGNAL_FUNC (mail_entry_callback),
&mail_info.filename);
/* comment */
table2 = gtk_table_new (2, 2, FALSE);
gtk_table_set_row_spacing (GTK_TABLE (table2), 0, 2);
gtk_table_set_col_spacing (GTK_TABLE (table2), 0, 2);
/* gtk_box_pack_start (GTK_BOX (box2), table2, TRUE, TRUE, 0);
gtk_widget_show (table2); */
gtk_table_attach (GTK_TABLE (table), table2,
0, 2, 5, 6,
GTK_EXPAND | GTK_FILL,
@ -654,14 +602,14 @@ save_dialog (void)
gtk_widget_set_usize (text, 200, 100);
gtk_widget_show (text);
gtk_signal_connect (GTK_OBJECT (text), "changed",
(GtkSignalFunc) mesg_body_callback, mesg_body);
GTK_SIGNAL_FUNC (mesg_body_callback),
mesg_body);
gtk_widget_show (table2);
vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text)->vadj);
gtk_table_attach (GTK_TABLE (table2), vscrollbar, 1, 2, 0, 1,
GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (vscrollbar);
/* Encapsulation label */
label = gtk_label_new (_("Encapsulation:"));
@ -670,32 +618,21 @@ save_dialog (void)
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (label);
/* Encapsulation radiobutton */
button1 = gtk_radio_button_new_with_label( NULL, _("Uuencode"));
group = gtk_radio_button_group( GTK_RADIO_BUTTON( button1 ) );
button2 = gtk_radio_button_new_with_label( group, _("MIME" ));
if (mail_info.encapsulation == ENCAPSULATION_UUENCODE)
{
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button1), TRUE);
}
else
{
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button2), TRUE);
}
gtk_signal_connect (GTK_OBJECT (button1), "toggled",
(GtkSignalFunc) encap_callback,
(gpointer) "uuencode" );
gtk_signal_connect (GTK_OBJECT (button2), "toggled",
(GtkSignalFunc) encap_callback,
(gpointer) "mime" );
/* Encapsulation radiobuttons */
vbox = gimp_radio_group_new2 (FALSE, NULL,
gimp_radio_button_update,
&mail_info.encapsulation,
(gpointer) mail_info.encapsulation,
gtk_table_attach (GTK_TABLE (table), button1, 1, 2, 6, 7,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (button1);
_("Uuencode"),
(gpointer) ENCAPSULATION_UUENCODE, NULL,
_("MIME"),
(gpointer) ENCAPSULATION_MIME, NULL,
gtk_table_attach (GTK_TABLE (table), button2, 1, 2, 7, 8,
NULL);
gtk_table_attach (GTK_TABLE (table), vbox, 1, 2, 6, 8,
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (button2);
gtk_widget_show (vbox);
gtk_widget_show (dlg);
@ -719,7 +656,7 @@ valid_file (gchar *filename)
return 0;
}
gchar *
static gchar *
find_content_type (gchar *filename)
{
/* This function returns a MIME Content-type: value based on the
@ -817,54 +754,10 @@ ok_callback (GtkWidget *widget,
}
static void
encap_callback (GtkWidget *widget,
gpointer data)
mail_entry_callback (GtkWidget *widget,
gpointer data)
{
/* Ignore the toggle-off signal, we are only interested in
what is being set */
if (! GTK_TOGGLE_BUTTON (widget)->active)
{
return;
}
if (strcmp (data, "uuencode") == 0)
mail_info.encapsulation = ENCAPSULATION_UUENCODE;
if (strcmp (data, "mime") == 0)
mail_info.encapsulation = ENCAPSULATION_MIME;
}
static void
receipt_callback (GtkWidget *widget,
gpointer data)
{
strncpy (mail_info.receipt, gtk_entry_get_text (GTK_ENTRY (widget)), 256);
}
static void
from_callback (GtkWidget *widget,
gpointer data)
{
strncpy (mail_info.from, gtk_entry_get_text (GTK_ENTRY (widget)), 256);
}
static void
subject_callback (GtkWidget *widget,
gpointer data)
{
strncpy (mail_info.subject, gtk_entry_get_text (GTK_ENTRY (widget)), 256);
}
static void
comment_callback (GtkWidget *widget,
gpointer data)
{
strncpy (mail_info.comment, gtk_entry_get_text (GTK_ENTRY (widget)), 256);
}
static void
filename_callback (GtkWidget *widget,
gpointer data)
{
strncpy (mail_info.filename, gtk_entry_get_text (GTK_ENTRY (widget)), 256);
strncpy ((gchar *) data, gtk_entry_get_text (GTK_ENTRY (widget)), BUFFER_SIZE);
}
static void
@ -967,7 +860,7 @@ static gint
to64 (FILE *infile,
FILE *outfile)
{
int c1, c2, c3, ct=0, written=0;
gint c1, c2, c3, ct = 0, written = 0;
while ((c1 = getc (infile)) != EOF)
{
@ -1014,6 +907,7 @@ output64chunk (gint c1,
{
putc (basis_64[c1>>2], outfile);
putc (basis_64[((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)], outfile);
if (pads == 2)
{
putc ('=', outfile);

View file

@ -301,7 +301,7 @@ static gint
dialog (void)
{
GtkWidget *dlg;
GtkWidget *hbox;
GtkWidget *frame;
GtkWidget *table;
guchar *color_cube;
gchar **argv;
@ -341,17 +341,18 @@ dialog (void)
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
hbox = gtk_hbox_new (FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), hbox, TRUE, TRUE, 0);
gtk_widget_show (hbox);
frame = gtk_frame_new (_("Colors"));
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
/* The table keeps the color selections */
table = gtk_table_new (2, 4, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 4);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_table_set_col_spacing (GTK_TABLE (table), 1, 6);
gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
gtk_container_set_border_width (GTK_CONTAINER (table), 4);
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_widget_show (table);
add_color_button (0, 0, 0, table);

View file

@ -26,27 +26,27 @@
#include <stdlib.h>
#include <string.h>
#include "gtk/gtk.h"
#include "config.h"
#include <gtk/gtk.h>
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include <libgimp/gimpmath.h>
#include "libgimp/stdplugins-intl.h"
#include "libgimp/gimp.h"
/* The mosaic logo */
#include "mosaic_logo.h"
#ifndef RAND_MAX
#define RAND_MAX 2147483647
#endif /* RAND_MAX */
#define SCALE_WIDTH 150
#define HORIZONTAL 0
#define VERTICAL 1
#define HORIZONTAL 0
#define VERTICAL 1
#define OPAQUE 255
#define SUPERSAMPLE 3
#define MAG_THRESHOLD 7.5
#define COUNT_THRESHOLD 0.1
#define MAX_POINTS 12
#define SUPERSAMPLE 3
#define MAG_THRESHOLD 7.5
#define COUNT_THRESHOLD 0.1
#define MAX_POINTS 12
#define SQUARES 0
#define HEXAGONS 1
@ -99,15 +99,17 @@ typedef struct
/* Declare local functions.
*/
static void query (void);
static void run (char *name,
int nparams,
static void run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals);
static void mosaic (GDrawable *drawable);
/* user interface functions */
static gint mosaic_dialog (void);
static gint mosaic_dialog (void);
static void mosaic_ok_callback (GtkWidget *widget,
gpointer data);
/* gradient finding machinery */
static void find_gradients (GDrawable *drawable,
@ -234,14 +236,6 @@ static gint polygon_extents (Polygon * poly,
gdouble * max_y);
static void polygon_reset (Polygon * poly);
static void mosaic_close_callback (GtkWidget *widget,
gpointer data);
static void mosaic_ok_callback (GtkWidget *widget,
gpointer data);
static void mosaic_toggle_update (GtkWidget *widget,
gpointer data);
static void mosaic_scale_update (GtkAdjustment *adjustment,
double *scale_val);
/*
* Some static variables
*/
@ -286,17 +280,17 @@ static MosaicInterface mint =
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN ()
static void
query ()
query (void)
{
static GParamDef args[] =
{
@ -336,24 +330,23 @@ query ()
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[1];
GDrawable *active_drawable;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
GDrawable *active_drawable;
run_mode = param[0].data.d_int32;
values[0].type = PARAM_STATUS;
values[0].data.d_status = status;
*nreturn_vals = 1;
*return_vals = values;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = status;
switch (run_mode)
{
@ -411,10 +404,12 @@ run (char *name,
/* Create the mosaic */
if ((status == STATUS_SUCCESS) &&
(gimp_drawable_is_rgb (active_drawable->id) || gimp_drawable_is_gray (active_drawable->id)))
(gimp_drawable_is_rgb (active_drawable->id) ||
gimp_drawable_is_gray (active_drawable->id)))
{
/* set the tile cache size so that the gaussian blur works well */
gimp_tile_cache_ntiles (2 * (MAX (active_drawable->width, active_drawable->height) /
gimp_tile_cache_ntiles (2 * (MAX (active_drawable->width,
active_drawable->height) /
gimp_tile_width () + 1));
/* run the effect */
@ -511,14 +506,10 @@ mosaic (GDrawable *drawable)
}
static gint
mosaic_dialog ()
mosaic_dialog (void)
{
GtkWidget *dlg;
GtkWidget *label;
GtkWidget *hbbox;
GtkWidget *button;
GtkWidget *toggle;
GtkWidget *scale;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *logo_box;
@ -528,17 +519,13 @@ mosaic_dialog ()
GtkWidget *preview;
GtkWidget *table;
GtkObject *scale_data;
GSList *group = NULL;
guchar *color_cube;
gchar **argv;
gint argc;
gint use_squares = (mvals.tile_type == SQUARES);
gint use_hexagons = (mvals.tile_type == HEXAGONS);
gint use_octagons = (mvals.tile_type == OCTAGONS);
gint y;
gint argc;
gint y;
argc = 1;
argv = g_new (gchar *, 1);
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("mosaic");
gtk_init (&argc, &argv);
@ -554,50 +541,35 @@ mosaic_dialog ()
gtk_widget_set_default_visual (gtk_preview_get_visual ());
gtk_widget_set_default_colormap (gtk_preview_get_cmap ());
dlg = gtk_dialog_new ();
gtk_window_set_title (GTK_WINDOW (dlg), _("Mosaic"));
gtk_window_position (GTK_WINDOW (dlg), GTK_WIN_POS_MOUSE);
dlg = gimp_dialog_new (_("Mosaic"), "mosaic",
gimp_plugin_help_func, "filters/mosaic.html",
GTK_WIN_POS_MOUSE,
FALSE, TRUE, FALSE,
_("OK"), mosaic_ok_callback,
NULL, NULL, NULL, TRUE, FALSE,
_("Cancel"), gtk_widget_destroy,
NULL, 1, NULL, FALSE, TRUE,
NULL);
gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
(GtkSignalFunc) mosaic_close_callback,
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
/* Action area */
gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dlg)->action_area), 2);
gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dlg)->action_area), FALSE);
hbbox = gtk_hbutton_box_new ();
gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbbox), 4);
gtk_box_pack_end (GTK_BOX (GTK_DIALOG (dlg)->action_area), hbbox, FALSE, FALSE, 0);
gtk_widget_show (hbbox);
button = gtk_button_new_with_label (_("OK"));
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_signal_connect (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) mosaic_ok_callback,
dlg);
gtk_box_pack_start (GTK_BOX (hbbox), button, FALSE, FALSE, 0);
gtk_widget_grab_default (button);
gtk_widget_show (button);
button = gtk_button_new_with_label (_("Cancel"));
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) gtk_widget_destroy,
GTK_OBJECT (dlg));
gtk_box_pack_start (GTK_BOX (hbbox), button, FALSE, FALSE, 0);
gtk_widget_show (button);
/* The main hbox -- splits the scripts and the info vbox */
main_hbox = gtk_hbox_new (FALSE, 5);
gtk_container_border_width (GTK_CONTAINER (main_hbox), 10);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), main_hbox, TRUE, TRUE, 0);
main_hbox = gtk_hbox_new (FALSE, 6);
gtk_container_set_border_width (GTK_CONTAINER (main_hbox), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), main_hbox,
TRUE, TRUE, 0);
/* The vbox for first column of options */
vbox = gtk_vbox_new (FALSE, 5);
gtk_box_pack_start (GTK_BOX (main_hbox), vbox, TRUE, TRUE, 0);
vbox = gtk_vbox_new (FALSE, 4);
gtk_box_pack_start (GTK_BOX (main_hbox), vbox, FALSE, FALSE, 0);
/* The logo frame & drawing area */
hbox = gtk_hbox_new (FALSE, 5);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
hbox = gtk_hbox_new (FALSE, 6);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
logo_box = gtk_vbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), logo_box, FALSE, FALSE, 0);
@ -622,15 +594,16 @@ mosaic_dialog ()
/* the vertical box and its toggle buttons */
frame = gtk_frame_new ("Options");
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
toggle_vbox = gtk_vbox_new (FALSE, 5);
gtk_container_border_width (GTK_CONTAINER (toggle_vbox), 5);
gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, FALSE, 0);
toggle_vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (toggle_vbox), 2);
gtk_container_add (GTK_CONTAINER (frame), toggle_vbox);
toggle = gtk_check_button_new_with_label ( _("Antialiasing"));
toggle = gtk_check_button_new_with_label (_("Antialiasing"));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) mosaic_toggle_update,
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&mvals.antialiasing);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), mvals.antialiasing);
gtk_widget_show (toggle);
@ -638,25 +611,28 @@ mosaic_dialog ()
toggle = gtk_check_button_new_with_label ( _("Color Averaging"));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) mosaic_toggle_update,
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&mvals.color_averaging);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), mvals.color_averaging);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
mvals.color_averaging);
gtk_widget_show (toggle);
toggle = gtk_check_button_new_with_label ( _("Pitted Surfaces"));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) mosaic_toggle_update,
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&mvals.tile_surface);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), (mvals.tile_surface == ROUGH));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
(mvals.tile_surface == ROUGH));
gtk_widget_show (toggle);
toggle = gtk_check_button_new_with_label ( _("FG/BG Lighting"));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) mosaic_toggle_update,
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&mvals.grout_color);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), (mvals.grout_color == FG_BG));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
(mvals.grout_color == FG_BG));
gtk_widget_show (toggle);
gtk_widget_show (toggle_vbox);
@ -664,163 +640,103 @@ mosaic_dialog ()
gtk_widget_show (hbox);
/* tiling primitive */
frame = gtk_frame_new ( _("Tiling Primitives"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
toggle_vbox = gtk_vbox_new (FALSE, 5);
gtk_container_border_width (GTK_CONTAINER (toggle_vbox), 5);
gtk_container_add (GTK_CONTAINER (frame), toggle_vbox);
frame = gimp_radio_group_new2 (TRUE, _("Tiling Primitives"),
gimp_radio_button_update,
&mvals.tile_type, (gpointer) mvals.tile_type,
toggle = gtk_radio_button_new_with_label (group, _("Squares"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) mosaic_toggle_update,
&use_squares);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), use_squares);
gtk_widget_show (toggle);
_("Squares"),
(gpointer) SQUARES, NULL,
_("Hexagons"),
(gpointer) HEXAGONS, NULL,
_("Octagons & Squares"),
(gpointer) OCTAGONS, NULL,
toggle = gtk_radio_button_new_with_label (group, _("Hexagons"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) mosaic_toggle_update,
&use_hexagons);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), use_hexagons);
gtk_widget_show (toggle);
toggle = gtk_radio_button_new_with_label (group, _("Octagons & Squares"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) mosaic_toggle_update,
&use_octagons);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), use_octagons);
gtk_widget_show (toggle);
gtk_widget_show (toggle_vbox);
NULL);
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
gtk_widget_show (vbox);
/* parameter settings */
frame = gtk_frame_new ( _("Parameter Settings"));
frame = gtk_frame_new (_("Parameter Settings"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_box_pack_start (GTK_BOX (main_hbox), frame, TRUE, TRUE, 0);
table = gtk_table_new (6, 2, FALSE);
gtk_container_border_width (GTK_CONTAINER (table), 5);
table = gtk_table_new (6, 3, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_container_set_border_width (GTK_CONTAINER (table), 4);
gtk_container_add (GTK_CONTAINER (frame), table);
label = gtk_label_new ( _("Tile Size"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_FILL, 0, 5, 0);
scale_data = gtk_adjustment_new (mvals.tile_size, 5.0, 100.0, 1.0, 1.0, 0.0);
scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data));
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_table_attach (GTK_TABLE (table), scale, 1, 2, 0, 1, GTK_FILL, 0, 0, 0);
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
scale_data = gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
_("Tile Size:"), SCALE_WIDTH, 0,
mvals.tile_size, 5.0, 100.0, 1.0, 10.0, 1,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT (scale_data), "value_changed",
(GtkSignalFunc) mosaic_scale_update,
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&mvals.tile_size);
gtk_widget_show (label);
gtk_widget_show (scale);
label = gtk_label_new ( _("Tile Height"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_FILL, 0, 5, 0);
scale_data = gtk_adjustment_new (mvals.tile_height, 1.0, 50.0, 1.0, 1.0, 0.0);
scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data));
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_table_attach (GTK_TABLE (table), scale, 1, 2, 1, 2, GTK_FILL, 0, 0, 0);
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
scale_data = gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
_("Tile Height:"), SCALE_WIDTH, 0,
mvals.tile_height, 1.0, 50.0, 1.0, 10.0, 1,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT (scale_data), "value_changed",
(GtkSignalFunc) mosaic_scale_update,
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&mvals.tile_height);
gtk_widget_show (label);
gtk_widget_show (scale);
label = gtk_label_new ( _("Tile Spacing"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, GTK_FILL, 0, 5, 0);
scale_data = gtk_adjustment_new (mvals.tile_spacing, 1.0, 50.0, 1.0, 1.0, 0.0);
scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data));
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_table_attach (GTK_TABLE (table), scale, 1, 2, 2, 3, GTK_FILL, 0, 0, 0);
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
scale_data = gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
_("Tile Spacing:"), SCALE_WIDTH, 0,
mvals.tile_spacing, 1.0, 50.0, 1.0, 10.0, 1,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT (scale_data), "value_changed",
(GtkSignalFunc) mosaic_scale_update,
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&mvals.tile_spacing);
gtk_widget_show (label);
gtk_widget_show (scale);
label = gtk_label_new ( _("Tile Neatness"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 3, 4, GTK_FILL, 0, 5, 0);
scale_data = gtk_adjustment_new (mvals.tile_neatness, 0.0, 1.0, 0.01, 0.01, 0.0);
scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data));
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_table_attach (GTK_TABLE (table), scale, 1, 2, 3, 4, GTK_FILL, 0, 0, 0);
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
gtk_scale_set_digits (GTK_SCALE (scale), 2);
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
scale_data = gimp_scale_entry_new (GTK_TABLE (table), 0, 3,
_("Tile Neatness:"), SCALE_WIDTH, 0,
mvals.tile_neatness,
0.0, 1.0, 0.10, 0.1, 2,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT (scale_data), "value_changed",
(GtkSignalFunc) mosaic_scale_update,
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&mvals.tile_neatness);
gtk_widget_show (label);
gtk_widget_show (scale);
label = gtk_label_new ( _("Light Direction"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 4, 5, GTK_FILL, 0, 5, 0);
scale_data = gtk_adjustment_new (mvals.light_dir, 0.0, 360.0, 5.0, 5.0, 0.0);
scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data));
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_table_attach (GTK_TABLE (table), scale, 1, 2, 4, 5, GTK_FILL, 0, 0, 0);
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
scale_data = gimp_scale_entry_new (GTK_TABLE (table), 0, 4,
_("Light Direction:"), SCALE_WIDTH, 0,
mvals.light_dir, 0.0, 360.0, 1.0, 15.0, 1,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT (scale_data), "value_changed",
(GtkSignalFunc) mosaic_scale_update,
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&mvals.light_dir);
gtk_widget_show (label);
gtk_widget_show (scale);
label = gtk_label_new ( _("Color Variation"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 5, 6, GTK_FILL, 0, 5, 0);
scale_data = gtk_adjustment_new (mvals.color_variation, 0.0, 1.0, 0.01, 0.01, 0.0);
scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data));
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_table_attach (GTK_TABLE (table), scale, 1, 2, 5, 6, GTK_FILL, 0, 0, 0);
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
gtk_scale_set_digits (GTK_SCALE (scale), 2);
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
scale_data = gimp_scale_entry_new (GTK_TABLE (table), 0, 5,
_("Color Variation:"), SCALE_WIDTH, 0,
mvals.color_variation,
0.0, 1.0, 0.01, 0.1, 2,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT (scale_data), "value_changed",
(GtkSignalFunc) mosaic_scale_update,
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&mvals.color_variation);
gtk_widget_show (label);
gtk_widget_show (scale);
gtk_widget_show (frame);
gtk_widget_show (table);
gtk_widget_show (main_hbox);
gtk_widget_show (dlg);
gtk_main ();
gdk_flush ();
/* determine tile type */
if (use_squares)
mvals.tile_type = SQUARES;
else if (use_hexagons)
mvals.tile_type = HEXAGONS;
else if (use_octagons)
mvals.tile_type = OCTAGONS;
return mint.run;
}
static void
mosaic_ok_callback (GtkWidget *widget,
gpointer data)
{
mint.run = TRUE;
gtk_widget_destroy (GTK_WIDGET (data));
}
/*
* Gradient finding machinery
@ -1284,7 +1200,7 @@ fp_rand (gdouble val)
{
gdouble rand_val;
rand_val = (gdouble) rand () / (gdouble) (RAND_MAX - 1);
rand_val = (gdouble) rand () / (gdouble) (G_MAXRAND - 1);
return rand_val * val;
}
@ -2500,7 +2416,7 @@ calc_spec_contrib (SpecVec *vecs,
if (mvals.tile_surface == ROUGH)
{
/* If the surface is rough, randomly perturb the distance */
dist -= dist * ((gdouble) rand () / (gdouble) RAND_MAX);
dist -= dist * ((gdouble) rand () / (gdouble) G_MAXRAND);
}
/* If the distance to an edge is less than the tile_spacing, there
@ -2656,42 +2572,3 @@ polygon_reset (Polygon *poly)
{
poly->npts = 0;
}
/* Mosaic interface functions */
static void
mosaic_close_callback (GtkWidget *widget,
gpointer data)
{
gtk_main_quit ();
}
static void
mosaic_ok_callback (GtkWidget *widget,
gpointer data)
{
mint.run = TRUE;
gtk_widget_destroy (GTK_WIDGET (data));
}
static void
mosaic_toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}
static void
mosaic_scale_update (GtkAdjustment *adjustment,
double *scale_val)
{
*scale_val = adjustment->value;
}

View file

@ -83,27 +83,27 @@
static void query (void);
static void run (char *name,
int nparams,
static void run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals);
static gint32 load_image (char *filename);
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN ()
static void
query ()
query (void)
{
static GParamDef load_args[] =
{
@ -115,8 +115,9 @@ query ()
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
INIT_I18N();
@ -131,52 +132,59 @@ query ()
PROC_PLUG_IN,
nload_args, nload_return_vals,
load_args, load_return_vals);
gimp_register_load_handler ("file_mpeg_load", "mpg,mpeg", "");
gimp_register_load_handler ("file_mpeg_load",
"mpg,mpeg",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
run_mode = param[0].data.d_int32;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
INIT_I18N();
if (strcmp (name, "file_mpeg_load") == 0)
{
image_ID = load_image (param[1].data.d_string);
if (image_ID != -1)
{
*nreturn_vals = 2;
values[0].data.d_status = STATUS_SUCCESS;
values[1].type = PARAM_IMAGE;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = STATUS_EXECUTION_ERROR;
}
}
else
g_assert (FALSE);
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
static gint
MPEG_frame_period_ms(gint mpeg_rate_code)
MPEG_frame_period_ms (gint mpeg_rate_code)
{
switch(mpeg_rate_code)
{
@ -197,7 +205,7 @@ MPEG_frame_period_ms(gint mpeg_rate_code)
static gint32
load_image (char *filename)
load_image (gchar *filename)
{
GPixelRgn pixel_rgn;
GDrawable *drawable;
@ -215,12 +223,9 @@ load_image (char *filename)
gchar *layername; /* FIXME? */
temp = g_malloc (strlen (filename) + 16);
if (!temp) gimp_quit ();
g_free (temp);
gimp_progress_init ( _("Loading MPEG movie..."));
@ -262,15 +267,12 @@ load_image (char *filename)
exit(3);
}
wwidth = img.Width;
wheight = img.Height;
image_ID = gimp_image_new (wwidth, wheight, RGB);
gimp_image_set_filename (image_ID, filename);
moreframes = TRUE;
framenumber = 1;
while (moreframes)
@ -324,7 +326,6 @@ load_image (char *filename)
data[i*4+3] = 255;
}
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0,
drawable->width, drawable->height, TRUE, FALSE);
gimp_pixel_rgn_set_rect (&pixel_rgn, data, 0, 0,
@ -344,5 +345,4 @@ load_image (char *filename)
g_free (data);
return image_ID;
}

View file

@ -44,10 +44,6 @@
#include "libgimp/stdplugins-intl.h"
#include <plug-ins/megawidget/megawidget.h>
static mw_preview_t nlfilt_do_preview;
struct Grgb
{
guint8 red;
@ -79,10 +75,27 @@ typedef enum
filter_edge_enhance
} FilterType;
/* other structure declarations */
/* preview stuff -- to be removed as soon as we have a real libgimp preview */
struct mwPreview
{
gint width;
gint height;
gint bpp;
gdouble scale;
guchar *bits;
};
#define PREVIEW_SIZE 100
static gint do_preview = TRUE;
static struct mwPreview *thePreview;
static GtkWidget * mw_preview_new (GtkWidget *parent,
struct mwPreview *mwp);
static struct mwPreview * mw_preview_build (GDrawable *drw);
/* function protos */
static void query (void);
@ -92,8 +105,10 @@ static void run (gchar *name,
gint *nretvals,
GParam **retvals);
static gint pluginCore (struct piArgs *argp);
static gint pluginCoreIA (struct piArgs *argp);
static gint pluginCore (struct piArgs *argp);
static gint pluginCoreIA (struct piArgs *argp);
static void nlfilt_do_preview (GtkWidget *preview);
static inline gint nlfiltInit (gdouble alpha,
gdouble radius,
@ -106,10 +121,10 @@ static inline void nlfiltRow (guchar *src,
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init */
NULL, /* quit */
query, /* query */
run, /* run */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN ()
@ -362,7 +377,7 @@ pluginCoreIA (struct piArgs *argp)
gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
preview = mw_preview_new (hbox, thePreview, &nlfilt_do_preview);
preview = mw_preview_new (hbox, thePreview);
gtk_object_set_data (GTK_OBJECT (preview), "piArgs", argp);
nlfilt_do_preview (preview);
@ -409,9 +424,9 @@ pluginCoreIA (struct piArgs *argp)
GTK_SIGNAL_FUNC (nlfilt_double_adjustment_update),
&argp->radius);
gtk_widget_show(table);
gtk_widget_show (table);
gtk_widget_show(dlg);
gtk_widget_show (dlg);
gtk_main ();
gdk_flush ();
@ -479,6 +494,124 @@ nlfilt_do_preview (GtkWidget *w)
g_free (dst);
}
static void
mw_preview_toggle_callback (GtkWidget *widget,
gpointer data)
{
gimp_toggle_button_update (widget, data);
if (do_preview)
nlfilt_do_preview (NULL);
}
static struct mwPreview *
mw_preview_build_virgin (GDrawable *drw)
{
struct mwPreview *mwp;
mwp = g_new (struct mwPreview, 1);
if (drw->width > drw->height)
{
mwp->scale = (gdouble) drw->width / (gdouble) PREVIEW_SIZE;
mwp->width = PREVIEW_SIZE;
mwp->height = drw->height / mwp->scale;
}
else
{
mwp->scale = (gdouble) drw->height / (gdouble) PREVIEW_SIZE;
mwp->height = PREVIEW_SIZE;
mwp->width = drw->width / mwp->scale;
}
mwp->bpp = 3;
mwp->bits = NULL;
return mwp;
}
static struct mwPreview *
mw_preview_build (GDrawable *drw)
{
struct mwPreview *mwp;
gint x, y, b;
guchar *bc;
guchar *drwBits;
GPixelRgn pr;
mwp = mw_preview_build_virgin (drw);
gimp_pixel_rgn_init (&pr, drw, 0, 0, drw->width, drw->height, FALSE, FALSE);
drwBits = g_new (guchar, drw->width * drw->bpp);
bc = mwp->bits = g_new (guchar, mwp->width * mwp->height * mwp->bpp);
for (y = 0; y < mwp->height; y++)
{
gimp_pixel_rgn_get_row (&pr, drwBits, 0, (int)(y*mwp->scale), drw->width);
for (x = 0; x < mwp->width; x++)
{
for (b = 0; b < mwp->bpp; b++)
*bc++ = *(drwBits +
((gint) (x * mwp->scale) * drw->bpp) + b % drw->bpp);
}
}
g_free (drwBits);
return mwp;
}
static GtkWidget *
mw_preview_new (GtkWidget *parent,
struct mwPreview *mwp)
{
GtkWidget *preview;
GtkWidget *frame;
GtkWidget *pframe;
GtkWidget *vbox;
GtkWidget *button;
guchar *color_cube;
gtk_preview_set_gamma (gimp_gamma ());
gtk_preview_set_install_cmap (gimp_install_cmap ());
color_cube = gimp_color_cube ();
gtk_preview_set_color_cube (color_cube[0], color_cube[1],
color_cube[2], color_cube[3]);
gtk_widget_set_default_visual (gtk_preview_get_visual ());
gtk_widget_set_default_colormap (gtk_preview_get_cmap ());
frame = gtk_frame_new (_("Preview"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_box_pack_start (GTK_BOX (parent), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
vbox = gtk_vbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
gtk_widget_show (vbox);
pframe = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME(pframe), GTK_SHADOW_IN);
gtk_box_pack_start (GTK_BOX (vbox), pframe, FALSE, FALSE, 0);
gtk_widget_show (pframe);
preview = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_size (GTK_PREVIEW (preview), mwp->width, mwp->height);
gtk_container_add (GTK_CONTAINER (pframe), preview);
gtk_widget_show (preview);
button = gtk_check_button_new_with_label (_("Do Preview"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), do_preview);
gtk_signal_connect (GTK_OBJECT (button), "toggled",
GTK_SIGNAL_FUNC (mw_preview_toggle_callback),
&do_preview);
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
gtk_widget_show (button);
return preview;
}
/* pnmnlfilt.c - 4 in 1 (2 non-linear) filter
** - smooth an anyimage
** - do alpha trimmed mean filtering on an anyimage

View file

@ -77,10 +77,6 @@ static char rcsid[] = "$Id$";
/* Some useful macros */
#ifndef RAND_MAX
#define RAND_MAX 2147483647
#endif /* RAND_MAX */
#if 0
#define DEBUG1 printf
#else
@ -881,14 +877,16 @@ nova_center_preview_events (GtkWidget *widget,
################################################################
*/
static double
static gdouble
gauss (void)
{
double sum=0;
int i;
for(i=0; i<6; i++)
sum+=(double)rand()/RAND_MAX;
return sum/6;
gdouble sum = 0;
gint i;
for (i = 0; i < 6; i++)
sum += (gdouble) rand () / G_MAXRAND;
return sum / 6;
}
static void
@ -934,7 +932,7 @@ nova (GDrawable *drawable)
{
spoke[i] = gauss();
h += ((gdouble) pvals.randomhue / 360.0 *
((gdouble) rand() / (gdouble) RAND_MAX - 0.5));
((gdouble) rand() / (gdouble) G_MAXRAND - 0.5));
if (h < 0)
h += 1.0;
else if (h >= 1.0)

File diff suppressed because it is too large Load diff

View file

@ -20,8 +20,10 @@
#include <math.h>
#include <gtk/gtk.h>
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include "libgimp/stdplugins-intl.h"
#ifdef G_OS_WIN32
@ -42,28 +44,30 @@ gboolean run_flag = FALSE;
/* Declare some local functions.
*/
static void query (void);
static void run (char *name,
int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals);
static gint32 load_image (gchar *filename);
static gint save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID);
static void query (void);
static void run (gchar *name,
gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals);
static gint32 load_image (gchar *filename);
static gint save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID);
static void init_gtk (void);
static gint save_dialog (void);
static void ok_callback (GtkWidget * widget, gpointer data);
static void entry_callback (GtkWidget * widget, gpointer data);
static void ok_callback (GtkWidget *widget,
gpointer data);
static void entry_callback (GtkWidget *widget,
gpointer data);
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
@ -82,8 +86,9 @@ query (void)
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
@ -94,7 +99,7 @@ query (void)
{ PARAM_STRING, "raw_filename", "The name of the file to save the image in" },
{ PARAM_STRING, "description", "Short description of the pattern" },
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -122,47 +127,51 @@ query (void)
nsave_args, 0,
save_args, NULL);
gimp_register_magic_load_handler ("file_pat_load", "pat", "", "20,string,GPAT");
gimp_register_save_handler ("file_pat_save", "pat", "");
gimp_register_magic_load_handler ("file_pat_load",
"pat",
"",
"20,string,GPAT");
gimp_register_save_handler ("file_pat_save",
"pat",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
gint32 image_ID;
gint32 drawable_ID;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
GimpExportReturnType export = EXPORT_CANCEL;
GStatusType status = STATUS_SUCCESS;
run_mode = param[0].data.d_int32;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = -1;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_pat_load") == 0)
{
INIT_I18N();
image_ID = load_image (param[1].data.d_string);
if (image_ID != -1)
{
values[0].data.d_status = STATUS_SUCCESS;
*nreturn_vals = 2;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = STATUS_EXECUTION_ERROR;
}
*nreturn_vals = 2;
}
else if (strcmp (name, "file_pat_save") == 0)
{
@ -174,18 +183,20 @@ run (char *name,
{
case RUN_INTERACTIVE:
case RUN_WITH_LAST_VALS:
INIT_I18N_UI();
INIT_I18N_UI();
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "PAT",
(CAN_HANDLE_RGB | CAN_HANDLE_GRAY | CAN_HANDLE_ALPHA));
(CAN_HANDLE_RGB |
CAN_HANDLE_GRAY |
CAN_HANDLE_ALPHA));
if (export == EXPORT_CANCEL)
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
default:
INIT_I18N();
INIT_I18N();
break;
}
@ -193,33 +204,48 @@ run (char *name,
{
case RUN_INTERACTIVE:
/* Possibly retrieve data */
gimp_get_data("file_pat_save", description);
if (!save_dialog())
return;
gimp_get_data ("file_pat_save", description);
if (!save_dialog ())
status = STATUS_CANCEL;
break;
case RUN_NONINTERACTIVE:
if (nparams != 6)
status = STATUS_CALLING_ERROR;
{
status = STATUS_CALLING_ERROR;
}
else
strcpy(description, param[5].data.d_string);
{
strcpy (description, param[5].data.d_string);
}
break;
case RUN_WITH_LAST_VALS:
gimp_get_data ("file_pat_save", description);
break;
}
if (save_image (param[3].data.d_string, image_ID, drawable_ID))
if (status == STATUS_SUCCESS)
{
gimp_set_data ("file_pat_save", description, 256);
values[0].data.d_status = STATUS_SUCCESS;
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
*nreturn_vals = 1;
if (save_image (param[3].data.d_string, image_ID, drawable_ID))
{
gimp_set_data ("file_pat_save", description, 256);
}
else
{
status = STATUS_EXECUTION_ERROR;
}
}
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
else
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
static gint32
@ -391,9 +417,8 @@ static gint
save_dialog (void)
{
GtkWidget *dlg;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *table;
GtkWidget *entry;
dlg = gimp_dialog_new (_("Save as Pattern"), "pat",
gimp_plugin_help_func, "filters/pat.html",
@ -413,30 +438,18 @@ save_dialog (void)
/* The main table */
table = gtk_table_new (1, 2, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_container_border_width (GTK_CONTAINER (table), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), table, TRUE, TRUE, 0);
gtk_widget_show (table);
gtk_table_set_row_spacings (GTK_TABLE (table), 4);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
/**********************
* label
**********************/
label = gtk_label_new (_("Description:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label);
/************************
* The entry
************************/
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_widget_set_usize (entry, 200, 0);
gtk_entry_set_text (GTK_ENTRY (entry), description);
gimp_table_attach_aligned (GTK_TABLE (table), 0,
_("Description:"), 1.0, 0.5,
entry, FALSE);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
GTK_SIGNAL_FUNC (entry_callback),
description);

View file

@ -14,22 +14,26 @@
/* Please contact me if you can't use your PCXs with this tool, I want
The GIMP to have the best file filters on the planet */
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "config.h"
#include "gtk/gtk.h"
#include "libgimp/gimp.h"
#include "libgimp/gimpui.h"
#include <gtk/gtk.h>
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include "libgimp/stdplugins-intl.h"
/* Declare plug-in functions. */
static void query (void);
static void run (char *name,
int nparams,
static void run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals);
#if defined(_BIG_ENDIAN) || defined(sparc) || defined (__sgi)
@ -48,11 +52,19 @@ static void run (char *name,
#define htoql(x) qtohl(x)
#define htoqs(x) qtohs(x)
GPlugInInfo PLUG_IN_INFO = { NULL, NULL, query, run, };
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN ()
static void query () {
static void
query (void)
{
static GParamDef load_args[] =
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
@ -63,8 +75,9 @@ static void query () {
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
@ -74,7 +87,7 @@ static void query () {
{ PARAM_STRING, "filename", "The name of the file to save the image in" },
{ PARAM_STRING, "raw_filename", "The name entered" },
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -102,62 +115,97 @@ static void query () {
nsave_args, 0,
save_args, NULL);
gimp_register_magic_load_handler ("file_pcx_load", "pcx,pcc", "",
"0&,byte,10,2&,byte,1,3&,byte,>0,3,byte,<9");
gimp_register_save_handler ("file_pcx_save", "pcx,pcc", "");
gimp_register_magic_load_handler ("file_pcx_load",
"pcx,pcc",
"",
"0&,byte,10,2&,byte,1,3&,byte,>0,3,byte,<9");
gimp_register_save_handler ("file_pcx_save",
"pcx,pcc",
"");
}
/* Declare internal functions. */
static void init_gtk (void);
static gint32 load_image (char *filename);
static void load_1 (FILE *fp, int width, int height, char *buffer, int bytes);
static void load_4 (FILE *fp, int width, int height, char *buffer, int bytes);
static void load_8 (FILE *fp, int width, int height, char *buffer, int bytes);
static void load_24 (FILE *fp, int width, int height, char *buffer, int bytes);
static void readline (FILE *fp, guchar* buffer, int bytes);
static gint32 load_image (gchar *filename);
static void load_1 (FILE *fp,
gint width,
gint height,
gchar *buffer,
gint bytes);
static void load_4 (FILE *fp,
gint width,
gint height,
gchar *buffer,
gint bytes);
static void load_8 (FILE *fp,
gint width,
gint height,
gchar *buffer,
gint bytes);
static void load_24 (FILE *fp,
gint width,
gint height,
gchar *buffer,
gint bytes);
static void readline (FILE *fp,
guchar *buffer,
gint bytes);
static gint save_image (char *filename, gint32 image, gint32 layer);
static void save_8 (FILE *fp, int width, int height, guchar *buffer);
static void save_24 (FILE *fp, int width, int height, guchar *buffer);
static void writeline (FILE *fp, guchar *buffer, int bytes);
static gint save_image (gchar *filename,
gint32 image,
gint32 layer);
static void save_8 (FILE *fp,
gint width,
gint height,
guchar *buffer);
static void save_24 (FILE *fp,
gint width,
gint height,
guchar *buffer);
static void writeline (FILE *fp,
guchar *buffer,
gint bytes);
/* Plug-in implementation */
static void
run (char *name,
int nparams,
static void
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GStatusType status = STATUS_SUCCESS;
GRunModeType run_mode;
gint32 image_ID;
gint32 drawable_ID;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
GimpExportReturnType export = EXPORT_CANCEL;
run_mode = param[0].data.d_int32;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_pcx_load") == 0) {
if (strcmp (name, "file_pcx_load") == 0)
{
INIT_I18N();
image_ID = load_image (param[1].data.d_string);
if (image_ID != -1) {
*nreturn_vals = 2;
values[0].data.d_status = STATUS_SUCCESS;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
} else {
values[0].data.d_status = STATUS_EXECUTION_ERROR;
}
if (image_ID != -1)
{
*nreturn_vals = 2;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
{
status = STATUS_EXECUTION_ERROR;
}
}
else if (strcmp (name, "file_pcx_save") == 0)
{
@ -169,18 +217,20 @@ run (char *name,
{
case RUN_INTERACTIVE:
case RUN_WITH_LAST_VALS:
INIT_I18N_UI();
INIT_I18N_UI();
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "PCX",
(CAN_HANDLE_RGB | CAN_HANDLE_GRAY | CAN_HANDLE_INDEXED));
(CAN_HANDLE_RGB |
CAN_HANDLE_GRAY |
CAN_HANDLE_INDEXED));
if (export == EXPORT_CANCEL)
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
default:
INIT_I18N();
INIT_I18N();
break;
}
@ -201,56 +251,61 @@ run (char *name,
break;
}
*nreturn_vals = 1;
if (save_image (param[3].data.d_string, image_ID, drawable_ID))
if (status == STATUS_SUCCESS)
{
values[0].data.d_status = STATUS_SUCCESS;
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (! save_image (param[3].data.d_string, image_ID, drawable_ID))
{
status = STATUS_EXECUTION_ERROR;
}
}
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
else
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
static void
init_gtk ()
static void
init_gtk (void)
{
gchar **argv;
gint argc;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("pcx");
gtk_init (&argc, &argv);
gtk_rc_parse (gimp_gtkrc ());
}
guchar mono[6]= {0, 0, 0, 255, 255, 255};
guchar mono[6]= { 0, 0, 0, 255, 255, 255 };
static struct {
guint8 manufacturer;
guint8 version;
guint8 compression;
guint8 bpp;
gint16 x1, y1;
gint16 x2, y2;
gint16 hdpi;
gint16 vdpi;
guint8 colormap[48];
guint8 reserved;
guint8 planes;
gint16 bytesperline;
gint16 color;
guint8 filler[58];
static struct
{
guint8 manufacturer;
guint8 version;
guint8 compression;
guint8 bpp;
gint16 x1, y1;
gint16 x2, y2;
gint16 hdpi;
gint16 vdpi;
guint8 colormap[48];
guint8 reserved;
guint8 planes;
gint16 bytesperline;
gint16 color;
guint8 filler[58];
} pcx_header;
static gint32
load_image (char *filename)
static gint32
load_image (gchar *filename)
{
FILE *fd;
GDrawable *drawable;
@ -260,66 +315,81 @@ load_image (char *filename)
gint32 image, layer;
guchar *dest, cmap[768];
message = g_strdup_printf( _("Loading %s:"), filename);
message = g_strdup_printf (_("Loading %s:"), filename);
gimp_progress_init (message);
g_free (message);
fd = fopen (filename, "rb");
if (!fd) {
g_message("PCX Can't open\n%s", filename);
return -1;
}
if (!fd)
{
g_message ("PCX: Can't open\n%s", filename);
return -1;
}
if (fread(&pcx_header, 128, 1, fd) == 0) {
g_message("PCX Can't read header from\n%s", filename);
return -1;
}
if (fread (&pcx_header, 128, 1, fd) == 0)
{
g_message ("PCX: Can't read header from\n%s", filename);
return -1;
}
if(pcx_header.manufacturer != 10) {
g_message("%s\nis not a PCX file", filename);
return -1;
}
if (pcx_header.manufacturer != 10)
{
g_message ("%s\nis not a PCX file", filename);
return -1;
}
offset_x = qtohs (pcx_header.x1);
offset_y = qtohs (pcx_header.y1);
width = qtohs (pcx_header.x2) - offset_x + 1;
height = qtohs (pcx_header.y2) - offset_y + 1;
if (pcx_header.planes == 3 && pcx_header.bpp == 8) {
image= gimp_image_new (width, height, RGB);
layer= gimp_layer_new (image, _("Background"), width, height,
RGB_IMAGE, 100, NORMAL_MODE);
} else {
image= gimp_image_new (width, height, INDEXED);
layer= gimp_layer_new (image, _("Background"), width, height,
INDEXED_IMAGE, 100, NORMAL_MODE);
}
if (pcx_header.planes == 3 && pcx_header.bpp == 8)
{
image= gimp_image_new (width, height, RGB);
layer= gimp_layer_new (image, _("Background"), width, height,
RGB_IMAGE, 100, NORMAL_MODE);
}
else
{
image= gimp_image_new (width, height, INDEXED);
layer= gimp_layer_new (image, _("Background"), width, height,
INDEXED_IMAGE, 100, NORMAL_MODE);
}
gimp_image_set_filename (image, filename);
gimp_image_add_layer (image, layer, 0);
gimp_layer_set_offsets (layer, offset_x, offset_y);
drawable = gimp_drawable_get (layer);
if (pcx_header.planes == 1 && pcx_header.bpp == 1) {
dest = (guchar *) g_malloc (width * height);
load_1(fd, width, height, dest, qtohs (pcx_header.bytesperline));
gimp_image_set_cmap (image, mono, 2);
} else if (pcx_header.planes == 4 && pcx_header.bpp == 1) {
dest = (guchar *) g_malloc (width * height);
load_4(fd, width, height, dest, qtohs (pcx_header.bytesperline));
gimp_image_set_cmap (image, pcx_header.colormap, 16);
} else if (pcx_header.planes == 1 && pcx_header.bpp == 8) {
dest = (guchar *) g_malloc (width * height);
load_8(fd, width, height, dest, qtohs (pcx_header.bytesperline));
fseek(fd, -768L, SEEK_END);
fread(cmap, 768, 1, fd);
gimp_image_set_cmap (image, cmap, 256);
} else if (pcx_header.planes == 3 && pcx_header.bpp == 8) {
dest = (guchar *) g_malloc (width * height * 3);
load_24(fd, width, height, dest, qtohs (pcx_header.bytesperline));
} else {
g_message("Unusual PCX flavour, giving up");
return -1;
}
if (pcx_header.planes == 1 && pcx_header.bpp == 1)
{
dest = (guchar *) g_malloc (width * height);
load_1 (fd, width, height, dest, qtohs (pcx_header.bytesperline));
gimp_image_set_cmap (image, mono, 2);
}
else if (pcx_header.planes == 4 && pcx_header.bpp == 1)
{
dest = (guchar *) g_malloc (width * height);
load_4(fd, width, height, dest, qtohs (pcx_header.bytesperline));
gimp_image_set_cmap (image, pcx_header.colormap, 16);
}
else if (pcx_header.planes == 1 && pcx_header.bpp == 8)
{
dest = (guchar *) g_malloc (width * height);
load_8(fd, width, height, dest, qtohs (pcx_header.bytesperline));
fseek(fd, -768L, SEEK_END);
fread(cmap, 768, 1, fd);
gimp_image_set_cmap (image, cmap, 256);
}
else if (pcx_header.planes == 3 && pcx_header.bpp == 8)
{
dest = (guchar *) g_malloc (width * height * 3);
load_24(fd, width, height, dest, qtohs (pcx_header.bytesperline));
}
else
{
g_message ("Unusual PCX flavour, giving up");
return -1;
}
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0, width, height, TRUE, FALSE);
gimp_pixel_rgn_set_rect (&pixel_rgn, dest, 0, 0, width, height);
@ -332,116 +402,116 @@ load_image (char *filename)
return image;
}
static void
load_8 (FILE *fp,
int width,
int height,
char *buffer,
int bytes)
static void
load_8 (FILE *fp,
gint width,
gint height,
gchar *buffer,
gint bytes)
{
int row;
guchar *line;
line= (guchar *) g_malloc(bytes);
line = (guchar *) g_malloc (bytes);
for (row= 0; row < height; buffer+= width, ++row)
for (row = 0; row < height; buffer += width, ++row)
{
readline(fp, line, bytes);
memcpy(buffer, line, width);
readline (fp, line, bytes);
memcpy (buffer, line, width);
gimp_progress_update ((double) row / (double) height);
}
g_free(line);
g_free (line);
}
static void
load_24 (FILE *fp,
int width,
int height,
char *buffer,
int bytes)
static void
load_24 (FILE *fp,
gint width,
gint height,
gchar *buffer,
gint bytes)
{
int x, y, c;
guchar *line;
line= (guchar *) g_malloc(bytes * 3);
line = (guchar *) g_malloc (bytes * 3);
for (y= 0; y < height; buffer+= width * 3, ++y)
for (y = 0; y < height; buffer += width * 3, ++y)
{
for (c= 0; c < 3; ++c)
for (c = 0; c < 3; ++c)
{
readline(fp, line, bytes);
for (x= 0; x < width; ++x)
readline (fp, line, bytes);
for (x = 0; x < width; ++x)
{
buffer[x * 3 + c]= line[x];
buffer[x * 3 + c] = line[x];
}
}
gimp_progress_update ((double) y / (double) height);
}
g_free(line);
g_free (line);
}
static void
load_1 (FILE *fp,
int width,
int height,
char *buffer,
int bytes)
static void
load_1 (FILE *fp,
gint width,
gint height,
gchar *buffer,
gint bytes)
{
int x, y;
guchar *line;
line= (guchar *) g_malloc(bytes);
line = (guchar *) g_malloc (bytes);
for (y= 0; y < height; buffer+= width, ++y)
for (y = 0; y < height; buffer += width, ++y)
{
readline(fp, line, bytes);
for (x= 0; x < width; ++x)
readline (fp, line, bytes);
for (x = 0; x < width; ++x)
{
if (line[x / 8] & (128 >> (x % 8)))
buffer[x]= 1;
buffer[x] = 1;
else
buffer[x]= 0;
buffer[x] = 0;
}
gimp_progress_update ((double) y / (double) height);
}
g_free(line);
g_free (line);
}
static void
load_4 (FILE *fp,
int width,
int height,
char *buffer,
int bytes)
static void
load_4 (FILE *fp,
gint width,
gint height,
gchar *buffer,
gint bytes)
{
int x, y, c;
guchar *line;
line= (guchar *) g_malloc(bytes);
line= (guchar *) g_malloc (bytes);
for (y= 0; y < height; buffer+= width, ++y)
for (y = 0; y < height; buffer += width, ++y)
{
for (x= 0; x < width; ++x) buffer[x]= 0;
for (c= 0; c < 4; ++c)
for (x = 0; x < width; ++x) buffer[x] = 0;
for (c = 0; c < 4; ++c)
{
readline(fp, line, bytes);
for (x= 0; x < width; ++x)
for (x = 0; x < width; ++x)
{
if (line[x / 8] & (128 >> (x % 8)))
buffer[x]+= (1 << c);
buffer[x] += (1 << c);
}
}
gimp_progress_update ((double) y / (double) height);
}
g_free(line);
g_free (line);
}
static void
static void
readline (FILE *fp,
guchar *buffer,
int bytes)
gint bytes)
{
static guchar count= 0, value= 0;
static guchar count = 0, value = 0;
if (pcx_header.compression)
{
@ -449,29 +519,29 @@ readline (FILE *fp,
{
if (count == 0)
{
value= fgetc(fp);
value = fgetc (fp);
if (value < 0xc0)
{
count= 1;
count = 1;
}
else
{
count= value - 0xc0;
value= fgetc(fp);
count = value - 0xc0;
value = fgetc (fp);
}
}
count--;
*(buffer++)= value;
*(buffer++) = value;
}
}
else
{
fread(buffer, bytes, 1, fp);
fread (buffer, bytes, 1, fp);
}
}
static gint
save_image (char *filename,
static gint
save_image (gchar *filename,
gint32 image,
gint32 layer)
{
@ -484,14 +554,14 @@ save_image (char *filename,
gchar *message;
int colors, i;
drawable= gimp_drawable_get(layer);
drawable_type= gimp_drawable_type(layer);
drawable = gimp_drawable_get (layer);
drawable_type = gimp_drawable_type (layer);
gimp_drawable_offsets (layer, &offset_x, &offset_y);
width= drawable->width;
height= drawable->height;
gimp_pixel_rgn_init(&pixel_rgn, drawable, 0, 0, width, height, FALSE, FALSE);
width = drawable->width;
height = drawable->height;
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0, width, height, FALSE, FALSE);
message = g_strdup_printf( _( "Saving %s:"), filename);
message = g_strdup_printf (_("Saving %s:"), filename);
gimp_progress_init (message);
g_free (message);
@ -499,10 +569,10 @@ save_image (char *filename,
pcx_header.version = 5;
pcx_header.compression = 1;
switch(drawable_type)
switch (drawable_type)
{
case INDEXED_IMAGE:
cmap= gimp_image_get_cmap(image, &colors);
cmap = gimp_image_get_cmap (image, &colors);
pcx_header.bpp = 8;
pcx_header.bytesperline = htoqs (width);
pcx_header.planes = 1;
@ -524,19 +594,19 @@ save_image (char *filename,
break;
default:
g_message("PCX Can't save this image type\nFlatten your image");
return -1;
g_message ("PCX Can't save this image type\nFlatten your image");
return FALSE;
break;
}
if ((fp = fopen(filename, "wb")) == NULL)
{
g_message("PCX Can't open \n%s", filename);
return -1;
g_message ("PCX Can't open \n%s", filename);
return FALSE;
}
pixels= (guchar *) g_malloc(width * height * pcx_header.planes);
gimp_pixel_rgn_get_rect(&pixel_rgn, pixels, 0, 0, width, height);
pixels = (guchar *) g_malloc (width * height * pcx_header.planes);
gimp_pixel_rgn_get_rect (&pixel_rgn, pixels, 0, 0, width, height);
pcx_header.x1 = htoqs (offset_x);
pcx_header.y1 = htoqs (offset_y);
@ -547,111 +617,111 @@ save_image (char *filename,
pcx_header.vdpi = htoqs (300);
pcx_header.reserved = 0;
fwrite(&pcx_header, 128, 1, fp);
fwrite (&pcx_header, 128, 1, fp);
switch(drawable_type)
switch (drawable_type)
{
case INDEXED_IMAGE:
save_8(fp, width, height, pixels);
fputc(0x0c, fp);
fwrite(cmap, colors, 3, fp);
for (i= colors; i < 256; i++)
save_8 (fp, width, height, pixels);
fputc (0x0c, fp);
fwrite (cmap, colors, 3, fp);
for (i = colors; i < 256; i++)
{
fputc(0, fp); fputc(0, fp); fputc(0, fp);
fputc (0, fp); fputc (0, fp); fputc (0, fp);
}
break;
case RGB_IMAGE:
save_24(fp, width, height, pixels);
save_24 (fp, width, height, pixels);
break;
case GRAY_IMAGE:
save_8(fp, width, height, pixels);
fputc(0x0c, fp);
for (i= 0; i < 256; i++)
save_8 (fp, width, height, pixels);
fputc (0x0c, fp);
for (i = 0; i < 256; i++)
{
fputc((guchar) i, fp); fputc((guchar) i, fp); fputc((guchar) i, fp);
fputc ((guchar) i, fp); fputc ((guchar) i, fp); fputc ((guchar) i, fp);
}
break;
default:
g_message("Can't save this image as PCX\nFlatten your image");
return -1;
g_message ("Can't save this image as PCX\nFlatten your image");
return FALSE;
break;
}
}
gimp_drawable_detach(drawable);
g_free(pixels);
gimp_drawable_detach (drawable);
g_free (pixels);
fclose(fp);
fclose (fp);
return TRUE;
}
static void
static void
save_8 (FILE *fp,
int width,
int height,
gint width,
gint height,
guchar *buffer)
{
int row;
for (row= 0; row < height; ++row)
for (row = 0; row < height; ++row)
{
writeline(fp, buffer, width);
buffer+= width;
gimp_progress_update((double) row / (double) height);
writeline (fp, buffer, width);
buffer += width;
gimp_progress_update ((double) row / (double) height);
}
}
static void
static void
save_24 (FILE *fp,
int width,
int height,
gint width,
gint height,
guchar *buffer)
{
int x, y, c;
guchar *line;
line= (guchar *) g_malloc(width);
line = (guchar *) g_malloc (width);
for (y= 0; y < height; ++y)
for (y = 0; y < height; ++y)
{
for (c= 0; c < 3; ++c)
for (c = 0; c < 3; ++c)
{
for (x= 0; x < width; ++x)
for (x = 0; x < width; ++x)
{
line[x]= buffer[(3*x) + c];
line[x] = buffer[(3*x) + c];
}
writeline(fp, line, width);
writeline (fp, line, width);
}
buffer+= width * 3;
gimp_progress_update((double) y / (double) height);
buffer += width * 3;
gimp_progress_update ((double) y / (double) height);
}
g_free (line);
}
static void
static void
writeline (FILE *fp,
guchar *buffer,
int bytes)
gint bytes)
{
guchar value, count;
guchar *finish= buffer+ bytes;
guchar *finish = buffer+ bytes;
while (buffer < finish)
{
value= *(buffer++);
count= 1;
value = *(buffer++);
count = 1;
while (buffer < finish && count < 63 && *buffer == value)
{
count++; buffer++;
}
if (value < 0xc0 && count == 1)
{
fputc(value, fp);
}
else
{
fputc(0xc0 + count, fp);
fputc(value, fp);
}
if (value < 0xc0 && count == 1)
{
fputc (value, fp);
}
else
{
fputc (0xc0 + count, fp);
fputc (value, fp);
}
}
}

View file

@ -39,18 +39,22 @@
* NOTE: pix and matte files do not support alpha channels or indexed
* colour, so neither does this plug-in
*/
static char ident[] = "@(#) GIMP Alias|Wavefront pix image file-plugin v1.0 24-jun-97";
#include "config.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "config.h"
#include "gtk/gtk.h"
#include "libgimp/gimp.h"
#include "libgimp/gimpui.h"
#include <gtk/gtk.h>
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include "libgimp/stdplugins-intl.h"
/* #define PIX_DEBUG */
@ -68,16 +72,22 @@ static char ident[] = "@(#) GIMP Alias|Wavefront pix image file-plugin v1.0 24-
/* Standard Plug-in Functions */
static void query (void);
static void run (char *name, int nparams, GParam *param,
int *nreturn_vals, GParam **return_vals );
static void run (gchar *name,
gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals);
/* Local Helper Functions */
static gint32 load_image (char *filename );
static gint save_image (char *filename, gint32 image_ID, gint32 drawable_ID );
static gint32 load_image (gchar *filename);
static gint save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID);
static guint16 get_short (FILE * file );
static void put_short (guint16 value, FILE * file );
static guint16 get_short (FILE *file);
static void put_short (guint16 value,
FILE *file);
static void init_gtk (void);
@ -87,35 +97,34 @@ static void init_gtk (void);
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN ()
static void query ()
/*
* Description:
* Register the services provided by this plug-in
*/
static void
query (void)
{
/*
* Description:
* Register the services provided by this plug-in
*/
static GParamDef load_args[] =
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
{ PARAM_STRING, "filename", "The name of the file to load" },
{ PARAM_STRING, "raw_filename", "The name entered" },
};
static int nload_args =
sizeof (load_args) / sizeof (load_args[0]);
static GParamDef load_return_vals[] =
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_return_vals =
sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
@ -125,7 +134,7 @@ static void query ()
{ PARAM_STRING, "filename", "The name of the file to save the image in" },
{ PARAM_STRING, "raw_filename", "The name of the file to save the image in" }
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -140,7 +149,7 @@ static void query ()
PROC_PLUG_IN,
nload_args, nload_return_vals,
load_args, load_return_vals);
gimp_install_procedure ("file_pix_save",
_("save file in the Alias|Wavefront pix/matte file format"),
_("save file in the Alias|Wavefront pix/matte file format"),
@ -152,255 +161,259 @@ static void query ()
PROC_PLUG_IN,
nsave_args, 0,
save_args, NULL);
gimp_register_load_handler ("file_pix_load", "pix,matte,mask,alpha,als", "");
gimp_register_save_handler ("file_pix_save", "pix,matte,mask,alpha,als", "");
gimp_register_load_handler ("file_pix_load",
"pix,matte,mask,alpha,als",
"");
gimp_register_save_handler ("file_pix_save",
"pix,matte,mask,alpha,als",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals )
/*
* Description:
* perform registered plug-in function
*
* Arguments:
* name - name of the function to perform
* nparams - number of parameters passed to the function
* param - parameters passed to the function
* nreturn_vals - number of parameters returned by the function
* return_vals - parameters returned by the function
*/
gint *nreturn_vals,
GParam **return_vals)
{
/*
* Description:
* perform registered plug-in function
*
* Arguments:
* name - name of the function to perform
* nparams - number of parameters passed to the function
* param - parameters passed to the function
* nreturn_vals - number of parameters returned by the function
* return_vals - parameters returned by the function
*/
static GParam values[2];
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
GimpExportReturnType export = EXPORT_CANCEL;
run_mode = param[0].data.d_int32;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_pix_load") == 0)
{
INIT_I18N();
/* Perform the image load */
image_ID = load_image (param[1].data.d_string);
if (image_ID != -1)
{
/* The image load was successful */
*nreturn_vals = 2;
values[0].data.d_status = STATUS_SUCCESS;
values[1].type = PARAM_IMAGE;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
{
/* The image load falied */
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = STATUS_EXECUTION_ERROR;
}
}
else if (strcmp (name, "file_pix_save") == 0)
{
image_ID = param[1].data.d_int32;
drawable_ID = param[2].data.d_int32;
/* eventually export the image */
switch (run_mode)
{
case RUN_INTERACTIVE:
case RUN_WITH_LAST_VALS:
INIT_I18N_UI();
INIT_I18N_UI();
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "PIX",
(CAN_HANDLE_RGB | CAN_HANDLE_GRAY));
(CAN_HANDLE_RGB |
CAN_HANDLE_GRAY));
if (export == EXPORT_CANCEL)
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
default:
INIT_I18N();
INIT_I18N();
break;
}
if (status == STATUS_SUCCESS)
{
if ( !save_image (param[3].data.d_string, image_ID, drawable_ID))
if (! save_image (param[3].data.d_string, image_ID, drawable_ID))
{
status = STATUS_EXECUTION_ERROR;
}
}
values[0].data.d_status = status;
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
else
{
g_assert (FALSE);
}
else
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
static guint16
static guint16
get_short (FILE *file)
/*
* Description:
* Reads a 16-bit integer from a file in such a way that the machine's
* bit ordering should not matter
*/
{
/*
* Description:
* Reads a 16-bit integer from a file in such a way that the machine's
* bit ordering should not matter
*/
guchar buf[2];
fread (buf, 2, 1, file);
return ( buf[0] << 8 ) + ( buf[1] << 0 );
return (buf[0] << 8) + (buf[1] << 0);
}
static void
static void
put_short (guint16 value,
FILE *file)
/*
* Description:
* Reads a 16-bit integer from a file in such a way that the machine's
* bit ordering should not matter
*/
{
/*
* Description:
* Reads a 16-bit integer from a file in such a way that the machine's
* bit ordering should not matter
*/
guchar buf[2];
buf[0] = (guchar)( value >> 8 );
buf[1] = (guchar)( value % 256 );
fwrite( buf, 2, 1, file);
buf[0] = (guchar) (value >> 8);
buf[1] = (guchar) (value % 256);
fwrite (buf, 2, 1, file);
}
static gint32
load_image (char *filename)
/*
* Description:
* load the given image into gimp
*
* Arguments:
* filename - name on the file to read
*
* Return Value:
* Image id for the loaded image
*
*/
static gint32
load_image (gchar *filename)
{
gint i, j, tile_height, row;
FILE * file = NULL;
gchar * progMessage;
guchar * dest;
guchar * dest_base;
GDrawable * drawable;
gint32 image_ID;
gint32 layer_ID;
GPixelRgn pixel_rgn;
gushort width, height, depth;
/*
* Description:
* load the given image into gimp
*
* Arguments:
* filename - name on the file to read
*
* Return Value:
* Image id for the loaded image
*
*/
gint i, j, tile_height, row;
FILE *file = NULL;
gchar *progMessage;
guchar *dest;
guchar *dest_base;
GDrawable *drawable;
gint32 image_ID;
gint32 layer_ID;
GPixelRgn pixel_rgn;
gushort width, height, depth;
GImageType imgtype;
GDrawableType gdtype;
/* Set up progress display */
progMessage = g_strdup_printf( _("Loading %s:"), filename);
progMessage = g_strdup_printf (_("Loading %s:"), filename);
gimp_progress_init (progMessage);
free (progMessage);
PIX_DEBUG_PRINT("Opening file: %s\n",filename);
PIX_DEBUG_PRINT ("Opening file: %s\n", filename);
/* Open the file */
file = fopen( filename, "r" );
if ( NULL == file )
file = fopen (filename, "r");
if (NULL == file)
{
return -1;
}
/* Read header information */
width = get_short( file );
height = get_short( file );
get_short( file ); /* Discard obsolete fields */
get_short( file ); /* Discard obsolete fields */
depth = get_short( file );
PIX_DEBUG_PRINT( "Width %hu\n", width );
PIX_DEBUG_PRINT( "Height %hu\n", height );
if ( depth == 8 )
width = get_short (file);
height = get_short (file);
get_short (file); /* Discard obsolete fields */
get_short (file); /* Discard obsolete fields */
depth = get_short (file);
PIX_DEBUG_PRINT ("Width %hu\n", width);
PIX_DEBUG_PRINT ("Height %hu\n", height);
if (depth == 8)
{
/* Loading a matte file */
imgtype = GRAY;
gdtype = GRAY_IMAGE;
}
else if ( depth == 24 )
}
else if (depth == 24)
{
/* Loading an RGB file */
imgtype = RGB;
gdtype = RGB_IMAGE;
}
else
}
else
{
/* Header is invalid */
fclose( file );
fclose (file);
return -1;
}
image_ID = gimp_image_new ( width, height, imgtype );
gimp_image_set_filename ( image_ID, filename );
layer_ID = gimp_layer_new ( image_ID, _("Background"),
width,
height,
gdtype, 100, NORMAL_MODE );
gimp_image_add_layer ( image_ID, layer_ID, 0);
drawable = gimp_drawable_get ( layer_ID );
gimp_pixel_rgn_init ( &pixel_rgn, drawable, 0, 0, drawable->width,
drawable->height, TRUE, FALSE );
tile_height = gimp_tile_height();
if ( depth == 24 )
image_ID = gimp_image_new (width, height, imgtype);
gimp_image_set_filename (image_ID, filename);
layer_ID = gimp_layer_new (image_ID, _("Background"),
width,
height,
gdtype, 100, NORMAL_MODE);
gimp_image_add_layer (image_ID, layer_ID, 0);
drawable = gimp_drawable_get (layer_ID);
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0, drawable->width,
drawable->height, TRUE, FALSE);
tile_height = gimp_tile_height ();
if (depth == 24)
{
/* Read a 24-bit Pix image */
guchar record[4];
gint readlen;
tile_height = gimp_tile_height();
tile_height = gimp_tile_height ();
dest_base = dest = g_new (guchar, 3 * width * tile_height);
for (i = 0; i < height;)
for (i = 0; i < height;)
{
for ( dest = dest_base, row = 0;
row < tile_height && i < height;
i += 1, row += 1)
for (dest = dest_base, row = 0;
row < tile_height && i < height;
i += 1, row += 1)
{
guchar count;
/* Read a row of the image */
j = 0;
while ( j < width )
while (j < width)
{
readlen = fread( record, 1, 4, file );
if ( readlen < 4 )
readlen = fread (record, 1, 4, file);
if (readlen < 4)
break;
for ( count = 0; count < record[0]; ++count )
for (count = 0; count < record[0]; ++count)
{
dest[0] = record[3];
dest[1] = record[2];
dest[2] = record[1];
dest += 3;
j++;
if ( j >= width )
if (j >= width)
break;
}
}
@ -409,10 +422,10 @@ load_image (char *filename)
width, row);
gimp_progress_update ((double) i / (double) height);
}
free( dest_base );
}
else
free (dest_base);
}
else
{
/* Read an 8-bit Matte image */
guchar record[2];
@ -422,24 +435,26 @@ load_image (char *filename)
for (i = 0; i < height;)
{
for ( dest = dest_base, row = 0;
row < tile_height && i < height;
i += 1, row += 1)
for (dest = dest_base, row = 0;
row < tile_height && i < height;
i += 1, row += 1)
{
guchar count;
/* Read a row of the image */
j = 0;
while ( j < width )
while (j < width)
{
readlen = fread( record, 1, 2, file );
if ( readlen < 2 ) break;
for ( count = 0; count < record[0]; ++count )
readlen = fread(record, 1, 2, file);
if (readlen < 2)
break;
for (count = 0; count < record[0]; ++count)
{
dest[j] = record[1];
j++;
if ( j >= width ) break;
if (j >= width)
break;
}
}
dest += width;
@ -448,22 +463,22 @@ load_image (char *filename)
width, row);
gimp_progress_update ((double) i / (double) height);
}
free( dest_base );
g_free (dest_base);
}
gimp_drawable_flush (drawable);
gimp_drawable_detach (drawable);
fclose( file );
fclose (file);
return image_ID;
}
static gint
save_image (char *filename,
save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID )
gint32 drawable_ID)
{
/*
* Description:
* save the given file out as an alias pix or matte file
@ -473,23 +488,22 @@ save_image (char *filename,
* image_ID - ID of image to save
* drawable_ID - current drawable
*/
{
gint depth, i, j, row, tile_height, writelen, rectHeight;
/* gboolean savingAlpha = FALSE; */
gboolean savingColor = TRUE;
guchar * src;
guchar * src_base;
gchar * progMessage;
GDrawable * drawable;
GPixelRgn pixel_rgn;
FILE * file;
gint depth, i, j, row, tile_height, writelen, rectHeight;
/* gboolean savingAlpha = FALSE; */
gboolean savingColor = TRUE;
guchar *src;
guchar *src_base;
gchar *progMessage;
GDrawable *drawable;
GPixelRgn pixel_rgn;
FILE *file;
/* Get info about image */
drawable = gimp_drawable_get(drawable_ID);
gimp_pixel_rgn_init(&pixel_rgn, drawable, 0, 0, drawable->width,
drawable->height, FALSE, FALSE);
drawable = gimp_drawable_get (drawable_ID);
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0, drawable->width,
drawable->height, FALSE, FALSE);
switch (gimp_drawable_type(drawable_ID))
{
case GRAY_IMAGE:
@ -511,149 +525,145 @@ save_image (char *filename,
default:
return FALSE;
};
/* Open the output file. */
file = fopen (filename, "wb");
if ( !file )
{
return (FALSE);
}
if (!file)
return FALSE;
/* Set up progress display */
progMessage = g_strdup_printf( _("Saving %s:"), filename);
progMessage = g_strdup_printf (_("Saving %s:"), filename);
gimp_progress_init (progMessage);
free (progMessage);
/* Write the image header */
PIX_DEBUG_PRINT( "Width %hu\n", drawable->width );
PIX_DEBUG_PRINT( "Height %hu\n", drawable->height );
put_short( drawable->width, file );
put_short( drawable->height, file );
put_short( 0, file );
put_short( 0, file );
if ( savingColor )
PIX_DEBUG_PRINT ("Width %hu\n", drawable->width);
PIX_DEBUG_PRINT ("Height %hu\n", drawable->height);
put_short (drawable->width, file);
put_short (drawable->height, file);
put_short (0, file);
put_short (0, file);
if (savingColor)
{
put_short( 24, file );
}
else
{
put_short( 8, file );
put_short (24, file);
}
tile_height = gimp_tile_height();
src_base = g_new( guchar, tile_height * drawable->width * depth );
if ( savingColor )
else
{
put_short (8, file);
}
tile_height = gimp_tile_height ();
src_base = g_new (guchar, tile_height * drawable->width * depth);
if (savingColor)
{
/* Writing a 24-bit Pix image */
guchar record[4];
for (i = 0; i < drawable->height;)
for (i = 0; i < drawable->height;)
{
rectHeight = ( tile_height < ( drawable->height - i - 1 ) ) ?
tile_height : ( drawable->height - i - 1 );
rectHeight = (tile_height < (drawable->height - i - 1)) ?
tile_height : (drawable->height - i - 1);
gimp_pixel_rgn_get_rect (&pixel_rgn, src_base, 0, i,
drawable->width, rectHeight);
for ( src = src_base, row = 0;
row < tile_height && i < drawable->height;
i += 1, row += 1)
{
for (src = src_base, row = 0;
row < tile_height && i < drawable->height;
i += 1, row += 1)
{
/* Write a row of the image */
record[0] = 1;
record[3] = src[0];
record[2] = src[1];
record[1] = src[2];
src += depth;
for ( j = 1; j < drawable->width; ++j )
for (j = 1; j < drawable->width; ++j)
{
if ( ( record[3] != src[0] ) ||
( record[2] != src[1] ) ||
( record[1] != src[2] ) ||
( record[0] == 255 ) )
if ((record[3] != src[0]) ||
(record[2] != src[1]) ||
(record[1] != src[2]) ||
(record[0] == 255))
{
/* Write current RLE record and start a new one */
writelen = fwrite( record, 1, 4, file );
writelen = fwrite (record, 1, 4, file);
record[0] = 1;
record[3] = src[0];
record[2] = src[1];
record[1] = src[2];
}
else
}
else
{
/* increment run length in current record */
record[0] ++;
record[0]++;
}
src += depth;
}
/* Write last record in row */
writelen = fwrite( record, 1, 4, file );
/* Write last record in row */
writelen = fwrite (record, 1, 4, file);
}
gimp_progress_update ((double) i / (double) drawable->height);
}
}
else
}
else
{
/* Writing a 8-bit Matte (Mask) image */
guchar record[2];
for (i = 0; i < drawable->height;)
for (i = 0; i < drawable->height;)
{
rectHeight = ( tile_height < ( drawable->height - i - 1 ) ) ?
tile_height : ( drawable->height - i - 1 );
rectHeight = (tile_height < (drawable->height - i - 1)) ?
tile_height : (drawable->height - i - 1);
gimp_pixel_rgn_get_rect (&pixel_rgn, src_base, 0, i,
drawable->width, rectHeight);
for ( src = src_base, row = 0;
row < tile_height && i < drawable->height;
i += 1, row += 1)
for (src = src_base, row = 0;
row < tile_height && i < drawable->height;
i += 1, row += 1)
{
/* Write a row of the image */
record[0] = 1;
record[1] = src[0];
src += depth;
for ( j = 1; j < drawable->width; ++j )
for (j = 1; j < drawable->width; ++j)
{
if ( ( record[1] != src[0] ) || ( record[0] == 255 ) )
if ((record[1] != src[0]) || (record[0] == 255))
{
/* Write current RLE record and start a new one */
writelen = fwrite( record, 1, 2, file );
writelen = fwrite (record, 1, 2, file);
record[0] = 1;
record[1] = src[0];
}
else
}
else
{
/* increment run length in current record */
record[0] ++;
}
src += depth;
}
/* Write last record in row */
writelen = fwrite( record, 1, 2, file );
/* Write last record in row */
writelen = fwrite (record, 1, 2, file);
}
gimp_progress_update ((double) i / (double) drawable->height);
}
}
g_free (src_base);
free( src_base );
fclose( file );
return (1);
fclose (file);
return TRUE;
}
static void
init_gtk (void)
{
gchar **argv;
gint argc;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("pix");
gtk_init (&argc, &argv);
gtk_rc_parse (gimp_gtkrc ());
}

View file

@ -52,30 +52,32 @@
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h> /* For random seeding */
#include <gtk/gtk.h>
#include "libgimp/gimp.h"
#include "libgimp/gimpui.h"
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include <libgimp/gimpmath.h>
#include "libgimp/stdplugins-intl.h"
/* Some useful macros */
#define ENTRY_WIDTH 75
#define SCALE_WIDTH 128
#define TILE_CACHE_SIZE 32
#define ENTRY_WIDTH 75
#define SCALE_WIDTH 128
#define TILE_CACHE_SIZE 32
typedef struct {
gint seed;
gdouble turbulence;
typedef struct
{
gint seed;
gdouble turbulence;
/* Interface only */
gboolean timeseed;
} PlasmaValues;
typedef struct {
typedef struct
{
gint run;
} PlasmaInterface;
@ -90,40 +92,50 @@ static void run (gchar *name,
gint *nreturn_vals,
GParam **return_vals);
static gint plasma_dialog (void);
static void plasma_ok_callback (GtkWidget *widget,
gpointer data);
static void plasma_entry_callback (GtkWidget *widget,
gpointer data);
static void plasma_scale_update (GtkAdjustment *adjustment,
gpointer data);
static void toggle_callback (GtkWidget *widget, gboolean *data);
static void plasma (GDrawable *drawable);
static void random_rgb (guchar *d);
static void add_random (guchar *d, gint amnt);
static void init_plasma (GDrawable *drawable);
static void provide_tile (GDrawable *drawable, gint col, gint row);
static void end_plasma (GDrawable *drawable);
static void get_pixel (GDrawable *drawable, gint x, gint y, guchar *pixel);
static void put_pixel (GDrawable *drawable, gint x, gint y, guchar *pixel);
static gint do_plasma (GDrawable *drawable, gint x1, gint y1,
gint x2, gint y2, gint depth, gint scale_depth);
static gint plasma_dialog (void);
static void plasma_ok_callback (GtkWidget *widget,
gpointer data);
static void plasma (GDrawable *drawable);
static void random_rgb (guchar *d);
static void add_random (guchar *d,
gint amnt);
static void init_plasma (GDrawable *drawable);
static void provide_tile (GDrawable *drawable,
gint col,
gint row);
static void end_plasma (GDrawable *drawable);
static void get_pixel (GDrawable *drawable,
gint x,
gint y,
guchar *pixel);
static void put_pixel (GDrawable *drawable,
gint x,
gint y,
guchar *pixel);
static gint do_plasma (GDrawable *drawable,
gint x1,
gint y1,
gint x2,
gint y2,
gint depth,
gint scale_depth);
/***** Local vars *****/
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
static PlasmaValues pvals =
{
0, /* seed */
1.0, /* turbulence */
TRUE /* Time seed? */
0, /* seed */
1.0, /* turbulence */
TRUE /* Time seed? */
};
static PlasmaInterface pint =
@ -139,13 +151,13 @@ static void
query (void)
{
static GParamDef args[]=
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
{ PARAM_IMAGE, "image", "Input image (unused)" },
{ PARAM_DRAWABLE, "drawable", "Input drawable" },
{ PARAM_INT32, "seed", "Random seed" },
{ PARAM_FLOAT, "turbulence", "Turbulence of plasma" }
};
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
{ PARAM_IMAGE, "image", "Input image (unused)" },
{ PARAM_DRAWABLE, "drawable", "Input drawable" },
{ PARAM_INT32, "seed", "Random seed" },
{ PARAM_FLOAT, "turbulence", "Turbulence of plasma" }
};
static GParamDef *return_vals = NULL;
static gint nargs = sizeof (args) / sizeof (args[0]);
static gint nreturn_vals = 0;
@ -207,15 +219,17 @@ run (gchar *name,
INIT_I18N();
/* Make sure all the arguments are there! */
if (nparams != 5)
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS)
{
status = STATUS_CALLING_ERROR;
}
else
{
pvals.seed = (gint) param[3].data.d_int32;
pvals.turbulence = (gdouble) param[4].data.d_float;
if (pvals.turbulence <= 0)
status = STATUS_CALLING_ERROR;
}
if ((status == STATUS_SUCCESS) &&
pvals.turbulence <= 0)
status = STATUS_CALLING_ERROR;
break;
case RUN_WITH_LAST_VALS:
@ -264,15 +278,11 @@ plasma_dialog (void)
GtkWidget *dlg;
GtkWidget *frame;
GtkWidget *table;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *spinbutton;
GtkWidget *seed_hbox;
GtkWidget *time_button;
GtkWidget *scale;
GtkObject *scale_data;
GtkObject *adj;
gchar **argv;
gint argc;
gchar buffer[32];
argc = 1;
argv = g_new (gchar *, 1);
@ -297,78 +307,46 @@ plasma_dialog (void)
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
gimp_help_init ();
/* parameter settings */
frame = gtk_frame_new (_("Plasma Options"));
frame = gtk_frame_new (_("Parameter Settings"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
table = gtk_table_new (2, 2, FALSE);
table = gtk_table_new (2, 3, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_container_set_border_width (GTK_CONTAINER (table), 4);
gtk_container_add (GTK_CONTAINER (frame), table);
label = gtk_label_new (_("Seed:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label);
seed_hbox = gimp_random_seed_new (&pvals.seed, &pvals.timeseed,
TRUE, FALSE);
gimp_table_attach_aligned (GTK_TABLE (table), 0,
_("Random Seed:"), 1.0, 0.5,
seed_hbox, TRUE);
seed_hbox = gtk_hbox_new (FALSE, 2);
gtk_table_attach (GTK_TABLE (table), seed_hbox, 1, 2, 0, 1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (seed_hbox);
entry = gtk_entry_new ();
gtk_box_pack_start (GTK_BOX (seed_hbox), entry, TRUE, TRUE, 0);
gtk_widget_set_usize (entry, ENTRY_WIDTH, 0);
g_snprintf (buffer, sizeof (buffer), "%d", pvals.seed);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
GTK_SIGNAL_FUNC (plasma_entry_callback),
&pvals.seed);
gtk_widget_show (entry);
time_button = gtk_toggle_button_new_with_label (_("Time"));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(time_button),pvals.timeseed);
gtk_signal_connect (GTK_OBJECT (time_button), "clicked",
(GtkSignalFunc) toggle_callback,
&pvals.timeseed);
gtk_box_pack_end (GTK_BOX (seed_hbox), time_button, FALSE, FALSE, 0);
gtk_widget_show (time_button);
gtk_widget_show (seed_hbox);
label = gtk_label_new (_("Turbulence:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label);
scale_data = gtk_adjustment_new (pvals.turbulence, 0.1, 7.0, 0.1, 0.1, 0.0);
scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data));
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_table_attach (GTK_TABLE (table), scale, 1, 2, 1, 2, GTK_FILL, 0, 0, 0);
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
gtk_scale_set_digits (GTK_SCALE (scale), 1);
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (scale_data), "value_changed",
(GtkSignalFunc) plasma_scale_update,
&pvals.turbulence);
gtk_widget_show (scale);
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
_("Turbulence:"), SCALE_WIDTH, 0,
pvals.turbulence,
0.1, 7.0, 0.1, 1.0, 1,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&pvals.turbulence);
gtk_widget_show (frame);
gtk_widget_show (table);
gtk_widget_show (dlg);
gtk_main ();
gimp_help_free ();
gdk_flush ();
return pint.run;
}
/* Plasma interface functions */
static void
plasma_ok_callback (GtkWidget *widget,
gpointer data)
@ -378,33 +356,6 @@ plasma_ok_callback (GtkWidget *widget,
gtk_widget_destroy (GTK_WIDGET (data));
}
static void
plasma_entry_callback (GtkWidget *widget,
gpointer data)
{
gint *text_val;
text_val = (gint *) data;
*text_val = atoi (gtk_entry_get_text (GTK_ENTRY (widget)));
}
static void
plasma_scale_update (GtkAdjustment *adjustment,
gpointer data)
{
gdouble *dptr = (gdouble*) data;
*dptr = adjustment->value;
}
static void
toggle_callback (GtkWidget *widget,
gboolean *data)
{
*data = GTK_TOGGLE_BUTTON (widget)->active;
}
#define AVE(n, v1, v2) n[0] = ((gint)v1[0] + (gint)v2[0]) / 2;\
n[1] = ((gint)v1[1] + (gint)v2[1]) / 2;\
n[2] = ((gint)v1[2] + (gint)v2[2]) / 2;

View file

@ -30,7 +30,7 @@
'diffraction' => { libdep => 'gtk', ui => 1 },
'displace' => { libdep => 'gtk', ui => 1 },
'edge' => { libdep => 'gtk', ui => 1 },
'emboss' => { libdep => 'gtk', ui => 1, libsupp => 'megawidget' },
'emboss' => { libdep => 'gtk', ui => 1 },
'engrave' => { libdep => 'gtk', ui => 1 },
'exchange' => { libdep => 'gtk', ui => 1 },
'film' => { libdep => 'gtk', ui => 1 },
@ -66,7 +66,7 @@
'mblur' => { libdep => 'gtk', ui => 1 },
'mpeg' => { libdep => 'gtk', optional => 1 },
'newsprint' => { libdep => 'gtk', ui => 1 },
'nlfilt' => { libdep => 'gtk', ui => 1, libsupp => 'megawidget' },
'nlfilt' => { libdep => 'gtk', ui => 1 },
'noisify' => { libdep => 'gtk', ui => 1 },
'normalize' => { libdep => 'glib' },
'nova' => { libdep => 'gtk', ui => 1 },
@ -113,7 +113,7 @@
'vinvert' => { libdep => 'glib' },
'vpropagate' => { libdep => 'gtk', ui => 1 },
'warp' => { libdep => 'gtk', ui => 1 },
'waves' => { libdep => 'gtk', ui => 1, libsupp => 'megawidget' },
'waves' => { libdep => 'gtk', ui => 1 },
'whirlpinch' => { libdep => 'gtk', ui => 1 },
'wind' => { libdep => 'gtk', ui => 1 },
'wmf' => { libdep => 'gtk', ui => 1 },

View file

@ -45,23 +45,23 @@
#include <stdlib.h>
#include <time.h>
#include <png.h> /* PNG library definitions */
#include <gtk/gtk.h>
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include <png.h> /* PNG library definitions */
#include "libgimp/stdplugins-intl.h"
/*
* Constants...
*/
#define PLUG_IN_VERSION "1.1.10 - 8 Nov 1999"
#define SCALE_WIDTH 125
#define PLUG_IN_VERSION "1.1.10 - 8 Nov 1999"
#define SCALE_WIDTH 125
#define DEFAULT_GAMMA 2.20
#define DEFAULT_GAMMA 2.20
/*
* Structures...
@ -96,32 +96,28 @@ static void init_gtk (void);
static gint save_dialog (void);
static void save_ok_callback (GtkWidget *widget,
gpointer data);
static void save_compression_update (GtkAdjustment *adjustment,
gpointer data);
static void save_interlace_update (GtkWidget *widget,
gpointer data);
/*
* Globals...
*/
GPlugInInfo PLUG_IN_INFO =
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
PngSaveVals pngvals =
PngSaveVals pngvals =
{
FALSE,
FALSE,
6
};
int runme = FALSE;
static gboolean runme = FALSE;
/*
@ -143,12 +139,14 @@ query (void)
{ PARAM_STRING, "filename", "The name of the file to load" },
{ PARAM_STRING, "raw_filename", "The name of the file to load" },
};
static GParamDef load_return_vals[] =
static GParamDef load_return_vals[] =
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
@ -160,7 +158,7 @@ query (void)
{ PARAM_INT32, "noextras", "Skip ancillary chunks?" },
{ PARAM_INT32, "compression", "Deflate Compression factor (0--9)" }
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N ();
@ -188,9 +186,13 @@ query (void)
nsave_args, 0,
save_args, NULL);
gimp_register_magic_load_handler ("file_png_load", "png", "",
gimp_register_magic_load_handler ("file_png_load",
"png",
"",
"0,string,\211PNG\r\n\032\n");
gimp_register_save_handler ("file_png_save", "png", "");
gimp_register_save_handler ("file_png_save",
"png",
"");
}
@ -199,49 +201,40 @@ query (void)
*/
static void
run (gchar *name, /* I - Name of filter program. */
gint nparams, /* I - Number of parameters passed in */
GParam *param, /* I - Parameter values */
gint *nreturn_vals, /* O - Number of return values */
GParam **return_vals) /* O - Return values */
run (gchar *name,
gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals)
{
gint32 image_ID;
gint32 drawable_ID;
gint32 orig_image_ID;
GRunModeType run_mode;
GParam *values; /* Return values */
static GParam values[2];
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
gint32 orig_image_ID;
GimpExportReturnType export = EXPORT_CANCEL;
/*
* Initialize parameter data...
*/
values = g_new (GParam, 2);
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_SUCCESS;
*nreturn_vals = 1;
*return_vals = values;
/*
* Load or save an image...
*/
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_png_load") == 0)
{
INIT_I18N ();
*nreturn_vals = 2;
image_ID = load_image (param[1].data.d_string);
if (image_ID != -1)
{
*nreturn_vals = 2;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
{
status = STATUS_EXECUTION_ERROR;
}
}
else if (strcmp (name, "file_png_save") == 0)
{
@ -250,7 +243,6 @@ run (gchar *name, /* I - Name of filter program. */
run_mode = param[0].data.d_int32;
image_ID = orig_image_ID = param[1].data.d_int32;
drawable_ID = param[2].data.d_int32;
*nreturn_vals = 1;
/* eventually export the image */
switch (run_mode)
@ -266,7 +258,7 @@ run (gchar *name, /* I - Name of filter program. */
if (export == EXPORT_CANCEL)
{
*nreturn_vals = 1;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
@ -286,7 +278,7 @@ run (gchar *name, /* I - Name of filter program. */
* Then acquire information with a dialog...
*/
if (!save_dialog())
goto finish;
status = STATUS_CANCEL;
break;
case RUN_NONINTERACTIVE:
@ -294,7 +286,9 @@ run (gchar *name, /* I - Name of filter program. */
* Make sure all the arguments are there!
*/
if (nparams != 8)
values[0].data.d_status = STATUS_CALLING_ERROR;
{
status = STATUS_CALLING_ERROR;
}
else
{
pngvals.interlaced = param[5].data.d_int32;
@ -303,11 +297,11 @@ run (gchar *name, /* I - Name of filter program. */
if (pngvals.compression_level < 0 ||
pngvals.compression_level > 9)
values[0].data.d_status = STATUS_CALLING_ERROR;
status = STATUS_CALLING_ERROR;
};
break;
case RUN_WITH_LAST_VALS :
case RUN_WITH_LAST_VALS:
/*
* Possibly retrieve data...
*/
@ -318,22 +312,28 @@ run (gchar *name, /* I - Name of filter program. */
break;
};
if (values[0].data.d_status == STATUS_SUCCESS)
if (status == STATUS_SUCCESS)
{
if (save_image (param[3].data.d_string,
image_ID, drawable_ID, orig_image_ID))
gimp_set_data ("file_png_save", &pngvals, sizeof (pngvals));
{
gimp_set_data ("file_png_save", &pngvals, sizeof (pngvals));
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
};
finish:
{
status = STATUS_EXECUTION_ERROR;
}
}
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
{
status = STATUS_EXECUTION_ERROR;
}
values[0].data.d_status = status;
}
@ -902,32 +902,11 @@ save_ok_callback (GtkWidget *widget,
gtk_widget_destroy (GTK_WIDGET (data));
}
static void
save_compression_update (GtkAdjustment *adjustment,
gpointer data)
{
pngvals.compression_level = (gint32) adjustment->value;
}
static void
save_interlace_update (GtkWidget *widget,
gpointer data)
{
pngvals.interlaced = GTK_TOGGLE_BUTTON (widget)->active;
}
static void
save_noextras_update (GtkWidget *widget,
gpointer data)
{
pngvals.noextras = GTK_TOGGLE_BUTTON (widget)->active;
}
static void
init_gtk (void)
{
gchar **argv;
gint argc;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
@ -944,7 +923,6 @@ save_dialog (void)
GtkWidget *frame;
GtkWidget *table;
GtkWidget *toggle;
GtkWidget *label;
GtkWidget *scale;
GtkObject *scale_data;
@ -981,8 +959,8 @@ save_dialog (void)
gtk_table_attach (GTK_TABLE (table), toggle, 0, 2, 0, 1,
GTK_FILL, 0, 0, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (save_interlace_update),
NULL);
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&pngvals.interlaced);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), pngvals.interlaced);
gtk_widget_show (toggle);
@ -990,29 +968,24 @@ save_dialog (void)
gtk_table_attach (GTK_TABLE (table), toggle, 0, 2, 1, 2,
GTK_FILL, 0, 0, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (save_noextras_update),
NULL);
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&pngvals.noextras);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), pngvals.noextras);
gtk_widget_show (toggle);
label = gtk_label_new (_("Compression Level:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label);
scale_data = gtk_adjustment_new (pngvals.compression_level,
1.0, 9.0, 1.0, 1.0, 0.0);
scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data));
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_table_attach (GTK_TABLE (table), scale, 1, 2, 2, 3,
GTK_FILL, 0, 0, 0);
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
gtk_scale_set_digits (GTK_SCALE (scale), 0);
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
gimp_table_attach_aligned (GTK_TABLE (table), 2,
_("Compression Level:"), 1.0, 1.0,
scale, FALSE);
gtk_signal_connect (GTK_OBJECT (scale_data), "value_changed",
GTK_SIGNAL_FUNC (save_compression_update),
NULL);
GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
&pngvals.compression_level);
gtk_widget_show (scale);
gtk_widget_show (dlg);
@ -1022,7 +995,3 @@ save_dialog (void)
return runme;
}
/*
* End of "$Id$".
*/

View file

@ -58,36 +58,39 @@
/* Declare local data types
*/
typedef struct _PNMScanner {
int fd; /* The file descriptor of the file being read */
char cur; /* The current character in the input stream */
int eof; /* Have we reached end of file? */
char *inbuf; /* Input buffer - initially 0 */
int inbufsize; /* Size of input buffer */
int inbufvalidsize; /* Size of input buffer with valid data */
int inbufpos; /* Position in input buffer */
typedef struct _PNMScanner
{
gint fd; /* The file descriptor of the file being read */
gchar cur; /* The current character in the input stream */
gint eof; /* Have we reached end of file? */
gchar *inbuf; /* Input buffer - initially 0 */
gint inbufsize; /* Size of input buffer */
gint inbufvalidsize; /* Size of input buffer with valid data */
gint inbufpos; /* Position in input buffer */
} PNMScanner;
typedef struct _PNMInfo {
int xres, yres; /* The size of the image */
int maxval; /* For ascii image files, the max value
typedef struct _PNMInfo
{
gint xres, yres; /* The size of the image */
gint maxval; /* For ascii image files, the max value
* which we need to normalize to */
int np; /* Number of image planes (0 for pbm) */
int asciibody; /* 1 if ascii body, 0 if raw body */
jmp_buf jmpbuf; /* Where to jump to on an error loading */
gint np; /* Number of image planes (0 for pbm) */
gint asciibody; /* 1 if ascii body, 0 if raw body */
jmp_buf jmpbuf; /* Where to jump to on an error loading */
/* Routine to use to load the pnm body */
void (*loader)(PNMScanner *, struct _PNMInfo *, GPixelRgn *);
void (* loader) (PNMScanner *, struct _PNMInfo *, GPixelRgn *);
} PNMInfo;
/* Contains the information needed to write out PNM rows */
typedef struct _PNMRowInfo {
int fd; /* File descriptor */
char *rowbuf; /* Buffer for writing out rows */
int xres; /* X resolution */
int np; /* Number of planes */
unsigned char *red; /* Colormap red */
unsigned char *grn; /* Colormap green */
unsigned char *blu; /* Colormap blue */
typedef struct _PNMRowInfo
{
gint fd; /* File descriptor */
gchar *rowbuf; /* Buffer for writing out rows */
gint xres; /* X resolution */
gint np; /* Number of planes */
guchar *red; /* Colormap red */
guchar *grn; /* Colormap green */
guchar *blu; /* Colormap blue */
} PNMRowInfo;
/* Save info */
@ -112,53 +115,50 @@ typedef struct
/* Declare some local functions.
*/
static void query (void);
static void run (char *name,
int nparams,
static void run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals);
static gint32 load_image (char *filename);
static gint save_image (char *filename,
static gint32 load_image (gchar *filename);
static gint save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID);
static void init_gtk (void);
static gint save_dialog (void);
static void pnm_load_ascii (PNMScanner * scan,
PNMInfo * info,
GPixelRgn * pixel_rgn);
static void pnm_load_raw (PNMScanner * scan,
PNMInfo * info,
GPixelRgn * pixel_rgn);
static void pnm_load_rawpbm (PNMScanner * scan,
PNMInfo * info,
GPixelRgn * pixel_rgn);
static void pnmsaverow_ascii (PNMRowInfo * ri,
guchar * data);
static void pnmsaverow_raw (PNMRowInfo * ri,
guchar * data);
static void pnmsaverow_ascii_indexed (PNMRowInfo * ri,
guchar * data);
static void pnmsaverow_raw_indexed (PNMRowInfo * ri,
guchar * data);
static void pnmscanner_destroy (PNMScanner * s);
static void pnmscanner_createbuffer (PNMScanner * s,
int bufsize);
static void pnmscanner_getchar (PNMScanner * s);
static void pnmscanner_eatwhitespace (PNMScanner * s);
static void pnmscanner_gettoken (PNMScanner * s,
char * buf,
int bufsize);
static PNMScanner * pnmscanner_create (int fd);
static void save_ok_callback (GtkWidget *widget,
gpointer data);
static void save_toggle_update (GtkWidget *widget,
gpointer data);
static void pnm_load_ascii (PNMScanner *scan,
PNMInfo *info,
GPixelRgn *pixel_rgn);
static void pnm_load_raw (PNMScanner *scan,
PNMInfo *info,
GPixelRgn *pixel_rgn);
static void pnm_load_rawpbm (PNMScanner *scan,
PNMInfo *info,
GPixelRgn *pixel_rgn);
static void pnmsaverow_ascii (PNMRowInfo *ri,
guchar *data);
static void pnmsaverow_raw (PNMRowInfo *ri,
guchar *data);
static void pnmsaverow_ascii_indexed (PNMRowInfo *ri,
guchar *data);
static void pnmsaverow_raw_indexed (PNMRowInfo *ri,
guchar *data);
static void pnmscanner_destroy (PNMScanner *s);
static void pnmscanner_createbuffer (PNMScanner *s,
gint bufsize);
static void pnmscanner_getchar (PNMScanner *s);
static void pnmscanner_eatwhitespace (PNMScanner *s);
static void pnmscanner_gettoken (PNMScanner *s,
gchar *buf,
gint bufsize);
static PNMScanner * pnmscanner_create (gint fd);
#define pnmscanner_eof(s) ((s)->eof)
@ -169,28 +169,30 @@ static void save_toggle_update (GtkWidget *widget,
if ((predicate)) \
{ /*gimp_message((errmsg));*/ longjmp((jmpbuf),1); }
static struct struct_pnm_types {
char name;
int np;
int asciibody;
int maxval;
void (*loader)(PNMScanner *, struct _PNMInfo *, GPixelRgn *pixel_rgn);
} pnm_types[] = {
{ '1', 0, 1, 1, pnm_load_ascii }, /* ASCII PBM */
static struct struct_pnm_types
{
gchar name;
gint np;
gint asciibody;
gint maxval;
void (* loader) (PNMScanner *, struct _PNMInfo *, GPixelRgn *pixel_rgn);
} pnm_types[] =
{
{ '1', 0, 1, 1, pnm_load_ascii }, /* ASCII PBM */
{ '2', 1, 1, 255, pnm_load_ascii }, /* ASCII PGM */
{ '3', 3, 1, 255, pnm_load_ascii }, /* ASCII PPM */
{ '4', 0, 0, 1, pnm_load_rawpbm }, /* RAW PBM */
{ '4', 0, 0, 1, pnm_load_rawpbm }, /* RAW PBM */
{ '5', 1, 0, 255, pnm_load_raw }, /* RAW PGM */
{ '6', 3, 0, 255, pnm_load_raw }, /* RAW PPM */
{ 0 , 0, 0, 0, NULL}
{ 0 , 0, 0, 0, NULL}
};
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
static PNMSaveVals psvals =
@ -219,8 +221,9 @@ query (void)
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
@ -231,7 +234,7 @@ query (void)
{ PARAM_STRING, "raw_filename", "The name of the file to save the image in" },
{ PARAM_INT32, "raw", "Specify non-zero for raw output, zero for ascii output" }
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -259,32 +262,36 @@ query (void)
nsave_args, 0,
save_args, NULL);
gimp_register_magic_load_handler ("file_pnm_load", "pnm,ppm,pgm,pbm", "",
"0,string,P1,0,string,P2,0,string,P3,0,string,P4,0,string,P5,0,string,P6");
gimp_register_save_handler ("file_pnm_save", "pnm,ppm,pgm,pbm", "");
gimp_register_magic_load_handler ("file_pnm_load",
"pnm,ppm,pgm,pbm",
"",
"0,string,P1,0,string,P2,0,string,P3,0,"
"string,P4,0,string,P5,0,string,P6");
gimp_register_save_handler ("file_pnm_save",
"pnm,ppm,pgm,pbm",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
GimpExportReturnType export = EXPORT_CANCEL;
run_mode = param[0].data.d_int32;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = -1;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (run_mode == RUN_NONINTERACTIVE)
{
@ -301,18 +308,17 @@ run (char *name,
if (image_ID != -1)
{
values[0].data.d_status = STATUS_SUCCESS;
*nreturn_vals = 2;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = STATUS_EXECUTION_ERROR;
}
*nreturn_vals = 2;
}
else if (strcmp (name, "file_pnm_save") == 0)
{
*nreturn_vals = 1;
image_ID = param[1].data.d_int32;
drawable_ID = param[2].data.d_int32;
@ -323,18 +329,19 @@ run (char *name,
case RUN_WITH_LAST_VALS:
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "PNM",
(CAN_HANDLE_RGB | CAN_HANDLE_GRAY | CAN_HANDLE_INDEXED));
(CAN_HANDLE_RGB |
CAN_HANDLE_GRAY |
CAN_HANDLE_INDEXED));
if (export == EXPORT_CANCEL)
{
*nreturn_vals = 1;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
default:
break;
}
switch (run_mode)
{
case RUN_INTERACTIVE:
@ -343,14 +350,16 @@ run (char *name,
/* First acquire information with a dialog */
if (! save_dialog ())
return;
status = STATUS_CANCEL;
break;
case RUN_NONINTERACTIVE:
/* Make sure all the arguments are there! */
if (nparams != 6)
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS)
{
status = STATUS_CALLING_ERROR;
}
else
{
psvals.raw = (param[5].data.d_int32) ? TRUE : FALSE;
}
@ -364,23 +373,32 @@ run (char *name,
break;
}
if (save_image (param[3].data.d_string, image_ID, drawable_ID))
if (status == STATUS_SUCCESS)
{
/* Store psvals data */
gimp_set_data ("file_pnm_save", &psvals, sizeof (PNMSaveVals));
values[0].data.d_status = STATUS_SUCCESS;
if (save_image (param[3].data.d_string, image_ID, drawable_ID))
{
/* Store psvals data */
gimp_set_data ("file_pnm_save", &psvals, sizeof (PNMSaveVals));
}
else
{
status = STATUS_EXECUTION_ERROR;
}
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
else
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
static gint32
load_image (char *filename)
load_image (gchar *filename)
{
GPixelRgn pixel_rgn;
gint32 image_ID;
@ -398,7 +416,7 @@ load_image (char *filename)
g_free (temp);
/* open the file */
fd = open(filename, O_RDONLY | _O_BINARY);
fd = open (filename, O_RDONLY | _O_BINARY);
if (fd == -1)
{
@ -407,7 +425,7 @@ load_image (char *filename)
}
/* allocate the necessary structures */
pnminfo = (PNMInfo *) g_malloc(sizeof(PNMInfo));
pnminfo = (PNMInfo *) g_malloc (sizeof (PNMInfo));
scan = NULL;
/* set error handling */
@ -425,7 +443,7 @@ load_image (char *filename)
longjmp(pnminfo->jmpbuf,1);
/* Get magic number */
pnmscanner_gettoken(scan, buf, BUFLEN);
pnmscanner_gettoken (scan, buf, BUFLEN);
CHECK_FOR_ERROR(pnmscanner_eof(scan), pnminfo->jmpbuf,
"pnm filter: premature end of file\n");
CHECK_FOR_ERROR((buf[0] != 'P' || buf[2]), pnminfo->jmpbuf,
@ -475,21 +493,24 @@ load_image (char *filename)
/* Create a new image of the proper size and associate the filename with it.
*/
image_ID = gimp_image_new (pnminfo->xres, pnminfo->yres, (pnminfo->np >= 3) ? RGB : GRAY);
image_ID = gimp_image_new (pnminfo->xres, pnminfo->yres,
(pnminfo->np >= 3) ? RGB : GRAY);
gimp_image_set_filename (image_ID, filename);
layer_ID = gimp_layer_new (image_ID, _("Background"),
pnminfo->xres, pnminfo->yres,
(pnminfo->np >= 3) ? RGB_IMAGE : GRAY_IMAGE, 100, NORMAL_MODE);
(pnminfo->np >= 3) ? RGB_IMAGE : GRAY_IMAGE,
100, NORMAL_MODE);
gimp_image_add_layer (image_ID, layer_ID, 0);
drawable = gimp_drawable_get (layer_ID);
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0, drawable->width, drawable->height, TRUE, FALSE);
gimp_pixel_rgn_init (&pixel_rgn, drawable,
0, 0, drawable->width, drawable->height, TRUE, FALSE);
pnminfo->loader(scan, pnminfo, &pixel_rgn);
pnminfo->loader (scan, pnminfo, &pixel_rgn);
/* Destroy the scanner */
pnmscanner_destroy(scan);
pnmscanner_destroy (scan);
/* free the structures */
g_free (pnminfo);
@ -504,7 +525,6 @@ load_image (char *filename)
return image_ID;
}
static void
pnm_load_ascii (PNMScanner *scan,
PNMInfo *info,
@ -724,7 +744,7 @@ pnmsaverow_ascii_indexed (PNMRowInfo *ri,
}
static gint
save_image (char *filename,
save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID)
{
@ -732,7 +752,7 @@ save_image (char *filename,
GDrawable *drawable;
GDrawableType drawable_type;
PNMRowInfo rowinfo;
void (*saverow)(PNMRowInfo *, unsigned char *);
void (*saverow) (PNMRowInfo *, unsigned char *) = NULL;
unsigned char red[256];
unsigned char grn[256];
unsigned char blu[256];
@ -748,21 +768,22 @@ save_image (char *filename,
drawable = gimp_drawable_get (drawable_ID);
drawable_type = gimp_drawable_type (drawable_ID);
gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0, drawable->width, drawable->height, FALSE, FALSE);
gimp_pixel_rgn_init (&pixel_rgn, drawable,
0, 0, drawable->width, drawable->height, FALSE, FALSE);
/* Make sure we're not saving an image with an alpha channel */
if (gimp_drawable_has_alpha (drawable_ID))
{
gimp_message ( _("PNM save cannot handle images with alpha channels."));
g_message (_("PNM save cannot handle images with alpha channels."));
return FALSE;
}
temp = g_strdup_printf ( _("Saving %s:"), filename);
temp = g_strdup_printf (_("Saving %s:"), filename);
gimp_progress_init (temp);
g_free (temp);
/* open the file */
fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | _O_BINARY, 0644);
fd = open (filename, O_WRONLY | O_CREAT | O_TRUNC | _O_BINARY, 0644);
if (fd == -1)
{
@ -828,7 +849,7 @@ save_image (char *filename,
if (drawable_type == INDEXED_IMAGE)
{
int i;
unsigned char *cmap;
guchar *cmap;
int colors;
cmap = gimp_image_get_cmap (image_ID, &colors);
@ -846,16 +867,16 @@ save_image (char *filename,
}
/* allocate a buffer for retrieving information from the pixel region */
data = (unsigned char *) g_malloc (gimp_tile_height () * drawable->width * drawable->bpp);
data = g_new (guchar, gimp_tile_height () * drawable->width * drawable->bpp);
/* write out comment string */
write(fd, SAVE_COMMENT_STRING, strlen(SAVE_COMMENT_STRING));
write (fd, SAVE_COMMENT_STRING, strlen (SAVE_COMMENT_STRING));
/* write out resolution and maxval */
sprintf(buf, "%d %d\n255\n", xres, yres);
write(fd, buf, strlen(buf));
sprintf (buf, "%d %d\n255\n", xres, yres);
write (fd, buf, strlen(buf));
rowbuf = g_malloc(rowbufsize+1);
rowbuf = g_malloc (rowbufsize + 1);
rowinfo.fd = fd;
rowinfo.rowbuf = rowbuf;
rowinfo.xres = xres;
@ -870,7 +891,8 @@ save_image (char *filename,
{
yend = ypos + gimp_tile_height ();
yend = MIN (yend, yres);
gimp_pixel_rgn_get_rect (&pixel_rgn, data, 0, ypos, xres, (yend - ypos));
gimp_pixel_rgn_get_rect (&pixel_rgn, data,
0, ypos, xres, (yend - ypos));
d = data;
}
@ -884,8 +906,8 @@ save_image (char *filename,
/* close the file */
close (fd);
g_free(rowbuf);
g_free(data);
g_free (rowbuf);
g_free (data);
gimp_drawable_detach (drawable);
@ -897,12 +919,12 @@ static void
init_gtk (void)
{
gchar **argv;
gint argc;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("pnm");
gtk_init (&argc, &argv);
gtk_rc_parse (gimp_gtkrc ());
}
@ -911,12 +933,7 @@ static gint
save_dialog (void)
{
GtkWidget *dlg;
GtkWidget *toggle;
GtkWidget *frame;
GtkWidget *toggle_vbox;
GSList *group;
gint use_raw = (psvals.raw == TRUE);
gint use_ascii = (psvals.raw == FALSE);
dlg = gimp_dialog_new (_("Save as PNM"), "pnm",
gimp_plugin_help_func, "filters/pnm.html",
@ -935,35 +952,17 @@ save_dialog (void)
NULL);
/* file save type */
frame = gtk_frame_new ( _("Data Formatting"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
frame = gimp_radio_group_new2 (TRUE, _("Data Formatting"),
gimp_radio_button_update,
&psvals.raw, (gpointer) psvals.raw,
_("Raw"), (gpointer) TRUE, NULL,
_("Ascii"), (gpointer) FALSE, NULL,
NULL);
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, FALSE, TRUE, 0);
toggle_vbox = gtk_vbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (toggle_vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), toggle_vbox);
group = NULL;
toggle = gtk_radio_button_new_with_label (group, _("Raw"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (save_toggle_update),
&use_raw);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), use_raw);
gtk_widget_show (toggle);
toggle = gtk_radio_button_new_with_label (group, _("Ascii"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
GTK_SIGNAL_FUNC (save_toggle_update),
&use_ascii);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), use_ascii);
gtk_widget_show (toggle);
gtk_widget_show (toggle_vbox);
gtk_widget_show (frame);
gtk_widget_show (dlg);
@ -971,14 +970,18 @@ save_dialog (void)
gtk_main ();
gdk_flush ();
if (use_raw)
psvals.raw = TRUE;
else
psvals.raw = FALSE;
return psint.run;
}
static void
save_ok_callback (GtkWidget *widget,
gpointer data)
{
psint.run = TRUE;
gtk_widget_destroy (GTK_WIDGET (data));
}
/**************** FILE SCANNER UTILITIES **************/
/* pnmscanner_create ---
@ -986,7 +989,7 @@ save_dialog (void)
* look ahead buffer is one character initially.
*/
static PNMScanner *
pnmscanner_create (int fd)
pnmscanner_create (gint fd)
{
PNMScanner *s;
@ -1012,7 +1015,7 @@ pnmscanner_destroy (PNMScanner *s)
*/
static void
pnmscanner_createbuffer (PNMScanner *s,
int bufsize)
gint bufsize)
{
s->inbuf = g_malloc(sizeof(char)*bufsize);
s->inbufsize = bufsize;
@ -1025,8 +1028,8 @@ pnmscanner_createbuffer (PNMScanner *s,
*/
static void
pnmscanner_gettoken (PNMScanner *s,
char *buf,
int bufsize)
gchar *buf,
gint bufsize)
{
int ctr=0;
@ -1094,28 +1097,3 @@ pnmscanner_eatwhitespace (PNMScanner *s)
}
}
}
/* Save interface functions */
static void
save_ok_callback (GtkWidget *widget,
gpointer data)
{
psint.run = TRUE;
gtk_widget_destroy (GTK_WIDGET (data));
}
static void
save_toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}

View file

@ -902,9 +902,12 @@ static gint
polarize_dialog (void)
{
GtkWidget *dialog;
GtkWidget *top_table;
GtkWidget *main_vbox;
GtkWidget *vbox;
GtkWidget *frame;
GtkWidget *table;
GtkWidget *abox;
GtkWidget *pframe;
GtkWidget *toggle;
GtkWidget *hbox;
GtkObject *adj;
@ -953,33 +956,49 @@ polarize_dialog (void)
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
top_table = gtk_table_new (3, 3, FALSE);
gtk_container_set_border_width (GTK_CONTAINER (top_table), 6);
gtk_table_set_row_spacings (GTK_TABLE (top_table), 4);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(dialog)->vbox), top_table,
FALSE, FALSE, 0);
gtk_widget_show (top_table);
/* Initialize Tooltips */
gimp_help_init ();
main_vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(dialog)->vbox), main_vbox,
FALSE, FALSE, 0);
gtk_widget_show (main_vbox);
/* Preview */
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_table_attach (GTK_TABLE (top_table), frame, 1, 2, 0, 1, 0, 0, 0, 0);
frame = gtk_frame_new (_("Preview"));
gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
abox = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
gtk_container_add (GTK_CONTAINER (frame), abox);
gtk_widget_show (abox);
pframe = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (pframe), GTK_SHADOW_IN);
gtk_container_set_border_width (GTK_CONTAINER (pframe), 4);
gtk_container_add (GTK_CONTAINER (abox), pframe);
gtk_widget_show (pframe);
pcint.preview = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_size (GTK_PREVIEW (pcint.preview), preview_width, preview_height);
gtk_container_add (GTK_CONTAINER (frame), pcint.preview);
gtk_container_add (GTK_CONTAINER (pframe), pcint.preview);
gtk_widget_show (pcint.preview);
/* Controls */
frame = gtk_frame_new (_("Parameter Settings"));
gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
gtk_widget_show (vbox);
table = gtk_table_new (2, 3, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_table_attach (GTK_TABLE (top_table), table, 0, 3, 1, 2,
GTK_EXPAND | GTK_FILL, 0, 0, 0);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
gtk_widget_show (table);
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
@ -1000,8 +1019,7 @@ polarize_dialog (void)
/* togglebuttons for backwards, top, polar->rectangular */
hbox = gtk_hbox_new (TRUE, 4);
gtk_table_attach (GTK_TABLE (top_table), hbox, 0, 3, 2, 3,
GTK_FILL, 0 , 0, 0);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
toggle = gtk_check_button_new_with_label (_("Map Backwards"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), pcvals.backwards);

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -286,13 +286,13 @@ typedef struct
/* Declare some local functions.
*/
static void query (void);
static void run (char *name,
int nparams,
static void run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals);
static gint32 load_image (char *filename);
static gint save_image (char *filename,
static gint32 load_image (gchar *filename);
static gint save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID);
@ -300,10 +300,10 @@ static gint save_image (char *filename,
*/
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
/* Save info */
@ -324,7 +324,7 @@ static PSPSaveVals psvals =
static PSPSaveInterface psint =
{
FALSE /* run */
FALSE /* run */
};
static guint16 major, minor;
@ -333,7 +333,7 @@ static guint tile_height;
MAIN()
static void
query ()
query (void)
{
static GParamDef load_args[] =
{
@ -345,8 +345,9 @@ query ()
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
/* static GParamDef save_args[] = */
/* { */
@ -358,7 +359,7 @@ query ()
/* { PARAM_INT32, "compression", "Specify 0 for no compression, " */
/* "1 for RLE, and 2 for LZ77" } */
/* }; */
/* static int nsave_args = sizeof (save_args) / sizeof (save_args[0]); */
/* static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]); */
INIT_I18N();
@ -394,27 +395,17 @@ query ()
save_args, NULL);
*/
gimp_register_magic_load_handler ("file_psp_load", "psp,tub", "",
gimp_register_magic_load_handler ("file_psp_load",
"psp,tub",
"",
"0,string,Paint Shop Pro Image File\n\032");
/* Removed until Saving is implemented -- njl195@zepler.org
gimp_register_save_handler ("file_psp_save", "psp,tub", "");
gimp_register_save_handler ("file_psp_save",
"psp,tub",
"");
*/
}
static void
save_toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}
static void
save_ok_callback (GtkWidget *widget,
gpointer data)
@ -428,10 +419,10 @@ static void
init_gtk (void)
{
gchar **argv;
gint argc;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("psp");
gtk_init (&argc, &argv);
@ -442,13 +433,7 @@ static gint
save_dialog (void)
{
GtkWidget *dlg;
GtkWidget *toggle;
GtkWidget *frame;
GtkWidget *toggle_vbox;
GSList *group;
gint use_none = (psvals.compression == PSP_COMP_NONE);
gint use_rle = (psvals.compression == PSP_COMP_RLE);
gint use_lz77 = (psvals.compression == PSP_COMP_LZ77);
dlg = gimp_dialog_new (_("Save as PSP"), "psp",
gimp_plugin_help_func, "filters/psp.html",
@ -467,43 +452,18 @@ save_dialog (void)
NULL);
/* file save type */
frame = gtk_frame_new (_("Data Compression"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
frame = gimp_radio_group_new2 (TRUE, _("Data Compression"),
gimp_radio_button_update,
&psvals.compression,
(gpointer) psvals.compression,
_("None"), (gpointer) PSP_COMP_NONE, NULL,
_("RLE"), (gpointer) PSP_COMP_RLE, NULL,
_("LZ77"), (gpointer) PSP_COMP_LZ77, NULL,
NULL);
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, FALSE, TRUE, 0);
toggle_vbox = gtk_vbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (toggle_vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), toggle_vbox);
group = NULL;
toggle = gtk_radio_button_new_with_label (group, _("None"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) save_toggle_update,
&use_none);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), use_none);
gtk_widget_show (toggle);
toggle = gtk_radio_button_new_with_label (group, _("RLE"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) save_toggle_update,
&use_rle);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), use_rle);
gtk_widget_show (toggle);
toggle = gtk_radio_button_new_with_label (group, _("LZ77"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) save_toggle_update,
&use_lz77);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), use_lz77);
gtk_widget_show (toggle);
gtk_widget_show (toggle_vbox);
gtk_widget_show (frame);
gtk_widget_show (dlg);
@ -511,21 +471,13 @@ save_dialog (void)
gtk_main ();
gdk_flush ();
if (use_none)
psvals.compression = PSP_COMP_NONE;
else if (use_rle)
psvals.compression = PSP_COMP_RLE;
else
psvals.compression = PSP_COMP_LZ77;
return psint.run;
}
static char *
block_name (int id)
static gchar *
block_name (gint id)
{
static char *block_names[] =
static gchar *block_names[] =
{
"IMAGE",
"CREATOR",
@ -551,8 +503,8 @@ block_name (int id)
return err_name;
}
static int
read_block_header (FILE *f,
static gint
read_block_header (FILE *f,
guint32 *init_len,
guint32 *total_len)
{
@ -602,13 +554,13 @@ read_block_header (FILE *f,
return id;
}
static int
read_general_image_attribute_block (FILE *f,
guint init_len,
guint total_len,
static gint
read_general_image_attribute_block (FILE *f,
guint init_len,
guint total_len,
PSPimage *ia)
{
char buf[6];
gchar buf[6];
#ifdef G_HAVE_GINT64
gint64 res[1];
#else
@ -692,8 +644,10 @@ read_general_image_attribute_block (FILE *f,
return 0;
}
static int
try_fseek (FILE *f, long pos, int whence)
static gint
try_fseek (FILE *f,
glong pos,
gint whence)
{
if (fseek (f, pos, whence) < 0)
{
@ -704,10 +658,10 @@ try_fseek (FILE *f, long pos, int whence)
return 0;
}
static int
read_creator_block (FILE *f,
gint image_ID,
guint total_len,
static gint
read_creator_block (FILE *f,
gint image_ID,
guint total_len,
PSPimage *ia)
{
long data_start;
@ -892,10 +846,10 @@ gimp_layer_mode_from_psp_blend_mode (PSPLayerBlendModes mode)
return -1;
}
static char *
static gchar *
blend_mode_name (PSPLayerBlendModes mode)
{
static char *blend_mode_names[] =
static gchar *blend_mode_names[] =
{
"NORMAL",
"DARKEN",
@ -926,10 +880,10 @@ blend_mode_name (PSPLayerBlendModes mode)
return err_name;
}
static char *
bitmap_type_name (int type)
static gchar *
bitmap_type_name (gint type)
{
static char *bitmap_type_names[] =
static gchar *bitmap_type_names[] =
{
"IMAGE",
"TRANS_MASK",
@ -949,8 +903,8 @@ bitmap_type_name (int type)
return err_name;
}
static char *
channel_type_name (int type)
static gchar *
channel_type_name (gint type)
{
static char *channel_type_names[] =
{
@ -971,25 +925,28 @@ channel_type_name (int type)
}
static void *
psp_zalloc (void *opaque, guint items, guint size)
psp_zalloc (void *opaque,
guint items,
guint size)
{
return g_malloc (items*size);
}
static void
psp_zfree (void *opaque, void *ptr)
psp_zfree (void *opaque,
void *ptr)
{
g_free (ptr);
}
static int
read_channel_data (FILE *f,
PSPimage *ia,
guchar **pixels,
guint bytespp,
guint offset,
GDrawable *drawable,
guint32 compressed_len)
read_channel_data (FILE *f,
PSPimage *ia,
guchar **pixels,
guint bytespp,
guint offset,
GDrawable *drawable,
guint32 compressed_len)
{
gint i, y, width = drawable->width, height = drawable->height;
gint npixels = width * height;
@ -1117,15 +1074,15 @@ read_channel_data (FILE *f,
return 0;
}
static int
read_layer_block (FILE *f,
gint image_ID,
guint total_len,
static gint
read_layer_block (FILE *f,
gint image_ID,
guint total_len,
PSPimage *ia)
{
int i;
gint i;
long block_start, sub_block_start, channel_start;
int sub_id;
gint sub_id;
guint32 sub_init_len, sub_total_len;
guchar *name;
guint16 namelen;
@ -1452,10 +1409,10 @@ read_layer_block (FILE *f,
return layer_ID;
}
static int
read_tube_block (FILE *f,
gint image_ID,
guint total_len,
static gint
read_tube_block (FILE *f,
gint image_ID,
guint total_len,
PSPimage *ia)
{
guint16 version;
@ -1528,8 +1485,8 @@ read_tube_block (FILE *f,
return 0;
}
static char *
compression_name (int compression)
static gchar *
compression_name (gint compression)
{
switch (compression)
{
@ -1546,7 +1503,7 @@ compression_name (int compression)
}
static gint32
load_image (char *filename)
load_image (gchar *filename)
{
FILE *f;
struct stat st;
@ -1727,37 +1684,37 @@ load_image (char *filename)
}
static gint
save_image (char *filename,
save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID)
{
g_message ("PSP: Saving not implemented yet");
return 0;
return FALSE;
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
GimpExportReturnType export = EXPORT_CANCEL;
gint32 image_ID;
gint32 drawable_ID;
tile_height = gimp_tile_height ();
run_mode = param[0].data.d_int32;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_psp_load") == 0)
{
@ -1766,13 +1723,12 @@ run (char *name,
if (image_ID != -1)
{
*nreturn_vals = 2;
values[0].data.d_status = STATUS_SUCCESS;
values[1].type = PARAM_IMAGE;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = STATUS_EXECUTION_ERROR;
}
}
else if (strcmp (name, "file_psp_save") == 0)
@ -1788,18 +1744,21 @@ run (char *name,
INIT_I18N_UI();
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "PSP",
(CAN_HANDLE_RGB | CAN_HANDLE_GRAY | CAN_HANDLE_INDEXED | CAN_HANDLE_ALPHA | CAN_HANDLE_LAYERS));
(CAN_HANDLE_RGB |
CAN_HANDLE_GRAY |
CAN_HANDLE_INDEXED |
CAN_HANDLE_ALPHA |
CAN_HANDLE_LAYERS));
if (export == EXPORT_CANCEL)
{
*nreturn_vals = 1;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
default:
break;
}
switch (run_mode)
{
case RUN_INTERACTIVE:
@ -1809,18 +1768,22 @@ run (char *name,
/* First acquire information with a dialog */
if (! save_dialog ())
return;
status = STATUS_CANCEL;
break;
case RUN_NONINTERACTIVE:
/* Make sure all the arguments are there! */
if (nparams != 6
|| param[5].data.d_int32 < 0
|| param[5].data.d_int32 > PSP_COMP_LZ77)
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS)
if (nparams != 6)
{
status = STATUS_CALLING_ERROR;
}
else
{
psvals.compression = (param[5].data.d_int32) ? TRUE : FALSE;
if (param[5].data.d_int32 < 0 ||
param[5].data.d_int32 > PSP_COMP_LZ77)
status = STATUS_CALLING_ERROR;
}
case RUN_WITH_LAST_VALS:
@ -1836,16 +1799,20 @@ run (char *name,
if (save_image (param[3].data.d_string, image_ID, drawable_ID))
{
gimp_set_data ("file_psp_save", &psvals, sizeof (PSPSaveVals));
status = STATUS_SUCCESS;
}
else
status = STATUS_EXECUTION_ERROR;
{
status = STATUS_EXECUTION_ERROR;
}
}
values[0].data.d_status = status;
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
else
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}

View file

@ -167,10 +167,10 @@ static void run (gchar *name,
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
static void randomize (GDrawable *drawable);
@ -181,10 +181,11 @@ static inline void randomize_prepare_row (GPixelRgn *pixel_rgn,
int y,
int w);
static gint randomize_dialog (void);
static void randomize_ok_callback (GtkWidget *widget,
gpointer data);
static gint randomize_dialog (void);
static void randomize_ok_callback (GtkWidget *widget,
gpointer data);
static void randomize_time_toggle_update (GtkWidget *widget,
gpointer data);
/************************************ Guts ***********************************/
@ -390,11 +391,11 @@ run (gchar *name,
* Initialize the rand() function seed
*/
if (pivals.seed_type == SEED_TIME)
srand(time(NULL));
else
srand(pivals.rndm_seed);
pivals.rndm_seed = time(NULL);
randomize(drawable);
srand (pivals.rndm_seed);
randomize (drawable);
/*
* If we ran interactively (even repeating) update the display.
*/
@ -694,23 +695,13 @@ randomize_dialog (void)
{
GtkWidget *dlg;
GtkWidget *frame;
GtkWidget *seed_hbox;
GtkWidget *seed_vbox;
GtkWidget *table;
GtkWidget *label;
GtkWidget *seed_hbox;
GtkWidget *spinbutton;
GtkObject *adj;
GtkWidget *radio_button;
GSList *group = NULL;
gchar **argv;
gint argc;
/*
* various initializations
*/
gint do_time = (pivals.seed_type == SEED_TIME);
gint do_user = (pivals.seed_type == SEED_USER);
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("randomize");
@ -734,6 +725,8 @@ randomize_dialog (void)
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
gimp_help_init ();
/*
* Parameter settings
*
@ -744,88 +737,24 @@ randomize_dialog (void)
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
table = gtk_table_new (4, 3, FALSE);
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_container_set_border_width (GTK_CONTAINER (table), 4);
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_widget_show(table);
gimp_help_init ();
/*
* Randomization seed initialization controls
*/
label = gtk_label_new (_("Randomization Seed:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
gtk_widget_show (label);
/*
* Box to hold seed initialization radio buttons
*/
seed_vbox = gtk_vbox_new (FALSE, 2);
gtk_table_attach (GTK_TABLE (table), seed_vbox, 1, 2, 1, 2,
GTK_FILL | GTK_EXPAND, GTK_FILL, 5, 0);
gtk_widget_show (seed_vbox);
/*
* Time button
*/
radio_button = gtk_radio_button_new_with_label (NULL, _("Current Time"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio_button));
gtk_box_pack_start (GTK_BOX (seed_vbox), radio_button, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (radio_button), "toggled",
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&do_time);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button), do_time);
gtk_widget_show (radio_button);
gimp_help_set_help_data (radio_button,
_("Seed random number generator from the current "
"time - this guarantees a reasonable "
"randomization"), NULL);
/*
* Box to hold seed user initialization controls
*/
seed_hbox = gtk_hbox_new (FALSE, 4);
gtk_box_pack_start (GTK_BOX (seed_vbox), seed_hbox, FALSE, FALSE, 0);
gtk_widget_show (seed_hbox);
/*
* User button
*/
radio_button = gtk_radio_button_new_with_label (group, _("Other Value"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (radio_button));
gtk_box_pack_start (GTK_BOX (seed_hbox), radio_button, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (radio_button), "toggled",
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&do_user);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button), do_user);
gtk_widget_show (radio_button);
gimp_help_set_help_data (radio_button,
_("Enable user-entered value for random number "
"generator seed - this allows you to repeat a "
"given \"random\" operation"), NULL);
/*
* Randomization seed number (text)
*/
spinbutton = gimp_spin_button_new (&adj, pivals.rndm_seed,
G_MININT, G_MAXINT, 1, 10, 0, 1, 0);
gtk_box_pack_start (GTK_BOX (seed_hbox), spinbutton, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
&pivals.rndm_seed);
gtk_widget_show (spinbutton);
gimp_help_set_help_data (spinbutton,
_("Value for seeding the random number generator"),
NULL);
gtk_widget_show (seed_hbox);
/* Random Seed */
seed_hbox = gimp_random_seed_new (&pivals.rndm_seed, &pivals.seed_type,
SEED_TIME, SEED_USER);
gimp_table_attach_aligned (GTK_TABLE (table), 0,
_("Random Seed:"), 1.0, 0.5,
seed_hbox, TRUE);
/*
* Randomization percentage label & scale (1 to 100)
*/
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
_("Randomization %:"), SCALE_WIDTH, 0,
pivals.rndm_pct, 1.0, 100.0, 1.0, 10.0, 0,
_("Percentage of pixels to be filtered"), NULL);
@ -836,7 +765,7 @@ randomize_dialog (void)
/*
* Repeat count label & scale (1 to 100)
*/
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 3,
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
_("Repeat:"), SCALE_WIDTH, 0,
pivals.rndm_rcount, 1.0, 100.0, 1.0, 10.0, 0,
_("Number of times to apply filter"), NULL);
@ -852,18 +781,6 @@ randomize_dialog (void)
gimp_help_free ();
gdk_flush ();
/*
* Figure out which type of seed initialization to apply.
*/
if (do_time)
{
pivals.seed_type = SEED_TIME;
}
else
{
pivals.seed_type = SEED_USER;
}
return rndm_int.run;
}
@ -875,3 +792,17 @@ randomize_ok_callback (GtkWidget *widget,
gtk_widget_destroy (GTK_WIDGET (data));
}
static void
randomize_time_toggle_update (GtkWidget *widget,
gpointer data)
{
gint *toggle_val;
toggle_val = (gint *) data;
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
*toggle_val = SEED_TIME;
else
*toggle_val = SEED_USER;
}

View file

@ -22,7 +22,6 @@
#include "config.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -32,14 +31,11 @@
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include <libgimp/gimpmath.h>
#include <libgimp/gimpcolorspace.h>
#include "libgimp/stdplugins-intl.h"
#ifndef RAND_MAX
#define RAND_MAX 2147483647
#endif /* RAND_MAX */
#define PLUG_IN_NAME "plug_in_scatter_hsv"
#define SHORT_NAME "scatter_hsv"
#define MAIN_FUNCTION scatter_hsv
@ -288,15 +284,15 @@ static int randomize_value (int now,
double rand_val;
steps = max - min + 1;
rand_val = ((double) rand()/(double)RAND_MAX);
rand_val = ((double) rand() / (double) G_MAXRAND);
for (index = 1; index < VALS.holdness; index++)
{
double tmp = ((double) rand()/(double)RAND_MAX);
double tmp = ((double) rand()/(double)G_MAXRAND);
if (tmp < rand_val)
rand_val = tmp;
}
flag = ((RAND_MAX / 2) < rand()) ? 1 : -1;
flag = ((G_MAXRAND / 2) < rand()) ? 1 : -1;
new = now + flag * ((int) (rand_max * rand_val) % steps);
if (new < min)
@ -360,10 +356,13 @@ DIALOG (void)
GtkWidget *dlg;
GtkWidget *vbox;
GtkWidget *frame;
GtkWidget *pframe;
GtkWidget *abox;
GtkWidget *table;
GtkObject *adj;
gchar **argv;
gint argc;
guchar *color_cube;
gchar **argv;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
@ -372,6 +371,16 @@ DIALOG (void)
gtk_init (&argc, &argv);
gtk_rc_parse (gimp_gtkrc ());
gdk_set_use_xshm (gimp_use_xshm ());
gtk_preview_set_gamma (gimp_gamma ());
gtk_preview_set_install_cmap (gimp_install_cmap ());
color_cube = gimp_color_cube ();
gtk_preview_set_color_cube (color_cube[0], color_cube[1],
color_cube[2], color_cube[3]);
gtk_widget_set_default_visual (gtk_preview_get_visual ());
gtk_widget_set_default_colormap (gtk_preview_get_cmap ());
dlg = gimp_dialog_new (_("Scatter HSV"), "scatter_hsv",
gimp_plugin_help_func, "filters/scatter_hsv.html",
GTK_WIN_POS_MOUSE,
@ -392,6 +401,44 @@ DIALOG (void)
gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dlg)->vbox), vbox);
frame = gtk_frame_new (_("Preview (1:4) - Right Click to Jump"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
abox = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
gtk_container_add (GTK_CONTAINER (frame), abox);
gtk_widget_show (abox);
pframe = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (pframe), GTK_SHADOW_IN);
gtk_container_set_border_width (GTK_CONTAINER (pframe), 4);
gtk_container_add (GTK_CONTAINER (abox), pframe);
gtk_widget_show (pframe);
preview = gtk_preview_new (GTK_PREVIEW_COLOR);
{
gint width = gimp_drawable_width (drawable_id);
gint height = gimp_drawable_height (drawable_id);
preview_width = (PREVIEW_WIDTH < width) ? PREVIEW_WIDTH : width;
preview_height = (PREVIEW_HEIGHT < height) ? PREVIEW_HEIGHT : height;
}
gtk_preview_size (GTK_PREVIEW (preview), preview_width * 2, preview_height);
scatter_hsv_preview_update ();
gtk_container_add (GTK_CONTAINER (pframe), preview);
gtk_widget_set_events (preview,
GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK |
GDK_BUTTON_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK);
gtk_signal_connect (GTK_OBJECT (preview), "event",
(GtkSignalFunc) preview_event_handler,
NULL);
gtk_widget_show (preview);
gtk_widget_show (frame);
frame = gtk_frame_new (_("Parameter Settings"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
@ -439,47 +486,6 @@ DIALOG (void)
gtk_widget_show (table);
gtk_widget_show (frame);
frame = gtk_frame_new (_("Preview (1:4) - Right Click to Jump"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
/* preparation for preview */
gdk_set_use_xshm (gimp_use_xshm ());
gtk_preview_set_gamma (gimp_gamma ());
gtk_preview_set_install_cmap (gimp_install_cmap ());
{
guchar *color_cube;
color_cube = gimp_color_cube ();
gtk_preview_set_color_cube (color_cube[0], color_cube[1],
color_cube[2], color_cube[3]);
}
gtk_widget_set_default_visual (gtk_preview_get_visual ());
gtk_widget_set_default_colormap (gtk_preview_get_cmap ());
preview = gtk_preview_new (GTK_PREVIEW_COLOR);
{
gint width = gimp_drawable_width (drawable_id);
gint height = gimp_drawable_height (drawable_id);
preview_width = (PREVIEW_WIDTH < width) ? PREVIEW_WIDTH : width;
preview_height = (PREVIEW_HEIGHT < height) ? PREVIEW_HEIGHT : height;
}
gtk_preview_size (GTK_PREVIEW (preview), preview_width * 2, preview_height);
scatter_hsv_preview_update ();
gtk_container_add (GTK_CONTAINER (frame), preview);
gtk_widget_set_events (preview,
GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK |
GDK_BUTTON_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK);
gtk_signal_connect (GTK_OBJECT (preview), "event",
(GtkSignalFunc) preview_event_handler,
NULL);
gtk_widget_show (preview);
gtk_widget_show (frame);
gtk_widget_show (vbox);
gtk_widget_show (dlg);

View file

@ -384,6 +384,7 @@ static gint
dialog (void)
{
GtkWidget *dlg;
GtkWidget *frame;
GtkWidget *table;
GtkWidget *spinbutton;
GtkObject *adj;
@ -413,13 +414,18 @@ dialog (void)
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
table = gtk_table_new (3, 2, FALSE);
gtk_container_set_border_width (GTK_CONTAINER (table), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), table, TRUE, TRUE, 0);
gtk_widget_show (table);
frame = gtk_frame_new (_("Parameter Settings"));
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
table = gtk_table_new (3, 2, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_container_set_border_width (GTK_CONTAINER (table), 4);
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_widget_show (table);
spinbutton = gimp_spin_button_new (&adj, config.width,
1, GIMP_MAX_IMAGE_SIZE, 1, 10, 0, 1, 0);

View file

@ -75,21 +75,17 @@
/*---- Defines ----*/
#ifndef RAND_MAX
#define RAND_MAX 2147483647
#endif /* RAND_MAX */
#define TABLE_SIZE 64
#define WEIGHT(T) ((2.0*fabs(T)-3.0)*(T)*(T)+1.0)
#define ENTRY_WIDTH 40
#define SCALE_WIDTH 128
#define SCALE_MAX 16.0
#define SCALE_MAX 16.0
/*---- Typedefs ----*/
typedef struct {
typedef struct
{
gint tilable;
gint turbulent;
gint seed;
@ -100,61 +96,69 @@ typedef struct {
gint timeseed;
} SolidNoiseValues;
typedef struct {
typedef struct
{
gint run;
} SolidNoiseInterface;
typedef struct {
double x, y;
typedef struct
{
gdouble x, y;
} Vector2d;
/*---- Prototypes ----*/
static void query (void);
static void run (char *name, int nparams, GParam *param,
int *nreturn_vals, GParam **return_vals);
static void run (gchar *name,
gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals);
static void solid_noise (GDrawable *drawable);
static void solid_noise_init (void);
static double plain_noise (double x, double y, unsigned int s);
static double noise (double x, double y);
static void solid_noise (GDrawable *drawable);
static void solid_noise_init (void);
static gdouble plain_noise (gdouble x,
gdouble y,
guint s);
static gdouble noise (gdouble x,
gdouble y);
static gint solid_noise_dialog (void);
static void dialog_toggle_update (GtkWidget *widget, gpointer data);
static void dialog_entry_callback (GtkWidget *widget, gpointer data);
static void dialog_scale_callback (GtkAdjustment *adjustment, gdouble *value);
static void dialog_ok_callback (GtkWidget *widget, gpointer data);
static gint solid_noise_dialog (void);
static void dialog_ok_callback (GtkWidget *widget,
gpointer data);
/*---- Variables ----*/
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
run, /* run_proc */
};
static SolidNoiseValues snvals = {
0, /* tilable */
0, /* turbulent */
1, /* seed */
1, /* detail */
4.0, /* xsize */
4.0, /* ysize */
static SolidNoiseValues snvals =
{
0, /* tilable */
0, /* turbulent */
1, /* seed */
1, /* detail */
4.0, /* xsize */
4.0, /* ysize */
0 /* use time seed */
};
static SolidNoiseInterface snint = {
static SolidNoiseInterface snint =
{
FALSE /* run */
};
static int xclip, yclip;
static double offset, factor;
static double xsize, ysize;
static int perm_tab[TABLE_SIZE];
static gint xclip, yclip;
static gdouble offset, factor;
static gdouble xsize, ysize;
static gint perm_tab[TABLE_SIZE];
static Vector2d grad_tab[TABLE_SIZE];
@ -162,7 +166,6 @@ static Vector2d grad_tab[TABLE_SIZE];
MAIN()
static void
query (void)
{
@ -201,7 +204,10 @@ query (void)
static void
run (char *name, int nparams, GParam *param, int *nreturn_vals,
run (gchar *name,
gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[1];
@ -223,46 +229,47 @@ run (char *name, int nparams, GParam *param, int *nreturn_vals,
drawable = gimp_drawable_get (param[2].data.d_drawable);
/* See how we will run */
switch (run_mode) {
case RUN_INTERACTIVE:
INIT_I18N_UI();
/* Possibly retrieve data */
gimp_get_data("plug_in_solid_noise", &snvals);
switch (run_mode)
{
case RUN_INTERACTIVE:
INIT_I18N_UI();
/* Possibly retrieve data */
gimp_get_data("plug_in_solid_noise", &snvals);
/* Get information from the dialog */
if (!solid_noise_dialog ())
return;
/* Get information from the dialog */
if (!solid_noise_dialog ())
return;
break;
break;
case RUN_NONINTERACTIVE:
INIT_I18N();
/* Test number of arguments */
if (nparams == 9)
{
snvals.tilable = param[3].data.d_int32;
snvals.turbulent = param[4].data.d_int32;
snvals.seed = param[5].data.d_int32;
snvals.detail = param[6].data.d_int32;
snvals.xsize = param[7].data.d_float;
snvals.ysize = param[8].data.d_float;
}
else
status = STATUS_CALLING_ERROR;
break;
case RUN_NONINTERACTIVE:
INIT_I18N();
/* Test number of arguments */
if (nparams == 9) {
snvals.tilable = param[3].data.d_int32;
snvals.turbulent = param[4].data.d_int32;
snvals.seed = param[5].data.d_int32;
snvals.detail = param[6].data.d_int32;
snvals.xsize = param[7].data.d_float;
snvals.ysize = param[8].data.d_float;
case RUN_WITH_LAST_VALS:
INIT_I18N();
/* Possibly retrieve data */
gimp_get_data("plug_in_solid_noise", &snvals);
break;
default:
break;
}
else
status = STATUS_CALLING_ERROR;
break;
case RUN_WITH_LAST_VALS:
INIT_I18N();
/* Possibly retrieve data */
gimp_get_data("plug_in_solid_noise", &snvals);
break;
default:
break;
}
/* Create texture */
if ((status == STATUS_SUCCESS) && (gimp_drawable_is_rgb (drawable->id) ||
gimp_drawable_is_gray (drawable->id)))
gimp_drawable_is_gray (drawable->id)))
{
/* Set the tile cache size */
gimp_tile_cache_ntiles((drawable->width + gimp_tile_width() - 1) / gimp_tile_width());
@ -276,18 +283,18 @@ run (char *name, int nparams, GParam *param, int *nreturn_vals,
/* Store data */
if (run_mode==RUN_INTERACTIVE || run_mode==RUN_WITH_LAST_VALS)
gimp_set_data("plug_in_solid_noise", &snvals,
sizeof(SolidNoiseValues));
gimp_set_data ("plug_in_solid_noise", &snvals,
sizeof (SolidNoiseValues));
}
else
{
/* gimp_message ("solid noise: cannot operate on indexed color images"); */
status = STATUS_EXECUTION_ERROR;
}
values[0].data.d_status = status;
gimp_drawable_detach(drawable);
gimp_drawable_detach (drawable);
}
@ -315,10 +322,11 @@ solid_noise (GDrawable *drawable)
max_progress = sel_width * sel_height;
chns = gimp_drawable_bpp (drawable->id);
has_alpha = 0;
if (gimp_drawable_has_alpha (drawable->id)) {
chns--;
has_alpha = 1;
}
if (gimp_drawable_has_alpha (drawable->id))
{
chns--;
has_alpha = 1;
}
gimp_pixel_rgn_init (&dest_rgn, drawable, sel_x1, sel_y1, sel_width,
sel_height, TRUE, TRUE);
@ -359,8 +367,8 @@ solid_noise (GDrawable *drawable)
static void
solid_noise_init (void)
{
int i, j, k, t;
double m;
gint i, j, k, t;
gdouble m;
/* Force sane parameters */
if (snvals.detail < 0)
@ -376,58 +384,71 @@ solid_noise_init (void)
srand (snvals.seed);
/* Set scaling factors */
if (snvals.tilable) {
xsize = ceil (snvals.xsize);
ysize = ceil (snvals.ysize);
xclip = (int) xsize;
yclip = (int) ysize;
}
else {
xsize = snvals.xsize;
ysize = snvals.ysize;
}
if (snvals.tilable)
{
xsize = ceil (snvals.xsize);
ysize = ceil (snvals.ysize);
xclip = (int) xsize;
yclip = (int) ysize;
}
else
{
xsize = snvals.xsize;
ysize = snvals.ysize;
}
/* Set totally empiric normalization values */
if (snvals.turbulent) {
offset=0.0;
factor=1.0;
}
else {
offset=0.94;
factor=0.526;
}
if (snvals.turbulent)
{
offset=0.0;
factor=1.0;
}
else
{
offset=0.94;
factor=0.526;
}
/* Initialize the permutation table */
for (i = 0; i < TABLE_SIZE; i++)
perm_tab[i] = i;
for (i = 0; i < (TABLE_SIZE >> 1); i++) {
j = rand () % TABLE_SIZE;
k = rand () % TABLE_SIZE;
t = perm_tab[j];
perm_tab[j] = perm_tab[k];
perm_tab[k] = t;
}
for (i = 0; i < (TABLE_SIZE >> 1); i++)
{
j = rand () % TABLE_SIZE;
k = rand () % TABLE_SIZE;
t = perm_tab[j];
perm_tab[j] = perm_tab[k];
perm_tab[k] = t;
}
/* Initialize the gradient table */
for (i = 0; i < TABLE_SIZE; i++) {
do {
grad_tab[i].x = (double)(rand () - (RAND_MAX >> 1)) / (RAND_MAX >> 1);
grad_tab[i].y = (double)(rand () - (RAND_MAX >> 1)) / (RAND_MAX >> 1);
m = grad_tab[i].x * grad_tab[i].x + grad_tab[i].y * grad_tab[i].y;
} while (m == 0.0 || m > 1.0);
m = 1.0 / sqrt(m);
grad_tab[i].x *= m;
grad_tab[i].y *= m;
}
for (i = 0; i < TABLE_SIZE; i++)
{
do
{
grad_tab[i].x =
(double)(rand () - (G_MAXRAND >> 1)) / (G_MAXRAND >> 1);
grad_tab[i].y =
(double)(rand () - (G_MAXRAND >> 1)) / (G_MAXRAND >> 1);
m = grad_tab[i].x * grad_tab[i].x + grad_tab[i].y * grad_tab[i].y;
}
while (m == 0.0 || m > 1.0);
m = 1.0 / sqrt(m);
grad_tab[i].x *= m;
grad_tab[i].y *= m;
}
}
static double
plain_noise (double x, double y, unsigned int s)
static gdouble
plain_noise (gdouble x,
gdouble y,
guint s)
{
Vector2d v;
int a, b, i, j, n;
double sum;
gint a, b, i, j, n;
gdouble sum;
sum = 0.0;
x *= s;
@ -436,40 +457,43 @@ plain_noise (double x, double y, unsigned int s)
b = (int) floor (y);
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++) {
if (snvals.tilable)
n = perm_tab[(((a + i) % (xclip * s)) + perm_tab[((b + j) % (yclip * s)) % TABLE_SIZE]) % TABLE_SIZE];
else
n = perm_tab[(a + i + perm_tab[(b + j) % TABLE_SIZE]) % TABLE_SIZE];
v.x = x - a - i;
v.y = y - b - j;
sum += WEIGHT(v.x) * WEIGHT(v.y) * (grad_tab[n].x * v.x + grad_tab[n].y * v.y);
}
for (j = 0; j < 2; j++)
{
if (snvals.tilable)
n = perm_tab[(((a + i) % (xclip * s)) + perm_tab[((b + j) % (yclip * s)) % TABLE_SIZE]) % TABLE_SIZE];
else
n = perm_tab[(a + i + perm_tab[(b + j) % TABLE_SIZE]) % TABLE_SIZE];
v.x = x - a - i;
v.y = y - b - j;
sum += WEIGHT(v.x) * WEIGHT(v.y) * (grad_tab[n].x * v.x + grad_tab[n].y * v.y);
}
return sum / s;
}
static double
noise (double x, double y)
static gdouble
noise (gdouble x,
gdouble y)
{
int i;
unsigned int s;
double sum;
gint i;
guint s;
gdouble sum;
s = 1;
sum = 0.0;
x *= xsize;
y *= ysize;
for (i = 0; i <= snvals.detail; i++) {
if (snvals.turbulent)
sum += fabs (plain_noise (x, y, s));
else
sum += plain_noise (x, y, s);
s <<= 1;
}
for (i = 0; i <= snvals.detail; i++)
{
if (snvals.turbulent)
sum += fabs (plain_noise (x, y, s));
else
sum += plain_noise (x, y, s);
s <<= 1;
}
return (sum+offset)*factor;
}
@ -478,17 +502,14 @@ static gint
solid_noise_dialog (void)
{
GtkWidget *dlg;
GtkWidget *frame;
GtkWidget *toggle;
GtkWidget *table;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *seed_hbox;
GtkWidget *time_button;
GtkWidget *scale;
GtkObject *scale_data;
GtkWidget *spinbutton;
GtkObject *adj;
gchar **argv;
gint argc;
gchar buffer[32];
/* Set args */
argc = 1;
@ -515,164 +536,85 @@ solid_noise_dialog (void)
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
gimp_help_init ();
frame = gtk_frame_new (_("Parameter Settings"));
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
/* Table */
table = gtk_table_new (4, 3, FALSE);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_container_set_border_width (GTK_CONTAINER (table), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), table, TRUE, TRUE, 0);
gtk_container_set_border_width (GTK_CONTAINER (table), 4);
gtk_container_add (GTK_CONTAINER (frame), table);
/* Entry #1 */
label = gtk_label_new ( _("Seed:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
GTK_FILL, GTK_FILL, 1, 0);
gtk_widget_show (label);
/* Random Seed */
seed_hbox = gimp_random_seed_new (&snvals.seed, &snvals.timeseed,
TRUE, FALSE);
gimp_table_attach_aligned (GTK_TABLE (table), 0,
_("Random Seed:"), 1.0, 0.5,
seed_hbox, TRUE);
seed_hbox = gtk_hbox_new (FALSE, 4);
gtk_table_attach (GTK_TABLE (table), seed_hbox, 1, 2, 0, 1,
GTK_FILL, GTK_FILL, 0, 0);
entry = gtk_entry_new ();
gtk_box_pack_start (GTK_BOX (seed_hbox), entry, TRUE, TRUE, 0);
gtk_widget_set_usize (entry, ENTRY_WIDTH, 0);
g_snprintf (buffer, sizeof (buffer), "%d", snvals.seed);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) dialog_entry_callback,
&snvals.seed);
gtk_widget_show (entry);
time_button = gtk_toggle_button_new_with_label ( _("Time"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(time_button), snvals.timeseed);
gtk_signal_connect (GTK_OBJECT (time_button), "toggled",
(GtkSignalFunc) dialog_toggle_update,
&snvals.timeseed);
gtk_box_pack_end (GTK_BOX (seed_hbox), time_button, FALSE, FALSE, 0);
gtk_widget_show (time_button);
gtk_widget_show (seed_hbox);
/* Entry #2 */
label = gtk_label_new (_("Detail:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
GTK_FILL, GTK_FILL, 1, 0);
gtk_widget_show (label);
entry = gtk_entry_new ();
gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_set_usize (entry, ENTRY_WIDTH, 0);
sprintf(buffer, "%d", snvals.detail);
gtk_entry_set_text (GTK_ENTRY (entry), buffer);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) dialog_entry_callback,
/* Detail */
spinbutton = gimp_spin_button_new (&adj, snvals.detail,
1, 15, 1, 3, 0, 1, 0);
gimp_table_attach_aligned (GTK_TABLE (table), 1,
_("Detail:"), 1.0, 0.5,
spinbutton, TRUE);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_int_adjustment_update),
&snvals.detail);
gtk_widget_show (entry);
/* Check button #1 */
/* Turbulent */
toggle = gtk_check_button_new_with_label ( _("Turbulent"));
gtk_table_attach (GTK_TABLE (table), toggle, 2, 3, 0, 1,
GTK_EXPAND | GTK_FILL, GTK_FILL, 1, 0);
GTK_SHRINK | GTK_FILL, GTK_FILL, 1, 0);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), snvals.turbulent);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) dialog_toggle_update,
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&snvals.turbulent);
gtk_widget_show (toggle);
/* Check button #2 */
/* Tilable */
toggle = gtk_check_button_new_with_label ( _("Tilable"));
gtk_table_attach (GTK_TABLE (table), toggle, 2, 3, 1, 2,
GTK_EXPAND | GTK_FILL, GTK_FILL, 1, 0);
GTK_SHRINK | GTK_FILL, GTK_FILL, 1, 0);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), snvals.tilable);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) dialog_toggle_update,
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&snvals.tilable);
gtk_widget_show (toggle);
/* Scale #1 */
label = gtk_label_new ( _("X Size:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
GTK_FILL, GTK_FILL, 1, 0);
gtk_widget_show (label);
scale_data = gtk_adjustment_new (snvals.xsize, 0.1, SCALE_MAX,
0.1, 0.1, 0.0);
scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data));
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_table_attach (GTK_TABLE (table), scale, 1, 3, 2, 3,
GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
gtk_scale_set_digits (GTK_SCALE (scale), 1);
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (scale_data), "value_changed",
(GtkSignalFunc) dialog_scale_callback,
/* X Size */
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
_("X Size:"), SCALE_WIDTH, 0,
snvals.xsize, 0.1, SCALE_MAX, 0.1, 1.0, 1,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&snvals.xsize);
gtk_widget_show (scale);
/* Scale #2 */
label = gtk_label_new ( _("Y Size:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 1.0);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 3, 4,
GTK_FILL, GTK_FILL, 1, 0);
gtk_widget_show (label);
scale_data = gtk_adjustment_new (snvals.ysize, 0.1, SCALE_MAX,
0.1, 0.1, 0.0);
scale = gtk_hscale_new (GTK_ADJUSTMENT (scale_data));
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_table_attach (GTK_TABLE (table), scale, 1, 3, 3, 4,
GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_TOP);
gtk_scale_set_digits (GTK_SCALE (scale), 1);
gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (scale_data), "value_changed",
(GtkSignalFunc) dialog_scale_callback,
/* Y Size */
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 3,
_("Y Size:"), SCALE_WIDTH, 0,
snvals.ysize, 0.1, SCALE_MAX, 0.1, 1.0, 1,
NULL, NULL);
gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
GTK_SIGNAL_FUNC (gimp_double_adjustment_update),
&snvals.ysize);
gtk_widget_show (scale);
gtk_widget_show (table);
gtk_widget_show (dlg);
gtk_main ();
gimp_help_free ();
gdk_flush ();
return snint.run;
}
static void
dialog_toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}
static void
dialog_entry_callback (GtkWidget *widget,
gpointer data)
{
gint *text_val;
text_val = (gint *) data;
*text_val = atoi (gtk_entry_get_text (GTK_ENTRY (widget)));
}
static void
dialog_scale_callback (GtkAdjustment *adjustment,
gdouble *value)
{
*value = adjustment->value;
}
static void
dialog_ok_callback (GtkWidget *widget,
gpointer data)

View file

@ -30,7 +30,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
@ -766,10 +765,10 @@ sparkle (GDrawable *drawable,
{
/* major spikes */
if (svals.spike_angle == -1)
spike_angle = 360.0 * rand () / RAND_MAX;
spike_angle = 360.0 * rand () / G_MAXRAND;
else
spike_angle = svals.spike_angle;
if (rand() <= RAND_MAX * svals.density)
if (rand() <= G_MAXRAND * svals.density)
{
fspike (&src_rgn, &dest_rgn, gray, x1, y1, x2, y2,
x + src_rgn.x, y + src_rgn.y,
@ -948,21 +947,22 @@ fspike (GPixelRgn *src_rgn,
}
if (svals.random_hue > 0.0 || svals.random_saturation > 0.0)
{
r = 255 - color[0];
g = 255 - color[1];
b = 255 - color[2];
gimp_rgb_to_hsv(&r, &g, &b);
r+= (svals.random_hue * ((gdouble) rand() / (gdouble) RAND_MAX - 0.5))*255;
if (r >= 255)
r -= 255;
else if (r < 0)
r += 255;
b+= (svals.random_saturation * (2.0 * (gdouble) rand() /
(gdouble) RAND_MAX - 1.0))*255; if (b > 255) b = 255;
gimp_hsv_to_rgb(&r, &g, &b);
color[0] = 255 - r;
color[1] = 255 - g;
color[2] = 255 - b;
r = 255 - color[0];
g = 255 - color[1];
b = 255 - color[2];
gimp_rgb_to_hsv (&r, &g, &b);
r+= (svals.random_hue * ((gdouble) rand() / (gdouble) RAND_MAX - 0.5))*255;
if (r >= 255)
r -= 255;
else if (r < 0)
r += 255;
b+= (svals.random_saturation * (2.0 * (gdouble) rand() /
(gdouble) RAND_MAX - 1.0))*255;
if (b > 255) b = 255;
gimp_hsv_to_rgb (&r, &g, &b);
color[0] = 255 - r;
color[1] = 255 - g;
color[2] = 255 - b;
}
dx = 0.2 * cos (theta * G_PI / 180.0);

View file

@ -985,7 +985,7 @@ void imagepixel(vector *q, vector *col, texture *t)
double frand(double v)
{
return (RAND_FUNC() / (double)RAND_MAX - 0.5) * v;
return (RAND_FUNC() / (double) G_MAXRAND - 0.5) * v;
}
int traceray(ray *r, vector *col, int level, double imp);

File diff suppressed because it is too large Load diff

View file

@ -85,6 +85,7 @@
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include "libgimp/stdplugins-intl.h"
/* Round up a division to the nearest integer. */
@ -102,7 +103,7 @@ static TgaSaveVals tsvals =
typedef struct _TgaSaveInterface
{
unsigned char run;
gint run;
} TgaSaveInterface;
static TgaSaveInterface tsint =
@ -166,14 +167,14 @@ static struct
/* Declare some local functions.
*/
static void query (void);
static void run (char *name,
int nparams,
static void run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals);
static gint32 load_image (char *filename);
static gint save_image (char *filename,
static gint32 load_image (gchar *filename);
static gint save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID);
@ -181,15 +182,13 @@ static void init_gtk (void);
static gint save_dialog (void);
static void save_ok_callback (GtkWidget *widget,
gpointer data);
static void save_toggle_update (GtkWidget *widget,
gpointer data);
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
@ -200,7 +199,7 @@ static int verbose = VERBOSE;
#endif
static void
query ()
query (void)
{
static GParamDef load_args[] =
{
@ -212,9 +211,9 @@ query ()
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
@ -225,7 +224,7 @@ query ()
{ PARAM_STRING, "raw_filename", "The name of the file to save the image in" },
{ PARAM_INT32, "rle", "Enable RLE compression" },
} ;
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -241,7 +240,6 @@ query ()
nload_args, nload_return_vals,
load_args, load_return_vals);
gimp_install_procedure ("file_tga_save",
_("saves files in the Targa file format"),
"FIXME: write help for tga_save",
@ -254,24 +252,27 @@ query ()
nsave_args, 0,
save_args, NULL);
gimp_register_magic_load_handler ("file_tga_load", "tga", "",
gimp_register_magic_load_handler ("file_tga_load",
"tga",
"",
"0&,byte,10,2&,byte,1,3&,byte,>0,3,byte,<9");
gimp_register_save_handler ("file_tga_save", "tga", "");
gimp_register_save_handler ("file_tga_save",
"tga",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GStatusType status = STATUS_SUCCESS;
GRunModeType run_mode;
gint32 image_ID;
gint32 drawable_ID;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 image_ID;
gint32 drawable_ID;
GimpExportReturnType export = EXPORT_CANCEL;
#ifdef PROFILE
@ -281,9 +282,9 @@ run (char *name,
run_mode = param[0].data.d_int32;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
#ifdef VERBOSE
if (verbose)
@ -293,43 +294,45 @@ run (char *name,
if (strcmp (name, "file_tga_load") == 0)
{
INIT_I18N();
#ifdef PROFILE
times (&tbuf1);
#endif
image_ID = load_image (param[1].data.d_string);
if (image_ID != -1)
{
*nreturn_vals = 2;
values[0].data.d_status = STATUS_SUCCESS;
values[1].type = PARAM_IMAGE;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image_ID;
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = STATUS_EXECUTION_ERROR;
}
}
else if (strcmp (name, "file_tga_save") == 0)
{
INIT_I18N_UI();
init_gtk ();
image_ID = param[1].data.d_int32;
drawable_ID = param[2].data.d_int32;
/* eventually export the image */
switch (run_mode)
{
case RUN_INTERACTIVE:
case RUN_WITH_LAST_VALS:
export = gimp_export_image (&image_ID, &drawable_ID, "TGA",
(CAN_HANDLE_RGB | CAN_HANDLE_GRAY | CAN_HANDLE_INDEXED |
(CAN_HANDLE_RGB |
CAN_HANDLE_GRAY |
CAN_HANDLE_INDEXED |
CAN_HANDLE_ALPHA));
if (export == EXPORT_CANCEL)
{
*nreturn_vals = 1;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
@ -345,15 +348,16 @@ run (char *name,
/* First acquire information with a dialog */
if (! save_dialog ())
return;
status = STATUS_CANCEL;
break;
case RUN_NONINTERACTIVE:
/* Make sure all the arguments are there! */
if (nparams != 6)
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS)
{
status = STATUS_CALLING_ERROR;
}
else
{
tsvals.rle = (param[5].data.d_int32) ? TRUE : FALSE;
}
@ -371,20 +375,29 @@ run (char *name,
#ifdef PROFILE
times (&tbuf1);
#endif
*nreturn_vals = 1;
if (save_image (param[3].data.d_string, image_ID, drawable_ID))
{
/* Store psvals data */
gimp_set_data ("file_tga_save", &tsvals, sizeof (tsvals));
values[0].data.d_status = STATUS_SUCCESS;
if (status == STATUS_SUCCESS)
{
if (save_image (param[3].data.d_string, image_ID, drawable_ID))
{
/* Store psvals data */
gimp_set_data ("file_tga_save", &tsvals, sizeof (tsvals));
}
else
{
status = STATUS_EXECUTION_ERROR;
}
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
}
else
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
#ifdef PROFILE
times (&tbuf2);
@ -394,10 +407,12 @@ run (char *name,
#endif
}
static gint32 ReadImage (FILE *fp, struct tga_header *hdr, char *filename);
static gint32 ReadImage (FILE *fp,
struct tga_header *hdr,
gchar *filename);
static gint32
load_image (char *filename)
load_image (gchar *filename)
{
FILE *fp;
char * name_buf;
@ -406,8 +421,9 @@ load_image (char *filename)
gint32 image_ID = -1;
fp = fopen (filename, "rb");
if (!fp) {
printf ("TGA: can't open \"%s\"\n", filename);
if (!fp)
{
g_message ("TGA: can't open \"%s\"\n", filename);
return -1;
}
@ -419,7 +435,7 @@ load_image (char *filename)
if (fseek (fp, 0L - (sizeof (tga_footer)), SEEK_END)
|| fread (&tga_footer, sizeof (tga_footer), 1, fp) != 1)
{
printf ("TGA: Cannot read footer from \"%s\"\n", filename);
g_message ("TGA: Cannot read footer from \"%s\"\n", filename);
return -1;
}
@ -436,15 +452,16 @@ load_image (char *filename)
#endif
if (fseek (fp, 0, SEEK_SET) ||
fread (&hdr, sizeof (hdr), 1, fp) != 1) {
printf("TGA: Cannot read header from \"%s\"\n", filename);
return -1;
}
fread (&hdr, sizeof (hdr), 1, fp) != 1)
{
g_message ("TGA: Cannot read header from \"%s\"\n", filename);
return -1;
}
/* Skip the image ID field. */
if (hdr.idLength && fseek (fp, hdr.idLength, SEEK_CUR))
{
printf ("TGA: Cannot skip ID field in \"%s\"\n", filename);
g_message ("TGA: Cannot skip ID field in \"%s\"\n", filename);
return -1;
}
@ -1153,7 +1170,7 @@ ReadImage (FILE *fp,
static gint
save_image (char *filename,
save_image (gchar *filename,
gint32 image_ID,
gint32 drawable_ID)
{
@ -1230,10 +1247,11 @@ save_image (char *filename,
hdr.heightLo = (height & 0xff);
hdr.heightHi = (height >> 8);
if((fp = fopen(filename, "wb")) == NULL) {
printf("TGA: can't create \"%s\"\n", filename);
return FALSE;
}
if((fp = fopen(filename, "wb")) == NULL)
{
g_message ("TGA: can't create \"%s\"\n", filename);
return FALSE;
}
/* Mark our save ID. */
hdr.idLength = strlen (SAVE_ID_STRING);
@ -1250,7 +1268,7 @@ save_image (char *filename,
cmap = gimp_image_get_cmap (image_ID, &colors);
if (colors > 256)
{
printf ("TGA: cannot handle colormap with more than 256 colors (got %d)\n", colors);
g_message ("TGA: cannot handle colormap with more than 256 colors (got %d)\n", colors);
return FALSE;
}
@ -1408,21 +1426,21 @@ save_image (char *filename,
gimp_progress_update ((double) (i + tileheight) / (double) height);
}
gimp_drawable_detach(drawable);
gimp_drawable_detach (drawable);
g_free (data);
fclose(fp);
fclose (fp);
return status;
}
static void
init_gtk ()
init_gtk (void)
{
gchar **argv;
gint argc;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("tga");
gtk_init (&argc, &argv);
@ -1454,19 +1472,20 @@ save_dialog (void)
NULL);
/* regular tga parameter settings */
frame = gtk_frame_new ( _("Targa Options"));
frame = gtk_frame_new (_("Targa Options"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
vbox = gtk_vbox_new (FALSE, 2);
gtk_container_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
/* rle */
toggle = gtk_check_button_new_with_label ( _("RLE compression"));
toggle = gtk_check_button_new_with_label (_("RLE compression"));
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) save_toggle_update,
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&tsvals.rle);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), tsvals.rle);
gtk_widget_show (toggle);
@ -1482,26 +1501,11 @@ save_dialog (void)
return tsint.run;
}
/* Save interface functions */
static void
save_ok_callback (GtkWidget *widget,
gpointer data)
{
tsint.run = TRUE;
gtk_widget_destroy (GTK_WIDGET (data));
}
static void
save_toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}

View file

@ -31,13 +31,15 @@
** other special, indirect and consequential damages.
*/
#include "config.h"
#include <stdlib.h>
#include <string.h>
#include <tiffio.h>
#include "config.h"
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include "libgimp/stdplugins-intl.h"
typedef struct
@ -51,72 +53,102 @@ typedef struct
gint run;
} TiffSaveInterface;
typedef struct {
gint32 ID;
typedef struct
{
gint32 ID;
GDrawable *drawable;
GPixelRgn pixel_rgn;
guchar *pixels;
guchar *pixel;
GPixelRgn pixel_rgn;
guchar *pixels;
guchar *pixel;
} channel_data;
/* Declare some local functions.
*/
static void query (void);
static void run (char *name,
int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals);
static gint32 load_image (char *filename);
static void query (void);
static void run (gchar *name,
gint nparams,
GParam *param,
gint *nreturn_vals,
GParam **return_vals);
static void load_rgba (TIFF *tif, channel_data *channel);
static void load_lines (TIFF *tif, channel_data *channel,
unsigned short bps, unsigned short photomet,
int alpha, int extra);
static void load_tiles (TIFF *tif, channel_data *channel,
unsigned short bps, unsigned short photomet,
int alpha, int extra);
static gint32 load_image (gchar *filename);
static void read_separate (guchar *source, channel_data *channel,
unsigned short bps, unsigned short photomet,
int startcol, int startrow, int rows, int cols,
int alpha, int extra, int sample);
static void read_16bit (guchar *source, channel_data *channel,
unsigned short photomet,
int startcol, int startrow, int rows, int cols,
int alpha, int extra);
static void read_8bit (guchar *source, channel_data *channel,
unsigned short photomet,
int startcol, int startrow, int rows, int cols,
int alpha, int extra);
static void read_default (guchar *source, channel_data *channel,
unsigned short bps, unsigned short photomet,
int startcol, int startrow, int rows, int cols,
int alpha, int extra);
static void load_rgba (TIFF *tif,
channel_data *channel);
static void load_lines (TIFF *tif,
channel_data *channel,
gushort bps,
gushort photomet,
gint alpha,
gint extra);
static void load_tiles (TIFF *tif,
channel_data *channel,
gushort bps,
gushort photomet,
gint alpha,
gint extra);
static gint save_image (char *filename,
gint32 image,
gint32 drawable,
gint32 orig_image);
static void read_separate (guchar *source,
channel_data *channel,
gushort bps,
gushort photomet,
gint startcol,
gint startrow,
gint rows,
gint cols,
gint alpha,
gint extra,
gint sample);
static void read_16bit (guchar *source,
channel_data *channel,
gushort photomet,
gint startcol,
gint startrow,
gint rows,
gint cols,
gint alpha,
gint extra);
static void read_8bit (guchar *source,
channel_data *channel,
gushort photomet,
gint startcol,
gint startrow,
gint rows,
gint cols,
gint alpha,
gint extra);
static void read_default (guchar *source,
channel_data *channel,
gushort bps,
gushort photomet,
gint startcol,
gint startrow,
gint rows,
gint cols,
gint alpha,
gint extra);
static void init_gtk ();
static gint save_dialog ();
static gint save_image (gchar *filename,
gint32 image,
gint32 drawable,
gint32 orig_image);
static void save_ok_callback (GtkWidget *widget,
gpointer data);
static void save_toggle_update (GtkWidget *widget,
gpointer data);
static void comment_entry_callback (GtkWidget *widget,
gpointer data);
static void init_gtk (void);
static gint save_dialog (void);
static void save_ok_callback (GtkWidget *widget,
gpointer data);
static void comment_entry_callback (GtkWidget *widget,
gpointer data);
#define DEFAULT_COMMENT "Created with The GIMP"
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
static TiffSaveVals tsvals =
@ -126,7 +158,7 @@ static TiffSaveVals tsvals =
static TiffSaveInterface tsint =
{
FALSE /* run */
FALSE /* run */
};
static char *image_comment= NULL;
@ -134,7 +166,7 @@ static char *image_comment= NULL;
MAIN ()
static void
query ()
query (void)
{
static GParamDef load_args[] =
{
@ -146,8 +178,9 @@ query ()
{
{ PARAM_IMAGE, "image", "Output image" },
};
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
static int nload_return_vals = sizeof (load_return_vals) / sizeof (load_return_vals[0]);
static gint nload_args = sizeof (load_args) / sizeof (load_args[0]);
static gint nload_return_vals = (sizeof (load_return_vals) /
sizeof (load_return_vals[0]));
static GParamDef save_args[] =
{
@ -158,7 +191,7 @@ query ()
{ PARAM_STRING, "raw_filename", "The name of the file to save the image in" },
{ PARAM_INT32, "compression", "Compression type: { NONE (0), LZW (1), PACKBITS (2)" },
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
static gint nsave_args = sizeof (save_args) / sizeof (save_args[0]);
INIT_I18N();
@ -186,38 +219,39 @@ query ()
nsave_args, 0,
save_args, NULL);
gimp_register_magic_load_handler ("file_tiff_load", "tif,tiff", "",
"0,string,II*\\0,0,string,MM\\0*");
gimp_register_save_handler ("file_tiff_save", "tif,tiff", "");
gimp_register_magic_load_handler ("file_tiff_load",
"tif,tiff",
"",
"0,string,II*\\0,0,string,MM\\0*");
gimp_register_save_handler ("file_tiff_save",
"tif,tiff",
"");
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[2];
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
#ifdef GIMP_HAVE_PARASITES
Parasite *parasite;
Parasite *parasite;
#endif /* GIMP_HAVE_PARASITES */
gint32 image;
gint32 drawable;
gint32 orig_image;
gint32 image;
gint32 drawable;
gint32 orig_image;
GimpExportReturnType export = EXPORT_CANCEL;
run_mode = param[0].data.d_int32;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (strcmp (name, "file_tiff_load") == 0)
{
@ -227,13 +261,12 @@ run (char *name,
if (image != -1)
{
*nreturn_vals = 2;
values[0].data.d_status = STATUS_SUCCESS;
values[1].type = PARAM_IMAGE;
values[1].type = PARAM_IMAGE;
values[1].data.d_image = image;
}
else
{
values[0].data.d_status = STATUS_EXECUTION_ERROR;
status = STATUS_EXECUTION_ERROR;
}
}
else if (strcmp (name, "file_tiff_save") == 0)
@ -241,23 +274,24 @@ run (char *name,
image = orig_image = param[1].data.d_int32;
drawable = param[2].data.d_int32;
/* Do this right this time, if POSSIBLE query for parasites, otherwise
or if there isn't one, choose the DEFAULT_COMMENT */
/* Do this right this time, if POSSIBLE query for parasites, otherwise
or if there isn't one, choose the DEFAULT_COMMENT */
/* eventually export the image */
switch (run_mode)
{
case RUN_INTERACTIVE:
case RUN_WITH_LAST_VALS:
INIT_I18N_UI();
INIT_I18N_UI();
init_gtk ();
export = gimp_export_image (&image, &drawable, "TIFF",
(CAN_HANDLE_RGB | CAN_HANDLE_GRAY | CAN_HANDLE_INDEXED |
(CAN_HANDLE_RGB |
CAN_HANDLE_GRAY |
CAN_HANDLE_INDEXED |
CAN_HANDLE_ALPHA));
if (export == EXPORT_CANCEL)
{
*nreturn_vals = 1;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = STATUS_CANCEL;
return;
}
break;
@ -266,42 +300,44 @@ run (char *name,
}
#ifdef GIMP_HAVE_PARASITES
parasite = gimp_image_parasite_find (orig_image, "gimp-comment");
if (parasite)
image_comment = g_strdup (parasite->data);
parasite_free(parasite);
parasite_free (parasite);
#endif /* GIMP_HAVE_PARASITES */
if (!image_comment) image_comment = g_strdup (DEFAULT_COMMENT);
if (!image_comment)
image_comment = g_strdup (DEFAULT_COMMENT);
switch (run_mode)
{
case RUN_INTERACTIVE:
{
/* Possibly retrieve data */
gimp_get_data ("file_tiff_save", &tsvals);
#ifdef GIMP_HAVE_PARASITES
parasite = gimp_image_parasite_find (orig_image, "tiff-save-options");
if (parasite)
{
tsvals.compression = ((TiffSaveVals *)parasite->data)->compression;
tsvals.compression =
((TiffSaveVals *) parasite->data)->compression;
}
parasite_free(parasite);
parasite_free (parasite);
#endif /* GIMP_HAVE_PARASITES */
/* First acquire information with a dialog */
if (! save_dialog ())
return;
}
break;
status = STATUS_CANCEL;
break;
case RUN_NONINTERACTIVE:
INIT_I18N();
INIT_I18N();
/* Make sure all the arguments are there! */
if (nparams != 6)
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS)
{
status = STATUS_CALLING_ERROR;
}
else
{
switch (param[5].data.d_int32)
{
@ -314,41 +350,49 @@ run (char *name,
case RUN_WITH_LAST_VALS:
/* Possibly retrieve data */
{
gimp_get_data ("file_tiff_save", &tsvals);
#ifdef GIMP_HAVE_PARASITES
parasite = gimp_image_parasite_find (orig_image, "tiff-save-options");
if (parasite)
{
tsvals.compression = ((TiffSaveVals *)parasite->data)->compression;
tsvals.compression =
((TiffSaveVals *) parasite->data)->compression;
}
parasite_free (parasite);
#endif /* GIMP_HAVE_PARASITES */
}
break;
default:
break;
}
*nreturn_vals = 1;
if (save_image (param[3].data.d_string, image, drawable, orig_image))
if (status == STATUS_SUCCESS)
{
/* Store mvals data */
gimp_set_data ("file_tiff_save", &tsvals, sizeof (TiffSaveVals));
values[0].data.d_status = STATUS_SUCCESS;
if (save_image (param[3].data.d_string, image, drawable, orig_image))
{
/* Store mvals data */
gimp_set_data ("file_tiff_save", &tsvals, sizeof (TiffSaveVals));
}
else
{
status = STATUS_EXECUTION_ERROR;
}
}
else
values[0].data.d_status = STATUS_EXECUTION_ERROR;
if (export == EXPORT_EXPORT)
gimp_image_delete (image);
}
else
{
status = STATUS_CALLING_ERROR;
}
values[0].data.d_status = status;
}
static gint32
load_image (char *filename)
static gint32
load_image (gchar *filename)
{
TIFF *tif;
unsigned short bps, spp, photomet;
@ -497,8 +541,8 @@ load_image (char *filename)
/* any resolution info in the file? */
#ifdef GIMP_HAVE_RESOLUTION_INFO
{
float xres = 72.0, yres = 72.0;
unsigned short read_unit;
gfloat xres = 72.0, yres = 72.0;
gushort read_unit;
GUnit unit = UNIT_PIXEL; /* invalid unit */
if (TIFFGetField (tif, TIFFTAG_XRESOLUTION, &xres)) {
@ -526,6 +570,7 @@ load_image (char *filename)
default:
g_message ("TIFF file error: unknown resolution unit type %d, "
"assuming dpi\n", read_unit);
break;
}
}
else
@ -534,7 +579,7 @@ load_image (char *filename)
g_message ("TIFF warning: resolution specified without\n"
"any units tag, assuming dpi\n");
}
}
}
else
{ /* xres but no yres */
g_message("TIFF warning: no y resolution info, assuming same as x\n");
@ -1374,12 +1419,12 @@ static void
init_gtk (void)
{
gchar **argv;
gint argc;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("tiff");
gtk_init (&argc, &argv);
gtk_rc_parse (gimp_gtkrc ());
}
@ -1388,17 +1433,11 @@ static gint
save_dialog (void)
{
GtkWidget *dlg;
GtkWidget *toggle;
GtkWidget *vbox;
GtkWidget *frame;
GtkWidget *toggle_vbox;
GtkWidget *hbox;
GtkWidget *label;
GtkWidget *entry;
GSList *group;
gint use_none = (tsvals.compression == COMPRESSION_NONE);
gint use_lzw = (tsvals.compression == COMPRESSION_LZW);
gint use_packbits = (tsvals.compression == COMPRESSION_PACKBITS);
dlg = gimp_dialog_new ( _("Save as TIFF"), "tiff",
gimp_plugin_help_func, "filters/tiff.html",
@ -1416,61 +1455,27 @@ save_dialog (void)
GTK_SIGNAL_FUNC (gtk_main_quit),
NULL);
/* hbox for compression and fillorder settings */
hbox = gtk_hbox_new (FALSE, 6);
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), vbox, FALSE, TRUE, 0);
/* compression */
frame = gtk_frame_new ( _("Compression"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, FALSE, 0);
frame =
gimp_radio_group_new2 (TRUE, _("Compression"),
gimp_radio_button_update,
&tsvals.compression, (gpointer) tsvals.compression,
toggle_vbox = gtk_vbox_new (FALSE, 2);
gtk_container_set_border_width (GTK_CONTAINER (toggle_vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), toggle_vbox);
_("None"), (gpointer) COMPRESSION_NONE, NULL,
_("LZW"), (gpointer) COMPRESSION_LZW, NULL,
_("Pack Bits"), (gpointer) COMPRESSION_PACKBITS, NULL,
group = NULL;
toggle = gtk_radio_button_new_with_label (group, _("None"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) save_toggle_update,
&use_none);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), use_none);
gtk_widget_show (toggle);
toggle = gtk_radio_button_new_with_label (group, _("LZW"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) save_toggle_update,
&use_lzw);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), use_lzw);
gtk_widget_show (toggle);
toggle = gtk_radio_button_new_with_label (group, _("Pack Bits"));
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) save_toggle_update,
&use_packbits);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), use_packbits);
gtk_widget_show (toggle);
gtk_widget_show (toggle_vbox);
NULL);
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
gtk_widget_show (frame);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), hbox, FALSE, TRUE, 0);
gtk_widget_show (hbox);
/* comment entry */
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, FALSE, TRUE, 0);
hbox = gtk_hbox_new (FALSE, 4);
gtk_container_add (GTK_CONTAINER (frame), hbox);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
label = gtk_label_new ( _("Comment:"));
@ -1482,29 +1487,20 @@ save_dialog (void)
gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
gtk_entry_set_text (GTK_ENTRY (entry), image_comment);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) comment_entry_callback,
GTK_SIGNAL_FUNC (comment_entry_callback),
NULL);
gtk_widget_show (frame);
gtk_widget_show (vbox);
gtk_widget_show (dlg);
gtk_main ();
gdk_flush ();
if (use_none)
tsvals.compression = COMPRESSION_NONE;
else if (use_lzw)
tsvals.compression = COMPRESSION_LZW;
else if (use_packbits)
tsvals.compression = COMPRESSION_PACKBITS;
return tsint.run;
}
/* Save interface functions */
static void
save_ok_callback (GtkWidget *widget,
gpointer data)
@ -1513,29 +1509,15 @@ save_ok_callback (GtkWidget *widget,
gtk_widget_destroy (GTK_WIDGET (data));
}
static void
save_toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}
static void
comment_entry_callback (GtkWidget *widget,
gpointer data)
{
int len;
char *text;
gint len;
gchar *text;
text = gtk_entry_get_text (GTK_ENTRY (widget));
len = strlen(text);
len = strlen (text);
/* Temporary kludge for overlength strings - just return */
if (len > 240)

View file

@ -19,90 +19,89 @@
/*
* This filter tiles an image to arbitrary width and height
*/
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "config.h"
#include <gtk/gtk.h>
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include "libgimp/stdplugins-intl.h"
#define ENTRY_WIDTH 60
#define ENTRY_HEIGHT 25
typedef struct {
typedef struct
{
gint new_width;
gint new_height;
gint constrain;
gint new_image;
} TileVals;
typedef struct {
GtkWidget *width_entry;
GtkWidget *height_entry;
gint orig_width;
gint orig_height;
gint new_image;
gint run;
typedef struct
{
GtkObject *width_adj;
GtkObject *height_adj;
gint orig_width;
gint orig_height;
gint run;
} TileInterface;
/* Declare a local function.
*/
static void query (void);
static void run (char *name,
int nparams,
static void run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals);
static gint32 tile (gint32 image_id,
gint32 drawable_id,
gint32 *layer_id);
static gint tile_dialog (gint width,
gint height);
static void tile_ok_callback (GtkWidget *widget,
gpointer data);
static void tile_toggle_update (GtkWidget *widget,
gpointer data);
static void tile_entry_update (GtkWidget *widget,
gpointer data);
static gint tile_dialog (gint width,
gint height);
static void tile_ok_callback (GtkWidget *widget,
gpointer data);
static void tile_chain_button_update (GtkWidget *widget,
gpointer data);
static void tile_adjustment_update (GtkAdjustment *adjustment,
gpointer data);
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
static TileVals tvals =
{
1, /* new_width */
1, /* new_height */
TRUE, /* constrain */
TRUE /* new_image */
1, /* new_width */
1, /* new_height */
TRUE, /* constrain */
TRUE /* new_image */
};
static TileInterface tint =
{
NULL, /* width_entry */
NULL, /* height_entry */
0, /* orig_width */
0, /* orig_height */
TRUE, /* new_image */
FALSE /* run */
NULL, /* width_adj */
NULL, /* height_adj */
0, /* orig_width */
0, /* orig_height */
FALSE /* run */
};
MAIN ()
static void
query ()
query (void)
{
static GParamDef args[] =
{
@ -118,8 +117,8 @@ query ()
{ PARAM_IMAGE, "new_image", "Output image (N/A if new_image == FALSE)" },
{ PARAM_LAYER, "new_layer", "Output layer (N/A if new_image == FALSE)" },
};
static int nargs = sizeof (args) / sizeof (args[0]);
static int nreturn_vals = sizeof (return_vals) / sizeof (return_vals[0]);
static gint nargs = sizeof (args) / sizeof (args[0]);
static gint nreturn_vals = sizeof (return_vals) / sizeof (return_vals[0]);
INIT_I18N();
@ -137,17 +136,17 @@ query ()
}
static void
run (char *name,
int nparams,
run (gchar *name,
gint nparams,
GParam *param,
int *nreturn_vals,
gint *nreturn_vals,
GParam **return_vals)
{
static GParam values[3];
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 new_layer;
gint width, height;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gint32 new_layer;
gint width, height;
run_mode = param[0].data.d_int32;
@ -225,9 +224,9 @@ run (char *name,
}
static gint32
tile (gint32 image_id,
gint32 drawable_id,
gint32 *layer_id)
tile (gint32 image_id,
gint32 drawable_id,
gint32 *layer_id)
{
GPixelRgn src_rgn, dest_rgn;
GDrawable *drawable, *new_layer;
@ -264,7 +263,8 @@ tile (gint32 image_id,
break;
}
new_image_id = gimp_image_new (tvals.new_width, tvals.new_height, image_type);
new_image_id = gimp_image_new (tvals.new_width, tvals.new_height,
image_type);
*layer_id = gimp_layer_new (new_image_id, _("Background"),
tvals.new_width, tvals.new_height,
gimp_drawable_type (drawable_id),
@ -277,9 +277,7 @@ tile (gint32 image_id,
}
else
{
gimp_run_procedure ("gimp_undo_push_group_start", &nreturn_vals,
PARAM_IMAGE, image_id,
PARAM_END);
gimp_undo_push_group_start (image_id);
gimp_run_procedure ("gimp_image_resize", &nreturn_vals,
PARAM_IMAGE, image_id,
@ -368,11 +366,11 @@ static gint
tile_dialog (gint width, gint height)
{
GtkWidget *dlg;
GtkWidget *label;
GtkWidget *toggle;
GtkWidget *frame;
GtkWidget *table;
gchar buffer[12];
GtkWidget *spinbutton;
GtkWidget *chain;
GtkWidget *toggle;
gchar **argv;
gint argc;
@ -383,9 +381,9 @@ tile_dialog (gint width, gint height)
gtk_init (&argc, &argv);
gtk_rc_parse (gimp_gtkrc ());
tint.orig_width = width;
tint.orig_width = width;
tint.orig_height = height;
tvals.new_width = width;
tvals.new_width = width;
tvals.new_height = height;
dlg = gimp_dialog_new ( _("Tile"), "tile",
@ -405,65 +403,49 @@ tile_dialog (gint width, gint height)
NULL);
/* parameter settings */
frame = gtk_frame_new ( _("Tile to New Size"));
frame = gtk_frame_new (_("Tile to New Size"));
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
table = gtk_table_new (4, 2, FALSE);
table = gtk_table_new (3, 3, FALSE);
gtk_container_set_border_width (GTK_CONTAINER (table), 4);
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
label = gtk_label_new ( _("Width:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label);
tint.width_entry = gtk_entry_new ();
gtk_widget_set_usize (tint.width_entry, ENTRY_WIDTH, ENTRY_HEIGHT);
g_snprintf (buffer, sizeof (buffer), "%d", width);
gtk_entry_set_text (GTK_ENTRY (tint.width_entry), buffer);
gtk_table_attach (GTK_TABLE (table), tint.width_entry,
1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
gtk_signal_connect (GTK_OBJECT (tint.width_entry), "changed",
(GtkSignalFunc) tile_entry_update,
spinbutton = gimp_spin_button_new (&tint.width_adj, width,
1, width, 1, 10, 0, 1, 0);
gimp_table_attach_aligned (GTK_TABLE (table), 0,
_("Width:"), 1.0, 0.5,
spinbutton, FALSE);
gtk_signal_connect (GTK_OBJECT (tint.width_adj), "value_changed",
GTK_SIGNAL_FUNC (tile_adjustment_update),
&tvals.new_width);
gtk_widget_show (tint.width_entry);
label = gtk_label_new ( _("Height:"));
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
GTK_FILL, GTK_FILL, 0, 0);
gtk_widget_show (label);
tint.height_entry = gtk_entry_new ();
gtk_widget_set_usize (tint.height_entry, ENTRY_WIDTH, ENTRY_HEIGHT);
g_snprintf (buffer, sizeof (buffer), "%d", height);
gtk_entry_set_text (GTK_ENTRY (tint.height_entry), buffer);
gtk_table_attach (GTK_TABLE (table), tint.height_entry,
1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
gtk_signal_connect (GTK_OBJECT (tint.height_entry), "changed",
(GtkSignalFunc) tile_entry_update,
spinbutton = gimp_spin_button_new (&tint.height_adj, height,
1, height, 1, 10, 0, 1, 0);
gimp_table_attach_aligned (GTK_TABLE (table), 1,
_("Height:"), 1.0, 0.5,
spinbutton, FALSE);
gtk_signal_connect (GTK_OBJECT (tint.height_adj), "value_changed",
GTK_SIGNAL_FUNC (tile_adjustment_update),
&tvals.new_height);
gtk_widget_show (tint.height_entry);
toggle = gtk_check_button_new_with_label ( _("Constrain Ratio"));
gtk_table_attach (GTK_TABLE (table), toggle, 0, 2, 2, 3,
chain = gimp_chain_button_new (GIMP_CHAIN_RIGHT);
gimp_chain_button_set_active (GIMP_CHAIN_BUTTON (chain), tvals.constrain);
gtk_table_attach (GTK_TABLE (table), chain, 2, 3, 0, 2,
GTK_SHRINK, GTK_FILL | GTK_EXPAND, 0, 0);
gtk_signal_connect (GTK_OBJECT (GIMP_CHAIN_BUTTON (chain)->button), "clicked",
GTK_SIGNAL_FUNC (tile_chain_button_update),
chain);
gtk_widget_show (chain);
toggle = gtk_check_button_new_with_label (_("New Image"));
gtk_table_attach (GTK_TABLE (table), toggle, 0, 3, 2, 3,
GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) tile_toggle_update,
&tvals.constrain);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), tvals.constrain);
gtk_widget_show (toggle);
toggle = gtk_check_button_new_with_label ( _("New Image"));
gtk_table_attach (GTK_TABLE (table), toggle, 0, 2, 3, 4,
GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) tile_toggle_update,
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
&tvals.new_image);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), tvals.new_image);
gtk_widget_show (toggle);
@ -486,55 +468,63 @@ tile_ok_callback (GtkWidget *widget,
gpointer data)
{
tint.run = TRUE;
gtk_widget_destroy (GTK_WIDGET (data));
}
static void
tile_toggle_update (GtkWidget *widget,
gpointer data)
tile_chain_button_update (GtkWidget *widget,
gpointer data)
{
gint *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
tvals.constrain = gimp_chain_button_get_active (GIMP_CHAIN_BUTTON (data));
}
static void
tile_entry_update (GtkWidget *widget,
gpointer data)
tile_adjustment_update (GtkAdjustment *adjustment,
gpointer data)
{
static gchar buf[32];
gint val;
val = atoi (gtk_entry_get_text (GTK_ENTRY (widget)));
val = (gint) adjustment->value;
if (tvals.constrain)
{
if ((tint.orig_width != 0) && (tint.orig_height != 0))
{
if (widget == tint.width_entry && tvals.new_width != val)
if ((GtkObject *) adjustment == tint.width_adj &&
tvals.new_width != val)
{
tvals.new_width = val;
tvals.new_height = (int) ((tvals.new_width * tint.orig_height) / tint.orig_width);
sprintf (buf, "%d", tvals.new_height);
gtk_entry_set_text (GTK_ENTRY (tint.height_entry), buf);
tvals.new_height = (int) ((tvals.new_width * tint.orig_height) /
tint.orig_width);
gtk_signal_handler_block_by_data (GTK_OBJECT (tint.height_adj),
&tvals.new_height);
gtk_adjustment_set_value (GTK_ADJUSTMENT (tint.height_adj),
tvals.new_height);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (tint.height_adj),
&tvals.new_height);
}
else if (widget == tint.height_entry && tvals.new_height != val)
else if ((GtkObject *) adjustment == tint.height_adj &&
tvals.new_height != val)
{
tvals.new_height = val;
tvals.new_width = (int) ((tvals.new_height * tint.orig_width) / tint.orig_height);
sprintf (buf, "%d", tvals.new_width);
gtk_entry_set_text (GTK_ENTRY (tint.width_entry), buf);
tvals.new_width = (int) ((tvals.new_height * tint.orig_width) /
tint.orig_height);
gtk_signal_handler_block_by_data (GTK_OBJECT (tint.width_adj),
&tvals.new_width);
gtk_adjustment_set_value (GTK_ADJUSTMENT (tint.width_adj),
tvals.new_width);
gtk_signal_handler_unblock_by_data (GTK_OBJECT (tint.width_adj),
&tvals.new_width);
}
}
}
else
*((int *) data) = val;
{
*((int *) data) = val;
}
}

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