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:
parent
7a8b15754b
commit
fa30ba04c7
138 changed files with 15463 additions and 16195 deletions
62
ChangeLog
62
ChangeLog
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
921
app/fileops.c
921
app/fileops.c
File diff suppressed because it is too large
Load diff
|
|
@ -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__ */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
17
app/menus.c
17
app/menus.c
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,8 @@ typedef enum
|
|||
PDB_EXECUTION_ERROR,
|
||||
PDB_CALLING_ERROR,
|
||||
PDB_PASS_THROUGH,
|
||||
PDB_SUCCESS
|
||||
PDB_SUCCESS,
|
||||
PDB_CANCEL
|
||||
} PDBStatusType;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@ endif
|
|||
|
||||
SUBDIRS = \
|
||||
libgck \
|
||||
megawidget \
|
||||
dbbrowser \
|
||||
script-fu \
|
||||
$(GIMP_PERL) \
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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) \
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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, '.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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, '.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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])
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
|
||||
|
|
|
|||
|
|
@ -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", >mvals);
|
||||
|
||||
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", >mvals, sizeof (GTMValues));
|
||||
}
|
||||
else
|
||||
{
|
||||
status = STATUS_EXECUTION_ERROR;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
status = STATUS_CANCEL;
|
||||
}
|
||||
|
||||
gimp_set_data ("file_GTM_save", >mvals, 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),
|
||||
>mvals.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),
|
||||
>mvals.spantags);
|
||||
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
|
||||
>mvals.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),
|
||||
>mvals.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),
|
||||
>mvals.caption);
|
||||
GTK_SIGNAL_FUNC (gimp_toggle_button_update),
|
||||
>mvals.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),
|
||||
>mvals.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),
|
||||
>mvals.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),
|
||||
>mvals.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));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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, '.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 ());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 },
|
||||
|
|
|
|||
|
|
@ -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$".
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
3027
plug-ins/common/ps.c
3027
plug-ins/common/ps.c
File diff suppressed because it is too large
Load diff
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in a new issue