update my entry. I maintain newsprint.

Sat Jan 22 22:14:18 GMT 2000  Austin Donnelly  <austin@gimp.org>

	* MAINTAINERS: update my entry.
	* PLUGIN_MAINTAINERS: I maintain newsprint.

	* app/fuzzy_select.c: fix so if you move the pointer back to
	   where you started, the selection is also the same.  Can people
	   (tigert?) give this a spin - if it isn't as intuitive as the
	   old way we should roll this back.

	* plug-ins/common/jpeg.c: use volatile to get rid of "clobber"
	   warnings from GCC.  Also, fix handling of multiple COM
	   sections, so can load images such as
	   /usr/share/pixmaps/backgrounds/space/clem_full_moon_strtrk.jpg or
	   /usr/share/pixmaps/backgrounds/space/apollo08_earthrise.jpg
	   which used to segv the jpeg plugin.

	* plug-ins/common/newsprint.c: update my email address.

	* plug-ins/common/ps.c: applied gimp-kirchgessner-000116-0.patch:
	   save using PostScript level 2 features which result in files
	   60% smaller than naive level 1 method.  Peter added a
	   checkbutton to the UI to revert to level 1 algorithm, but we
	   default to level 2.  Almost everyone should have a level 2
	   printer, new printers and ghostscript are level 3 these days.
This commit is contained in:
GMT 2000 Austin Donnelly 2000-01-22 22:26:20 +00:00 committed by Austin Donnelly
parent c605469daa
commit c5c95ff976
17 changed files with 746 additions and 190 deletions

View File

@ -1,3 +1,29 @@
Sat Jan 22 22:14:18 GMT 2000 Austin Donnelly <austin@gimp.org>
* MAINTAINERS: update my entry.
* PLUGIN_MAINTAINERS: I maintain newsprint.
* app/fuzzy_select.c: fix so if you move the pointer back to
where you started, the selection is also the same. Can people
(tigert?) give this a spin - if it isn't as intuitive as the
old way we should roll this back.
* plug-ins/common/jpeg.c: use volatile to get rid of "clobber"
warnings from GCC. Also, fix handling of multiple COM
sections, so can load images such as
/usr/share/pixmaps/backgrounds/space/clem_full_moon_strtrk.jpg or
/usr/share/pixmaps/backgrounds/space/apollo08_earthrise.jpg
which used to segv the jpeg plugin.
* plug-ins/common/newsprint.c: update my email address.
* plug-ins/common/ps.c: applied gimp-kirchgessner-000116-0.patch:
save using PostScript level 2 features which result in files
60% smaller than naive level 1 method. Peter added a
checkbutton to the UI to revert to level 1 algorithm, but we
default to level 2. Almost everyone should have a level 2
printer, new printers and ghostscript are level 3 these days.
Sat Jan 22 21:38:08 CET 2000 Sven Neumann <sven@gimp.org>
* app/gimpdnd.c: corrected off-by-one error in color dnd

View File

@ -34,7 +34,7 @@ Name: Austin Donnelly
Email: austin@gimp.org
url: http://www.cl.cam.ac.uk/~and1000/
ircnick: austin
expertise: resolution stuff, modules, colour selectors, fonts
expertise: resolution stuff, modules, colour selectors, fonts, PostScript
current work: random bug fixes, resolution
commit access: yes

View File

@ -580,7 +580,7 @@ COMMENT :
-----------
NAME : newsprint
AUTHOR : Austin Donnelly
MAINTAINER :
MAINTAINER : Austin Donnelly <austin@gimp.org>
SIZE : 64.7 kB in 1 file (only C files counted)
COMMENT :
-----------

View File

@ -45,8 +45,9 @@ struct _FuzzySelect
int op; /* selection operation (ADD, SUB, etc) */
int x, y; /* Point from which to execute seed fill */
int last_x; /* */
int last_y; /* variables to keep track of sensitivity */
int first_x; /* */
int first_y; /* variables to keep track of sensitivity */
double first_threshold; /* initial value of threshold slider */
};
@ -390,8 +391,9 @@ fuzzy_select_button_press (Tool *tool,
fuzzy_sel->x = bevent->x;
fuzzy_sel->y = bevent->y;
fuzzy_sel->last_x = fuzzy_sel->x;
fuzzy_sel->last_y = fuzzy_sel->y;
fuzzy_sel->first_x = fuzzy_sel->x;
fuzzy_sel->first_y = fuzzy_sel->y;
fuzzy_sel->first_threshold = fuzzy_options->threshold;
gdk_pointer_grab (gdisp->canvas->window, FALSE,
GDK_POINTER_MOTION_HINT_MASK |
@ -465,23 +467,21 @@ fuzzy_select_motion (Tool *tool,
FuzzySelect * fuzzy_sel;
GdkSegment * new_segs;
int num_new_segs;
int diff, diff_x, diff_y;
int diff_x, diff_y;
double diff;
if (tool->state != ACTIVE)
return;
fuzzy_sel = (FuzzySelect *) tool->private;
diff_x = mevent->x - fuzzy_sel->last_x;
diff_y = mevent->y - fuzzy_sel->last_y;
diff_x = mevent->x - fuzzy_sel->first_x;
diff_y = mevent->y - fuzzy_sel->first_y;
diff = ((ABS (diff_x) > ABS (diff_y)) ? diff_x : diff_y) / 2;
fuzzy_sel->last_x = mevent->x;
fuzzy_sel->last_y = mevent->y;
diff = ((ABS (diff_x) > ABS (diff_y)) ? diff_x : diff_y) / 2.0;
gtk_adjustment_set_value (GTK_ADJUSTMENT (fuzzy_options->threshold_w),
fuzzy_options->threshold + diff);
fuzzy_sel->first_threshold + diff);
/* calculate the new fuzzy boundary */
new_segs = fuzzy_select_calculate (tool, gdisp_ptr, &num_new_segs);

View File

@ -45,8 +45,9 @@ struct _FuzzySelect
int op; /* selection operation (ADD, SUB, etc) */
int x, y; /* Point from which to execute seed fill */
int last_x; /* */
int last_y; /* variables to keep track of sensitivity */
int first_x; /* */
int first_y; /* variables to keep track of sensitivity */
double first_threshold; /* initial value of threshold slider */
};
@ -390,8 +391,9 @@ fuzzy_select_button_press (Tool *tool,
fuzzy_sel->x = bevent->x;
fuzzy_sel->y = bevent->y;
fuzzy_sel->last_x = fuzzy_sel->x;
fuzzy_sel->last_y = fuzzy_sel->y;
fuzzy_sel->first_x = fuzzy_sel->x;
fuzzy_sel->first_y = fuzzy_sel->y;
fuzzy_sel->first_threshold = fuzzy_options->threshold;
gdk_pointer_grab (gdisp->canvas->window, FALSE,
GDK_POINTER_MOTION_HINT_MASK |
@ -465,23 +467,21 @@ fuzzy_select_motion (Tool *tool,
FuzzySelect * fuzzy_sel;
GdkSegment * new_segs;
int num_new_segs;
int diff, diff_x, diff_y;
int diff_x, diff_y;
double diff;
if (tool->state != ACTIVE)
return;
fuzzy_sel = (FuzzySelect *) tool->private;
diff_x = mevent->x - fuzzy_sel->last_x;
diff_y = mevent->y - fuzzy_sel->last_y;
diff_x = mevent->x - fuzzy_sel->first_x;
diff_y = mevent->y - fuzzy_sel->first_y;
diff = ((ABS (diff_x) > ABS (diff_y)) ? diff_x : diff_y) / 2;
fuzzy_sel->last_x = mevent->x;
fuzzy_sel->last_y = mevent->y;
diff = ((ABS (diff_x) > ABS (diff_y)) ? diff_x : diff_y) / 2.0;
gtk_adjustment_set_value (GTK_ADJUSTMENT (fuzzy_options->threshold_w),
fuzzy_options->threshold + diff);
fuzzy_sel->first_threshold + diff);
/* calculate the new fuzzy boundary */
new_segs = fuzzy_select_calculate (tool, gdisp_ptr, &num_new_segs);

View File

@ -45,8 +45,9 @@ struct _FuzzySelect
int op; /* selection operation (ADD, SUB, etc) */
int x, y; /* Point from which to execute seed fill */
int last_x; /* */
int last_y; /* variables to keep track of sensitivity */
int first_x; /* */
int first_y; /* variables to keep track of sensitivity */
double first_threshold; /* initial value of threshold slider */
};
@ -390,8 +391,9 @@ fuzzy_select_button_press (Tool *tool,
fuzzy_sel->x = bevent->x;
fuzzy_sel->y = bevent->y;
fuzzy_sel->last_x = fuzzy_sel->x;
fuzzy_sel->last_y = fuzzy_sel->y;
fuzzy_sel->first_x = fuzzy_sel->x;
fuzzy_sel->first_y = fuzzy_sel->y;
fuzzy_sel->first_threshold = fuzzy_options->threshold;
gdk_pointer_grab (gdisp->canvas->window, FALSE,
GDK_POINTER_MOTION_HINT_MASK |
@ -465,23 +467,21 @@ fuzzy_select_motion (Tool *tool,
FuzzySelect * fuzzy_sel;
GdkSegment * new_segs;
int num_new_segs;
int diff, diff_x, diff_y;
int diff_x, diff_y;
double diff;
if (tool->state != ACTIVE)
return;
fuzzy_sel = (FuzzySelect *) tool->private;
diff_x = mevent->x - fuzzy_sel->last_x;
diff_y = mevent->y - fuzzy_sel->last_y;
diff_x = mevent->x - fuzzy_sel->first_x;
diff_y = mevent->y - fuzzy_sel->first_y;
diff = ((ABS (diff_x) > ABS (diff_y)) ? diff_x : diff_y) / 2;
fuzzy_sel->last_x = mevent->x;
fuzzy_sel->last_y = mevent->y;
diff = ((ABS (diff_x) > ABS (diff_y)) ? diff_x : diff_y) / 2.0;
gtk_adjustment_set_value (GTK_ADJUSTMENT (fuzzy_options->threshold_w),
fuzzy_options->threshold + diff);
fuzzy_sel->first_threshold + diff);
/* calculate the new fuzzy boundary */
new_segs = fuzzy_select_calculate (tool, gdisp_ptr, &num_new_segs);

View File

@ -45,8 +45,9 @@ struct _FuzzySelect
int op; /* selection operation (ADD, SUB, etc) */
int x, y; /* Point from which to execute seed fill */
int last_x; /* */
int last_y; /* variables to keep track of sensitivity */
int first_x; /* */
int first_y; /* variables to keep track of sensitivity */
double first_threshold; /* initial value of threshold slider */
};
@ -390,8 +391,9 @@ fuzzy_select_button_press (Tool *tool,
fuzzy_sel->x = bevent->x;
fuzzy_sel->y = bevent->y;
fuzzy_sel->last_x = fuzzy_sel->x;
fuzzy_sel->last_y = fuzzy_sel->y;
fuzzy_sel->first_x = fuzzy_sel->x;
fuzzy_sel->first_y = fuzzy_sel->y;
fuzzy_sel->first_threshold = fuzzy_options->threshold;
gdk_pointer_grab (gdisp->canvas->window, FALSE,
GDK_POINTER_MOTION_HINT_MASK |
@ -465,23 +467,21 @@ fuzzy_select_motion (Tool *tool,
FuzzySelect * fuzzy_sel;
GdkSegment * new_segs;
int num_new_segs;
int diff, diff_x, diff_y;
int diff_x, diff_y;
double diff;
if (tool->state != ACTIVE)
return;
fuzzy_sel = (FuzzySelect *) tool->private;
diff_x = mevent->x - fuzzy_sel->last_x;
diff_y = mevent->y - fuzzy_sel->last_y;
diff_x = mevent->x - fuzzy_sel->first_x;
diff_y = mevent->y - fuzzy_sel->first_y;
diff = ((ABS (diff_x) > ABS (diff_y)) ? diff_x : diff_y) / 2;
fuzzy_sel->last_x = mevent->x;
fuzzy_sel->last_y = mevent->y;
diff = ((ABS (diff_x) > ABS (diff_y)) ? diff_x : diff_y) / 2.0;
gtk_adjustment_set_value (GTK_ADJUSTMENT (fuzzy_options->threshold_w),
fuzzy_options->threshold + diff);
fuzzy_sel->first_threshold + diff);
/* calculate the new fuzzy boundary */
new_segs = fuzzy_select_calculate (tool, gdisp_ptr, &num_new_segs);

View File

@ -103,6 +103,23 @@
* changed.
*/
/*
* 22-DEC-99 - volatiles added
* - Austin Donnelly <austin@gimp.org>
*
* When gcc complains a variable may be clobbered by a longjmp or
* vfork, it means the following: setjmp() was called by the JPEG
* library for error recovery purposes, but gcc is keeping some
* variables in registers without updating the memory locations on the
* stack consistently. If JPEG error recovery is every invoked, the
* values of these variable will be inconsistent. This is almost
* always a bug, but not one that's commonly seen unless JPEG recovery
* code is exercised frequently. The correct solution is to tell gcc
* to keep the stack version of the affected variables up to date, by
* using the "volatile" keyword. Here endeth the lesson.
*/
#include "config.h" /* configure cares about HAVE_PROGRESSIVE_JPEG */
#include <glib.h> /* We want glib.h first because of some
@ -125,6 +142,7 @@
#include "libgimp/stdplugins-intl.h"
#include <signal.h>
#define SCALE_WIDTH 125
@ -368,6 +386,11 @@ run (char *name,
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
if (strcmp (name, "file_jpeg_load") == 0)
{
INIT_I18N();
@ -699,7 +722,7 @@ load_image (char *filename,
struct my_error_mgr jerr;
FILE *infile;
guchar *buf;
guchar *padded_buf = NULL;
guchar * volatile padded_buf = NULL;
guchar **rowbuf;
char *name;
int image_type;
@ -710,8 +733,8 @@ load_image (char *filename,
#ifdef GIMP_HAVE_PARASITES
JpegSaveVals local_save_vals;
Parasite *comment_parasite = NULL;
Parasite *vals_parasite = NULL;
Parasite * volatile comment_parasite = NULL;
Parasite * volatile vals_parasite = NULL;
#endif /* GIMP_HAVE_PARASITES */
@ -775,6 +798,7 @@ load_image (char *filename,
{
char *string = local_image_comments->str;
g_string_free (local_image_comments,FALSE);
local_image_comments = NULL;
comment_parasite = parasite_new ("gimp-comment", PARASITE_PERSISTENT,
strlen (string) + 1, string);
}

View File

@ -2,7 +2,7 @@
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* newsprint plug-in
* Copyright (C) 1997-1998 Austin Donnelly <austin@greenend.org.uk>
* Copyright (C) 1997-1998 Austin Donnelly <austin@gimp.org>
*
* 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

View File

@ -8,6 +8,9 @@
* Added controls for TextAlphaBits and GraphicsAlphaBits
* George White <aa056@chebucto.ns.ca>
*
* Added Ascii85 encoding
* Austin Donnelly <austin@gimp.org>
*
* 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
@ -41,10 +44,11 @@
* V 1.06, PK, 22-Dec-98: Fix problem with writing color PS files.
* Ghostview may hang when displaying the files.
* V 1.07, PK, 14-Sep-99: Add resolution to image
* V 1.08, PK, 16-Jan-2000: Add PostScript-Level 2 by Austin Donnelly
*/
#define VERSIO 1.07
static char dversio[] = "v1.07 14-Sep-99";
static char ident[] = "@(#) GIMP PostScript/PDF file-plugin v1.07 14-Sep-99";
#define VERSIO 1.08
static char dversio[] = "v1.08 16-Jan-2000";
static char ident[] = "@(#) GIMP PostScript/PDF file-plugin v1.08 16-Jan-2000";
#include "config.h"
@ -66,7 +70,7 @@ static char ident[] = "@(#) GIMP PostScript/PDF file-plugin v1.07 14-Sep-99";
#define USE_REAL_OUTPUTFILE
#endif
#define STR_LENGTH 64
/* Load info */
@ -111,6 +115,7 @@ typedef struct
gint unit_mm; /* Unit of measure (0: inch, 1: mm) */
gint keep_ratio; /* Keep aspect ratio */
gint rotate; /* Rotation (0, 90, 180, 270) */
gint level; /* PostScript Level */
gint eps; /* Encapsulated PostScript flag */
gint preview; /* Preview Flag */
gint preview_size; /* Preview size */
@ -128,6 +133,7 @@ static PSSaveVals psvals =
1, /* Unit is mm */
1, /* Keep edge ratio */
90, /* Rotate */
2, /* PostScript Level */
0, /* Encapsulated PostScript flag */
0, /* Preview flag */
256 /* Preview size */
@ -238,6 +244,7 @@ typedef struct
int keep_ratio;
int unit[2];
int rot[4];
int level;
int eps;
int preview;
int preview_size;
@ -265,6 +272,82 @@ GPlugInInfo PLUG_IN_INFO =
static GRunModeType l_run_mode;
static guint32 ascii85_buf;
static int ascii85_len = 0;
static int ascii85_linewidth = 0;
static void
ascii85_init (void)
{
ascii85_len = 0;
ascii85_linewidth = 0;
}
static void
ascii85_flush (FILE *ofp)
{
char c[5];
int i;
gboolean zero_case = (ascii85_buf == 0);
for (i=4; i >= 0; i--)
{
c[i] = (ascii85_buf % 85) + '!';
ascii85_buf /= 85;
}
/* check for special case: "!!!!!" becomes "z", but only if not
* at end of data. */
if (zero_case && (ascii85_len == 4))
{
putc ('z', ofp);
ascii85_linewidth++;
}
else
{
ascii85_linewidth += ascii85_len+1;
for (i=0; i < ascii85_len+1; i++)
putc (c[i], ofp);
}
if (ascii85_linewidth >= 75)
{
putc ('\n', ofp);
ascii85_linewidth = 0;
}
ascii85_len = 0;
ascii85_buf = 0;
}
static inline void
ascii85_out (unsigned char byte, FILE *ofp)
{
if (ascii85_len == 4)
ascii85_flush (ofp);
ascii85_buf <<= 8;
ascii85_buf |= byte;
ascii85_len++;
}
static void
ascii85_done (FILE *ofp)
{
if (ascii85_len)
{
/* zero any unfilled buffer portion, then flush */
ascii85_buf <<= (8 * (4-ascii85_len));
ascii85_flush (ofp);
}
putc ('~', ofp);
putc ('>', ofp);
putc ('\n', ofp);
}
MAIN ()
@ -315,7 +398,8 @@ query (void)
{ PARAM_INT32, "keep_ratio", "0: use width/height, 1: keep aspect ratio" },
{ PARAM_INT32, "rotation", "0, 90, 180, 270" },
{ PARAM_INT32, "eps_flag", "0: PostScript, 1: Encapsulated PostScript" },
{ PARAM_INT32, "preview", "0: no preview, >0: max. size of preview" }
{ PARAM_INT32, "preview", "0: no preview, >0: max. size of preview" },
{ PARAM_INT32, "level", "1: PostScript Level 1, 2: PostScript Level 2" }
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
@ -349,7 +433,7 @@ query (void)
_("save file in PostScript file format"),
_("PostScript saving handles all image types except \
those with alpha channels."),
"Peter Kirchgessner <pkirchg@aol.com>",
"Peter Kirchgessner <peter@kirchgessner.net>",
"Peter Kirchgessner",
dversio,
"<Save>/PostScript",
@ -473,20 +557,20 @@ run (char *name,
image_ID = orig_image_ID = param[1].data.d_int32;
drawable_ID = param[2].data.d_int32;
/* eventually export the image */
/* eventually export the image */
switch (run_mode)
{
case RUN_INTERACTIVE:
case RUN_WITH_LAST_VALS:
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "PS",
export = gimp_export_image (&image_ID, &drawable_ID, "PS",
(CAN_HANDLE_RGB | CAN_HANDLE_GRAY | CAN_HANDLE_INDEXED));
if (export == EXPORT_CANCEL)
{
*nreturn_vals = 1;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
return;
}
}
break;
default:
break;
@ -513,7 +597,7 @@ run (char *name,
case RUN_NONINTERACTIVE:
/* Make sure all the arguments are there! */
if (nparams != 14)
if (nparams != 15)
{
status = STATUS_CALLING_ERROR;
}
@ -529,6 +613,7 @@ run (char *name,
psvals.eps = param[12].data.d_int32;
psvals.preview = (param[13].data.d_int32 != 0);
psvals.preview_size = param[13].data.d_int32;
psvals.level = param[14].data.d_int32;
}
break;
@ -561,7 +646,7 @@ run (char *name,
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
values[0].data.d_status = status;
}
else if (strcmp (name, "file_ps_load_setargs") == 0)
@ -663,7 +748,7 @@ load_image (char *filename)
image_ID = load_ps (filename, page_count, ifp, llx, lly, urx, ury);
if (image_ID == -1) break;
#ifdef GIMP_HAVE_RESOLUTION_INFO
gimp_image_set_resolution (image_ID,
gimp_image_set_resolution (image_ID,
(double)plvals.resolution, (double)plvals.resolution);
gimp_image_set_unit (image_ID, UNIT_INCH);
#endif
@ -1099,7 +1184,7 @@ ps_open (char *filename,
sprintf (cmd, "%s @%s", gs, indirfile);
fclose (indf);
}
#endif
#endif
system (cmd);
#ifndef __EMX__
fd_popen = fopen (pnmfile, "r");
@ -1428,7 +1513,7 @@ by Peter Kirchgessner\n", VERSIO);
fprintf (ofp, "%%%%Title: %s\n", filename);
fprintf (ofp, "%%%%CreationDate: %s", ctime (&cutime));
fprintf (ofp, "%%%%DocumentData: Clean7Bit\n");
if (psvals.eps) fprintf (ofp, "%%%%LanguageLevel: 2\n");
if (psvals.eps || (psvals.level > 1)) fprintf (ofp,"%%%%LanguageLevel: 2\n");
fprintf (ofp, "%%%%Pages: 1\n");
}
@ -1514,12 +1599,14 @@ save_ps_setup (FILE *ofp,
fprintf (ofp, "%f %f scale\n", 72.0*width_inch, -72.0*height_inch);
/* Write the PostScript procedures to read the image */
fprintf (ofp, "%% Variable to keep one line of raster data\n");
if (bpp == 1)
fprintf (ofp, "/scanline %d string def\n", (width+7)/8);
else
fprintf (ofp, "/scanline %d %d mul string def\n", width, bpp/8);
if (psvals.level <= 1)
{
fprintf (ofp, "%% Variable to keep one line of raster data\n");
if (bpp == 1)
fprintf (ofp, "/scanline %d string def\n", (width+7)/8);
else
fprintf (ofp, "/scanline %d %d mul string def\n", width, bpp/8);
}
fprintf (ofp, "%% Image geometry\n%d %d %d\n", width, height,
(bpp == 1) ? 1 : 8);
fprintf (ofp, "%% Transformation matrix\n");
@ -1753,6 +1840,7 @@ save_gray (FILE *ofp,
GDrawable *drawable;
GDrawableType drawable_type;
static char *hex = "0123456789abcdef";
int level2 = (psvals.level > 1);
drawable = gimp_drawable_get (drawable_ID);
drawable_type = gimp_drawable_type (drawable_ID);
@ -1768,7 +1856,15 @@ save_gray (FILE *ofp,
save_ps_setup (ofp, drawable_ID, width, height, 1*8);
/* Write read image procedure */
fprintf (ofp, "{ currentfile scanline readhexstring pop }\n");
if (!level2)
{
fprintf (ofp, "{ currentfile scanline readhexstring pop }\n");
}
else
{
fprintf (ofp, "currentfile /ASCII85Decode filter\n");
ascii85_init ();
}
fprintf (ofp, "image\n");
#define GET_GRAY_TILE(begin) \
@ -1780,16 +1876,25 @@ save_gray (FILE *ofp,
for (i = 0; i < height; i++)
{
if ((i % tile_height) == 0) GET_GRAY_TILE (data); /* Get more data */
for (j = 0; j < width; j++)
if (!level2)
{
putc (hex[(*src) >> 4], ofp);
putc (hex[(*(src++)) & 0x0f], ofp);
if (((j+1) % 39) == 0) putc ('\n', ofp);
for (j = 0; j < width; j++)
{
putc (hex[(*src) >> 4], ofp);
putc (hex[(*(src++)) & 0x0f], ofp);
if (((j+1) % 39) == 0) putc ('\n', ofp);
}
putc ('\n', ofp);
}
else
{
for (j = 0; j < width; j++)
ascii85_out (*(src++), ofp);
}
putc ('\n', ofp);
if ((l_run_mode != RUN_NONINTERACTIVE) && ((i % 20) == 0))
gimp_progress_update ((double) i / (double) height);
}
if (level2) ascii85_done (ofp);
fprintf (ofp, "showpage\n");
g_free (data);
@ -1821,6 +1926,7 @@ save_bw (FILE *ofp,
GDrawable *drawable;
GDrawableType drawable_type;
static char *hex = "0123456789abcdef";
int level2 = (psvals.level > 1);
cmap = gimp_image_get_cmap (image_ID, &ncols);
@ -1841,7 +1947,15 @@ save_bw (FILE *ofp,
save_ps_setup (ofp, drawable_ID, width, height, 1);
/* Write read image procedure */
fprintf (ofp, "{ currentfile scanline readhexstring pop }\n");
if (!level2)
{
fprintf (ofp, "{ currentfile scanline readhexstring pop }\n");
}
else
{
fprintf (ofp, "currentfile /ASCII85Decode filter\n");
ascii85_init ();
}
fprintf (ofp, "image\n");
#define GET_BW_TILE(begin) \
@ -1864,26 +1978,36 @@ save_bw (FILE *ofp,
*dst |= mask;
if (mask == 0x01) { mask = 0x80; dst++; } else mask >>= 1;
}
/* Convert to hexstring */
for (j = 0; j < nbsl; j++)
if (!level2)
{
hex_scanline[j*2] = (unsigned char)hex[scanline[j] >> 4];
hex_scanline[j*2+1] = (unsigned char)hex[scanline[j] & 0x0f];
/* Convert to hexstring */
for (j = 0; j < nbsl; j++)
{
hex_scanline[j*2] = (unsigned char)hex[scanline[j] >> 4];
hex_scanline[j*2+1] = (unsigned char)hex[scanline[j] & 0x0f];
}
/* Write out hexstring */
j = nbsl * 2;
dst = hex_scanline;
while (j > 0)
{
nwrite = (j > 78) ? 78 : j;
fwrite (dst, nwrite, 1, ofp);
putc ('\n', ofp);
j -= nwrite;
dst += nwrite;
}
}
/* Write out hexstring */
j = nbsl * 2;
dst = hex_scanline;
while (j > 0)
else
{
nwrite = (j > 78) ? 78 : j;
fwrite (dst, nwrite, 1, ofp);
putc ('\n', ofp);
j -= nwrite;
dst += nwrite;
dst = scanline;
for (j = 0; j < nbsl; j++)
ascii85_out (*(dst++), ofp);
}
if ((l_run_mode != RUN_NONINTERACTIVE) && ((i % 20) == 0))
gimp_progress_update ((double) i / (double) height);
}
if (level2) ascii85_done (ofp);
fprintf (ofp, "showpage\n");
g_free (hex_scanline);
@ -1910,7 +2034,7 @@ save_index (FILE *ofp,
{ int height, width, i, j;
int ncols, bw;
int tile_height;
unsigned char *cmap;
unsigned char *cmap, *cmap_start;
unsigned char *data, *src;
char coltab[256*6], *ct;
GPixelRgn pixel_rgn;
@ -1918,8 +2042,9 @@ save_index (FILE *ofp,
GDrawableType drawable_type;
static char *hex = "0123456789abcdef";
static char *background = "000000";
int level2 = (psvals.level > 1);
cmap = gimp_image_get_cmap (image_ID, &ncols);
cmap = cmap_start = gimp_image_get_cmap (image_ID, &ncols);
ct = coltab;
bw = 1;
@ -1958,7 +2083,15 @@ save_index (FILE *ofp,
save_ps_setup (ofp, drawable_ID, width, height, 3*8);
/* Write read image procedure */
fprintf (ofp, "{ currentfile scanline readhexstring pop } false 3\n");
if (!level2)
{
fprintf (ofp, "{ currentfile scanline readhexstring pop } false 3\n");
}
else
{
fprintf (ofp, "currentfile /ASCII85Decode filter false 3\n");
ascii85_init ();
}
fprintf (ofp, "colorimage\n");
#define GET_INDEX_TILE(begin) \
@ -1970,15 +2103,29 @@ save_index (FILE *ofp,
for (i = 0; i < height; i++)
{
if ((i % tile_height) == 0) GET_INDEX_TILE (data); /* Get more data */
for (j = 0; j < width; j++)
if (!level2)
{
fwrite (coltab+(*(src++))*6, 6, 1, ofp);
if (((j+1) % 13) == 0) putc ('\n', ofp);
for (j = 0; j < width; j++)
{
fwrite (coltab+(*(src++))*6, 6, 1, ofp);
if (((j+1) % 13) == 0) putc ('\n', ofp);
}
putc ('\n', ofp);
}
else
{
for (j = 0; j < width; j++)
{
cmap = cmap_start + 3 * (*(src++));
ascii85_out (*(cmap++), ofp);
ascii85_out (*(cmap++), ofp);
ascii85_out (*(cmap++), ofp);
}
}
putc ('\n', ofp);
if ((l_run_mode != RUN_NONINTERACTIVE) && ((i % 20) == 0))
gimp_progress_update ((double) i / (double) height);
}
if (level2) ascii85_done (ofp);
fprintf (ofp, "showpage\n");
g_free (data);
@ -2008,6 +2155,7 @@ save_rgb (FILE *ofp,
GDrawable *drawable;
GDrawableType drawable_type;
static char *hex = "0123456789abcdef";
int level2 = (psvals.level > 1);
drawable = gimp_drawable_get (drawable_ID);
drawable_type = gimp_drawable_type (drawable_ID);
@ -2023,7 +2171,15 @@ save_rgb (FILE *ofp,
save_ps_setup (ofp, drawable_ID, width, height, 3*8);
/* Write read image procedure */
fprintf (ofp, "{ currentfile scanline readhexstring pop } false 3\n");
if (!level2)
{
fprintf (ofp, "{ currentfile scanline readhexstring pop } false 3\n");
}
else
{
fprintf (ofp, "currentfile /ASCII85Decode filter false 3\n");
ascii85_init ();
}
fprintf (ofp, "colorimage\n");
#define GET_RGB_TILE(begin) \
@ -2035,20 +2191,33 @@ save_rgb (FILE *ofp,
for (i = 0; i < height; i++)
{
if ((i % tile_height) == 0) GET_RGB_TILE (data); /* Get more data */
for (j = 0; j < width; j++)
if (!level2)
{
putc (hex[(*src) >> 4], ofp); /* Red */
putc (hex[(*(src++)) & 0x0f], ofp);
putc (hex[(*src) >> 4], ofp); /* Green */
putc (hex[(*(src++)) & 0x0f], ofp);
putc (hex[(*src) >> 4], ofp); /* Blue */
putc (hex[(*(src++)) & 0x0f], ofp);
if (((j+1) % 13) == 0) putc ('\n', ofp);
for (j = 0; j < width; j++)
{
putc (hex[(*src) >> 4], ofp); /* Red */
putc (hex[(*(src++)) & 0x0f], ofp);
putc (hex[(*src) >> 4], ofp); /* Green */
putc (hex[(*(src++)) & 0x0f], ofp);
putc (hex[(*src) >> 4], ofp); /* Blue */
putc (hex[(*(src++)) & 0x0f], ofp);
if (((j+1) % 13) == 0) putc ('\n', ofp);
}
putc ('\n', ofp);
}
else
{
for (j = 0; j < width; j++)
{
ascii85_out (*(src++), ofp);
ascii85_out (*(src++), ofp);
ascii85_out (*(src++), ofp);
}
}
putc ('\n', ofp);
if ((l_run_mode != RUN_NONINTERACTIVE) && ((i % 20) == 0))
gimp_progress_update ((double) i / (double) height);
}
if (level2) ascii85_done (ofp);
fprintf (ofp, "showpage\n");
g_free (data);
@ -2063,7 +2232,7 @@ save_rgb (FILE *ofp,
#undef GET_RGB_TILE
}
static void
static void
init_gtk ()
{
gchar **argv;
@ -2072,7 +2241,7 @@ init_gtk ()
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("ps");
gtk_init (&argc, &argv);
gtk_rc_parse (gimp_gtkrc ());
}
@ -2494,6 +2663,15 @@ save_dialog (void)
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
toggle = gtk_check_button_new_with_label (_("PostScript Level 2"));
gtk_box_pack_start (GTK_BOX (vbox), toggle, TRUE, TRUE, 0);
vals->level = (psvals.level > 1);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) save_toggle_update,
&(vals->level));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), vals->level);
gtk_widget_show (toggle);
toggle = gtk_check_button_new_with_label (_("Encapsulated PostScript"));
gtk_box_pack_start (GTK_BOX (vbox), toggle, TRUE, TRUE, 0);
vals->eps = (psvals.eps != 0);
@ -2591,6 +2769,9 @@ save_ok_callback (GtkWidget *widget,
else if (vals->rot[3] == 1) psvals.rotate = 270;
else psvals.rotate = 0;
/* Read PostScript level 2 flag */
psvals.level = vals->level ? 2 : 1;
/* Read EPS flag */
psvals.eps = (vals->eps != 0);

View File

@ -8,6 +8,9 @@
* Added controls for TextAlphaBits and GraphicsAlphaBits
* George White <aa056@chebucto.ns.ca>
*
* Added Ascii85 encoding
* Austin Donnelly <austin@gimp.org>
*
* 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
@ -41,10 +44,11 @@
* V 1.06, PK, 22-Dec-98: Fix problem with writing color PS files.
* Ghostview may hang when displaying the files.
* V 1.07, PK, 14-Sep-99: Add resolution to image
* V 1.08, PK, 16-Jan-2000: Add PostScript-Level 2 by Austin Donnelly
*/
#define VERSIO 1.07
static char dversio[] = "v1.07 14-Sep-99";
static char ident[] = "@(#) GIMP PostScript/PDF file-plugin v1.07 14-Sep-99";
#define VERSIO 1.08
static char dversio[] = "v1.08 16-Jan-2000";
static char ident[] = "@(#) GIMP PostScript/PDF file-plugin v1.08 16-Jan-2000";
#include "config.h"
@ -66,7 +70,7 @@ static char ident[] = "@(#) GIMP PostScript/PDF file-plugin v1.07 14-Sep-99";
#define USE_REAL_OUTPUTFILE
#endif
#define STR_LENGTH 64
/* Load info */
@ -111,6 +115,7 @@ typedef struct
gint unit_mm; /* Unit of measure (0: inch, 1: mm) */
gint keep_ratio; /* Keep aspect ratio */
gint rotate; /* Rotation (0, 90, 180, 270) */
gint level; /* PostScript Level */
gint eps; /* Encapsulated PostScript flag */
gint preview; /* Preview Flag */
gint preview_size; /* Preview size */
@ -128,6 +133,7 @@ static PSSaveVals psvals =
1, /* Unit is mm */
1, /* Keep edge ratio */
90, /* Rotate */
2, /* PostScript Level */
0, /* Encapsulated PostScript flag */
0, /* Preview flag */
256 /* Preview size */
@ -238,6 +244,7 @@ typedef struct
int keep_ratio;
int unit[2];
int rot[4];
int level;
int eps;
int preview;
int preview_size;
@ -265,6 +272,82 @@ GPlugInInfo PLUG_IN_INFO =
static GRunModeType l_run_mode;
static guint32 ascii85_buf;
static int ascii85_len = 0;
static int ascii85_linewidth = 0;
static void
ascii85_init (void)
{
ascii85_len = 0;
ascii85_linewidth = 0;
}
static void
ascii85_flush (FILE *ofp)
{
char c[5];
int i;
gboolean zero_case = (ascii85_buf == 0);
for (i=4; i >= 0; i--)
{
c[i] = (ascii85_buf % 85) + '!';
ascii85_buf /= 85;
}
/* check for special case: "!!!!!" becomes "z", but only if not
* at end of data. */
if (zero_case && (ascii85_len == 4))
{
putc ('z', ofp);
ascii85_linewidth++;
}
else
{
ascii85_linewidth += ascii85_len+1;
for (i=0; i < ascii85_len+1; i++)
putc (c[i], ofp);
}
if (ascii85_linewidth >= 75)
{
putc ('\n', ofp);
ascii85_linewidth = 0;
}
ascii85_len = 0;
ascii85_buf = 0;
}
static inline void
ascii85_out (unsigned char byte, FILE *ofp)
{
if (ascii85_len == 4)
ascii85_flush (ofp);
ascii85_buf <<= 8;
ascii85_buf |= byte;
ascii85_len++;
}
static void
ascii85_done (FILE *ofp)
{
if (ascii85_len)
{
/* zero any unfilled buffer portion, then flush */
ascii85_buf <<= (8 * (4-ascii85_len));
ascii85_flush (ofp);
}
putc ('~', ofp);
putc ('>', ofp);
putc ('\n', ofp);
}
MAIN ()
@ -315,7 +398,8 @@ query (void)
{ PARAM_INT32, "keep_ratio", "0: use width/height, 1: keep aspect ratio" },
{ PARAM_INT32, "rotation", "0, 90, 180, 270" },
{ PARAM_INT32, "eps_flag", "0: PostScript, 1: Encapsulated PostScript" },
{ PARAM_INT32, "preview", "0: no preview, >0: max. size of preview" }
{ PARAM_INT32, "preview", "0: no preview, >0: max. size of preview" },
{ PARAM_INT32, "level", "1: PostScript Level 1, 2: PostScript Level 2" }
};
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
@ -349,7 +433,7 @@ query (void)
_("save file in PostScript file format"),
_("PostScript saving handles all image types except \
those with alpha channels."),
"Peter Kirchgessner <pkirchg@aol.com>",
"Peter Kirchgessner <peter@kirchgessner.net>",
"Peter Kirchgessner",
dversio,
"<Save>/PostScript",
@ -473,20 +557,20 @@ run (char *name,
image_ID = orig_image_ID = param[1].data.d_int32;
drawable_ID = param[2].data.d_int32;
/* eventually export the image */
/* eventually export the image */
switch (run_mode)
{
case RUN_INTERACTIVE:
case RUN_WITH_LAST_VALS:
init_gtk ();
export = gimp_export_image (&image_ID, &drawable_ID, "PS",
export = gimp_export_image (&image_ID, &drawable_ID, "PS",
(CAN_HANDLE_RGB | CAN_HANDLE_GRAY | CAN_HANDLE_INDEXED));
if (export == EXPORT_CANCEL)
{
*nreturn_vals = 1;
values[0].data.d_status = STATUS_EXECUTION_ERROR;
return;
}
}
break;
default:
break;
@ -513,7 +597,7 @@ run (char *name,
case RUN_NONINTERACTIVE:
/* Make sure all the arguments are there! */
if (nparams != 14)
if (nparams != 15)
{
status = STATUS_CALLING_ERROR;
}
@ -529,6 +613,7 @@ run (char *name,
psvals.eps = param[12].data.d_int32;
psvals.preview = (param[13].data.d_int32 != 0);
psvals.preview_size = param[13].data.d_int32;
psvals.level = param[14].data.d_int32;
}
break;
@ -561,7 +646,7 @@ run (char *name,
if (export == EXPORT_EXPORT)
gimp_image_delete (image_ID);
values[0].data.d_status = status;
}
else if (strcmp (name, "file_ps_load_setargs") == 0)
@ -663,7 +748,7 @@ load_image (char *filename)
image_ID = load_ps (filename, page_count, ifp, llx, lly, urx, ury);
if (image_ID == -1) break;
#ifdef GIMP_HAVE_RESOLUTION_INFO
gimp_image_set_resolution (image_ID,
gimp_image_set_resolution (image_ID,
(double)plvals.resolution, (double)plvals.resolution);
gimp_image_set_unit (image_ID, UNIT_INCH);
#endif
@ -1099,7 +1184,7 @@ ps_open (char *filename,
sprintf (cmd, "%s @%s", gs, indirfile);
fclose (indf);
}
#endif
#endif
system (cmd);
#ifndef __EMX__
fd_popen = fopen (pnmfile, "r");
@ -1428,7 +1513,7 @@ by Peter Kirchgessner\n", VERSIO);
fprintf (ofp, "%%%%Title: %s\n", filename);
fprintf (ofp, "%%%%CreationDate: %s", ctime (&cutime));
fprintf (ofp, "%%%%DocumentData: Clean7Bit\n");
if (psvals.eps) fprintf (ofp, "%%%%LanguageLevel: 2\n");
if (psvals.eps || (psvals.level > 1)) fprintf (ofp,"%%%%LanguageLevel: 2\n");
fprintf (ofp, "%%%%Pages: 1\n");
}
@ -1514,12 +1599,14 @@ save_ps_setup (FILE *ofp,
fprintf (ofp, "%f %f scale\n", 72.0*width_inch, -72.0*height_inch);
/* Write the PostScript procedures to read the image */
fprintf (ofp, "%% Variable to keep one line of raster data\n");
if (bpp == 1)
fprintf (ofp, "/scanline %d string def\n", (width+7)/8);
else
fprintf (ofp, "/scanline %d %d mul string def\n", width, bpp/8);
if (psvals.level <= 1)
{
fprintf (ofp, "%% Variable to keep one line of raster data\n");
if (bpp == 1)
fprintf (ofp, "/scanline %d string def\n", (width+7)/8);
else
fprintf (ofp, "/scanline %d %d mul string def\n", width, bpp/8);
}
fprintf (ofp, "%% Image geometry\n%d %d %d\n", width, height,
(bpp == 1) ? 1 : 8);
fprintf (ofp, "%% Transformation matrix\n");
@ -1753,6 +1840,7 @@ save_gray (FILE *ofp,
GDrawable *drawable;
GDrawableType drawable_type;
static char *hex = "0123456789abcdef";
int level2 = (psvals.level > 1);
drawable = gimp_drawable_get (drawable_ID);
drawable_type = gimp_drawable_type (drawable_ID);
@ -1768,7 +1856,15 @@ save_gray (FILE *ofp,
save_ps_setup (ofp, drawable_ID, width, height, 1*8);
/* Write read image procedure */
fprintf (ofp, "{ currentfile scanline readhexstring pop }\n");
if (!level2)
{
fprintf (ofp, "{ currentfile scanline readhexstring pop }\n");
}
else
{
fprintf (ofp, "currentfile /ASCII85Decode filter\n");
ascii85_init ();
}
fprintf (ofp, "image\n");
#define GET_GRAY_TILE(begin) \
@ -1780,16 +1876,25 @@ save_gray (FILE *ofp,
for (i = 0; i < height; i++)
{
if ((i % tile_height) == 0) GET_GRAY_TILE (data); /* Get more data */
for (j = 0; j < width; j++)
if (!level2)
{
putc (hex[(*src) >> 4], ofp);
putc (hex[(*(src++)) & 0x0f], ofp);
if (((j+1) % 39) == 0) putc ('\n', ofp);
for (j = 0; j < width; j++)
{
putc (hex[(*src) >> 4], ofp);
putc (hex[(*(src++)) & 0x0f], ofp);
if (((j+1) % 39) == 0) putc ('\n', ofp);
}
putc ('\n', ofp);
}
else
{
for (j = 0; j < width; j++)
ascii85_out (*(src++), ofp);
}
putc ('\n', ofp);
if ((l_run_mode != RUN_NONINTERACTIVE) && ((i % 20) == 0))
gimp_progress_update ((double) i / (double) height);
}
if (level2) ascii85_done (ofp);
fprintf (ofp, "showpage\n");
g_free (data);
@ -1821,6 +1926,7 @@ save_bw (FILE *ofp,
GDrawable *drawable;
GDrawableType drawable_type;
static char *hex = "0123456789abcdef";
int level2 = (psvals.level > 1);
cmap = gimp_image_get_cmap (image_ID, &ncols);
@ -1841,7 +1947,15 @@ save_bw (FILE *ofp,
save_ps_setup (ofp, drawable_ID, width, height, 1);
/* Write read image procedure */
fprintf (ofp, "{ currentfile scanline readhexstring pop }\n");
if (!level2)
{
fprintf (ofp, "{ currentfile scanline readhexstring pop }\n");
}
else
{
fprintf (ofp, "currentfile /ASCII85Decode filter\n");
ascii85_init ();
}
fprintf (ofp, "image\n");
#define GET_BW_TILE(begin) \
@ -1864,26 +1978,36 @@ save_bw (FILE *ofp,
*dst |= mask;
if (mask == 0x01) { mask = 0x80; dst++; } else mask >>= 1;
}
/* Convert to hexstring */
for (j = 0; j < nbsl; j++)
if (!level2)
{
hex_scanline[j*2] = (unsigned char)hex[scanline[j] >> 4];
hex_scanline[j*2+1] = (unsigned char)hex[scanline[j] & 0x0f];
/* Convert to hexstring */
for (j = 0; j < nbsl; j++)
{
hex_scanline[j*2] = (unsigned char)hex[scanline[j] >> 4];
hex_scanline[j*2+1] = (unsigned char)hex[scanline[j] & 0x0f];
}
/* Write out hexstring */
j = nbsl * 2;
dst = hex_scanline;
while (j > 0)
{
nwrite = (j > 78) ? 78 : j;
fwrite (dst, nwrite, 1, ofp);
putc ('\n', ofp);
j -= nwrite;
dst += nwrite;
}
}
/* Write out hexstring */
j = nbsl * 2;
dst = hex_scanline;
while (j > 0)
else
{
nwrite = (j > 78) ? 78 : j;
fwrite (dst, nwrite, 1, ofp);
putc ('\n', ofp);
j -= nwrite;
dst += nwrite;
dst = scanline;
for (j = 0; j < nbsl; j++)
ascii85_out (*(dst++), ofp);
}
if ((l_run_mode != RUN_NONINTERACTIVE) && ((i % 20) == 0))
gimp_progress_update ((double) i / (double) height);
}
if (level2) ascii85_done (ofp);
fprintf (ofp, "showpage\n");
g_free (hex_scanline);
@ -1910,7 +2034,7 @@ save_index (FILE *ofp,
{ int height, width, i, j;
int ncols, bw;
int tile_height;
unsigned char *cmap;
unsigned char *cmap, *cmap_start;
unsigned char *data, *src;
char coltab[256*6], *ct;
GPixelRgn pixel_rgn;
@ -1918,8 +2042,9 @@ save_index (FILE *ofp,
GDrawableType drawable_type;
static char *hex = "0123456789abcdef";
static char *background = "000000";
int level2 = (psvals.level > 1);
cmap = gimp_image_get_cmap (image_ID, &ncols);
cmap = cmap_start = gimp_image_get_cmap (image_ID, &ncols);
ct = coltab;
bw = 1;
@ -1958,7 +2083,15 @@ save_index (FILE *ofp,
save_ps_setup (ofp, drawable_ID, width, height, 3*8);
/* Write read image procedure */
fprintf (ofp, "{ currentfile scanline readhexstring pop } false 3\n");
if (!level2)
{
fprintf (ofp, "{ currentfile scanline readhexstring pop } false 3\n");
}
else
{
fprintf (ofp, "currentfile /ASCII85Decode filter false 3\n");
ascii85_init ();
}
fprintf (ofp, "colorimage\n");
#define GET_INDEX_TILE(begin) \
@ -1970,15 +2103,29 @@ save_index (FILE *ofp,
for (i = 0; i < height; i++)
{
if ((i % tile_height) == 0) GET_INDEX_TILE (data); /* Get more data */
for (j = 0; j < width; j++)
if (!level2)
{
fwrite (coltab+(*(src++))*6, 6, 1, ofp);
if (((j+1) % 13) == 0) putc ('\n', ofp);
for (j = 0; j < width; j++)
{
fwrite (coltab+(*(src++))*6, 6, 1, ofp);
if (((j+1) % 13) == 0) putc ('\n', ofp);
}
putc ('\n', ofp);
}
else
{
for (j = 0; j < width; j++)
{
cmap = cmap_start + 3 * (*(src++));
ascii85_out (*(cmap++), ofp);
ascii85_out (*(cmap++), ofp);
ascii85_out (*(cmap++), ofp);
}
}
putc ('\n', ofp);
if ((l_run_mode != RUN_NONINTERACTIVE) && ((i % 20) == 0))
gimp_progress_update ((double) i / (double) height);
}
if (level2) ascii85_done (ofp);
fprintf (ofp, "showpage\n");
g_free (data);
@ -2008,6 +2155,7 @@ save_rgb (FILE *ofp,
GDrawable *drawable;
GDrawableType drawable_type;
static char *hex = "0123456789abcdef";
int level2 = (psvals.level > 1);
drawable = gimp_drawable_get (drawable_ID);
drawable_type = gimp_drawable_type (drawable_ID);
@ -2023,7 +2171,15 @@ save_rgb (FILE *ofp,
save_ps_setup (ofp, drawable_ID, width, height, 3*8);
/* Write read image procedure */
fprintf (ofp, "{ currentfile scanline readhexstring pop } false 3\n");
if (!level2)
{
fprintf (ofp, "{ currentfile scanline readhexstring pop } false 3\n");
}
else
{
fprintf (ofp, "currentfile /ASCII85Decode filter false 3\n");
ascii85_init ();
}
fprintf (ofp, "colorimage\n");
#define GET_RGB_TILE(begin) \
@ -2035,20 +2191,33 @@ save_rgb (FILE *ofp,
for (i = 0; i < height; i++)
{
if ((i % tile_height) == 0) GET_RGB_TILE (data); /* Get more data */
for (j = 0; j < width; j++)
if (!level2)
{
putc (hex[(*src) >> 4], ofp); /* Red */
putc (hex[(*(src++)) & 0x0f], ofp);
putc (hex[(*src) >> 4], ofp); /* Green */
putc (hex[(*(src++)) & 0x0f], ofp);
putc (hex[(*src) >> 4], ofp); /* Blue */
putc (hex[(*(src++)) & 0x0f], ofp);
if (((j+1) % 13) == 0) putc ('\n', ofp);
for (j = 0; j < width; j++)
{
putc (hex[(*src) >> 4], ofp); /* Red */
putc (hex[(*(src++)) & 0x0f], ofp);
putc (hex[(*src) >> 4], ofp); /* Green */
putc (hex[(*(src++)) & 0x0f], ofp);
putc (hex[(*src) >> 4], ofp); /* Blue */
putc (hex[(*(src++)) & 0x0f], ofp);
if (((j+1) % 13) == 0) putc ('\n', ofp);
}
putc ('\n', ofp);
}
else
{
for (j = 0; j < width; j++)
{
ascii85_out (*(src++), ofp);
ascii85_out (*(src++), ofp);
ascii85_out (*(src++), ofp);
}
}
putc ('\n', ofp);
if ((l_run_mode != RUN_NONINTERACTIVE) && ((i % 20) == 0))
gimp_progress_update ((double) i / (double) height);
}
if (level2) ascii85_done (ofp);
fprintf (ofp, "showpage\n");
g_free (data);
@ -2063,7 +2232,7 @@ save_rgb (FILE *ofp,
#undef GET_RGB_TILE
}
static void
static void
init_gtk ()
{
gchar **argv;
@ -2072,7 +2241,7 @@ init_gtk ()
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("ps");
gtk_init (&argc, &argv);
gtk_rc_parse (gimp_gtkrc ());
}
@ -2494,6 +2663,15 @@ save_dialog (void)
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_container_add (GTK_CONTAINER (frame), vbox);
toggle = gtk_check_button_new_with_label (_("PostScript Level 2"));
gtk_box_pack_start (GTK_BOX (vbox), toggle, TRUE, TRUE, 0);
vals->level = (psvals.level > 1);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) save_toggle_update,
&(vals->level));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), vals->level);
gtk_widget_show (toggle);
toggle = gtk_check_button_new_with_label (_("Encapsulated PostScript"));
gtk_box_pack_start (GTK_BOX (vbox), toggle, TRUE, TRUE, 0);
vals->eps = (psvals.eps != 0);
@ -2591,6 +2769,9 @@ save_ok_callback (GtkWidget *widget,
else if (vals->rot[3] == 1) psvals.rotate = 270;
else psvals.rotate = 0;
/* Read PostScript level 2 flag */
psvals.level = vals->level ? 2 : 1;
/* Read EPS flag */
psvals.eps = (vals->eps != 0);

View File

@ -103,6 +103,23 @@
* changed.
*/
/*
* 22-DEC-99 - volatiles added
* - Austin Donnelly <austin@gimp.org>
*
* When gcc complains a variable may be clobbered by a longjmp or
* vfork, it means the following: setjmp() was called by the JPEG
* library for error recovery purposes, but gcc is keeping some
* variables in registers without updating the memory locations on the
* stack consistently. If JPEG error recovery is every invoked, the
* values of these variable will be inconsistent. This is almost
* always a bug, but not one that's commonly seen unless JPEG recovery
* code is exercised frequently. The correct solution is to tell gcc
* to keep the stack version of the affected variables up to date, by
* using the "volatile" keyword. Here endeth the lesson.
*/
#include "config.h" /* configure cares about HAVE_PROGRESSIVE_JPEG */
#include <glib.h> /* We want glib.h first because of some
@ -125,6 +142,7 @@
#include "libgimp/stdplugins-intl.h"
#include <signal.h>
#define SCALE_WIDTH 125
@ -368,6 +386,11 @@ run (char *name,
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
if (strcmp (name, "file_jpeg_load") == 0)
{
INIT_I18N();
@ -699,7 +722,7 @@ load_image (char *filename,
struct my_error_mgr jerr;
FILE *infile;
guchar *buf;
guchar *padded_buf = NULL;
guchar * volatile padded_buf = NULL;
guchar **rowbuf;
char *name;
int image_type;
@ -710,8 +733,8 @@ load_image (char *filename,
#ifdef GIMP_HAVE_PARASITES
JpegSaveVals local_save_vals;
Parasite *comment_parasite = NULL;
Parasite *vals_parasite = NULL;
Parasite * volatile comment_parasite = NULL;
Parasite * volatile vals_parasite = NULL;
#endif /* GIMP_HAVE_PARASITES */
@ -775,6 +798,7 @@ load_image (char *filename,
{
char *string = local_image_comments->str;
g_string_free (local_image_comments,FALSE);
local_image_comments = NULL;
comment_parasite = parasite_new ("gimp-comment", PARASITE_PERSISTENT,
strlen (string) + 1, string);
}

View File

@ -103,6 +103,23 @@
* changed.
*/
/*
* 22-DEC-99 - volatiles added
* - Austin Donnelly <austin@gimp.org>
*
* When gcc complains a variable may be clobbered by a longjmp or
* vfork, it means the following: setjmp() was called by the JPEG
* library for error recovery purposes, but gcc is keeping some
* variables in registers without updating the memory locations on the
* stack consistently. If JPEG error recovery is every invoked, the
* values of these variable will be inconsistent. This is almost
* always a bug, but not one that's commonly seen unless JPEG recovery
* code is exercised frequently. The correct solution is to tell gcc
* to keep the stack version of the affected variables up to date, by
* using the "volatile" keyword. Here endeth the lesson.
*/
#include "config.h" /* configure cares about HAVE_PROGRESSIVE_JPEG */
#include <glib.h> /* We want glib.h first because of some
@ -125,6 +142,7 @@
#include "libgimp/stdplugins-intl.h"
#include <signal.h>
#define SCALE_WIDTH 125
@ -368,6 +386,11 @@ run (char *name,
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
if (strcmp (name, "file_jpeg_load") == 0)
{
INIT_I18N();
@ -699,7 +722,7 @@ load_image (char *filename,
struct my_error_mgr jerr;
FILE *infile;
guchar *buf;
guchar *padded_buf = NULL;
guchar * volatile padded_buf = NULL;
guchar **rowbuf;
char *name;
int image_type;
@ -710,8 +733,8 @@ load_image (char *filename,
#ifdef GIMP_HAVE_PARASITES
JpegSaveVals local_save_vals;
Parasite *comment_parasite = NULL;
Parasite *vals_parasite = NULL;
Parasite * volatile comment_parasite = NULL;
Parasite * volatile vals_parasite = NULL;
#endif /* GIMP_HAVE_PARASITES */
@ -775,6 +798,7 @@ load_image (char *filename,
{
char *string = local_image_comments->str;
g_string_free (local_image_comments,FALSE);
local_image_comments = NULL;
comment_parasite = parasite_new ("gimp-comment", PARASITE_PERSISTENT,
strlen (string) + 1, string);
}

View File

@ -103,6 +103,23 @@
* changed.
*/
/*
* 22-DEC-99 - volatiles added
* - Austin Donnelly <austin@gimp.org>
*
* When gcc complains a variable may be clobbered by a longjmp or
* vfork, it means the following: setjmp() was called by the JPEG
* library for error recovery purposes, but gcc is keeping some
* variables in registers without updating the memory locations on the
* stack consistently. If JPEG error recovery is every invoked, the
* values of these variable will be inconsistent. This is almost
* always a bug, but not one that's commonly seen unless JPEG recovery
* code is exercised frequently. The correct solution is to tell gcc
* to keep the stack version of the affected variables up to date, by
* using the "volatile" keyword. Here endeth the lesson.
*/
#include "config.h" /* configure cares about HAVE_PROGRESSIVE_JPEG */
#include <glib.h> /* We want glib.h first because of some
@ -125,6 +142,7 @@
#include "libgimp/stdplugins-intl.h"
#include <signal.h>
#define SCALE_WIDTH 125
@ -368,6 +386,11 @@ run (char *name,
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
if (strcmp (name, "file_jpeg_load") == 0)
{
INIT_I18N();
@ -699,7 +722,7 @@ load_image (char *filename,
struct my_error_mgr jerr;
FILE *infile;
guchar *buf;
guchar *padded_buf = NULL;
guchar * volatile padded_buf = NULL;
guchar **rowbuf;
char *name;
int image_type;
@ -710,8 +733,8 @@ load_image (char *filename,
#ifdef GIMP_HAVE_PARASITES
JpegSaveVals local_save_vals;
Parasite *comment_parasite = NULL;
Parasite *vals_parasite = NULL;
Parasite * volatile comment_parasite = NULL;
Parasite * volatile vals_parasite = NULL;
#endif /* GIMP_HAVE_PARASITES */
@ -775,6 +798,7 @@ load_image (char *filename,
{
char *string = local_image_comments->str;
g_string_free (local_image_comments,FALSE);
local_image_comments = NULL;
comment_parasite = parasite_new ("gimp-comment", PARASITE_PERSISTENT,
strlen (string) + 1, string);
}

View File

@ -103,6 +103,23 @@
* changed.
*/
/*
* 22-DEC-99 - volatiles added
* - Austin Donnelly <austin@gimp.org>
*
* When gcc complains a variable may be clobbered by a longjmp or
* vfork, it means the following: setjmp() was called by the JPEG
* library for error recovery purposes, but gcc is keeping some
* variables in registers without updating the memory locations on the
* stack consistently. If JPEG error recovery is every invoked, the
* values of these variable will be inconsistent. This is almost
* always a bug, but not one that's commonly seen unless JPEG recovery
* code is exercised frequently. The correct solution is to tell gcc
* to keep the stack version of the affected variables up to date, by
* using the "volatile" keyword. Here endeth the lesson.
*/
#include "config.h" /* configure cares about HAVE_PROGRESSIVE_JPEG */
#include <glib.h> /* We want glib.h first because of some
@ -125,6 +142,7 @@
#include "libgimp/stdplugins-intl.h"
#include <signal.h>
#define SCALE_WIDTH 125
@ -368,6 +386,11 @@ run (char *name,
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
if (strcmp (name, "file_jpeg_load") == 0)
{
INIT_I18N();
@ -699,7 +722,7 @@ load_image (char *filename,
struct my_error_mgr jerr;
FILE *infile;
guchar *buf;
guchar *padded_buf = NULL;
guchar * volatile padded_buf = NULL;
guchar **rowbuf;
char *name;
int image_type;
@ -710,8 +733,8 @@ load_image (char *filename,
#ifdef GIMP_HAVE_PARASITES
JpegSaveVals local_save_vals;
Parasite *comment_parasite = NULL;
Parasite *vals_parasite = NULL;
Parasite * volatile comment_parasite = NULL;
Parasite * volatile vals_parasite = NULL;
#endif /* GIMP_HAVE_PARASITES */
@ -775,6 +798,7 @@ load_image (char *filename,
{
char *string = local_image_comments->str;
g_string_free (local_image_comments,FALSE);
local_image_comments = NULL;
comment_parasite = parasite_new ("gimp-comment", PARASITE_PERSISTENT,
strlen (string) + 1, string);
}

View File

@ -103,6 +103,23 @@
* changed.
*/
/*
* 22-DEC-99 - volatiles added
* - Austin Donnelly <austin@gimp.org>
*
* When gcc complains a variable may be clobbered by a longjmp or
* vfork, it means the following: setjmp() was called by the JPEG
* library for error recovery purposes, but gcc is keeping some
* variables in registers without updating the memory locations on the
* stack consistently. If JPEG error recovery is every invoked, the
* values of these variable will be inconsistent. This is almost
* always a bug, but not one that's commonly seen unless JPEG recovery
* code is exercised frequently. The correct solution is to tell gcc
* to keep the stack version of the affected variables up to date, by
* using the "volatile" keyword. Here endeth the lesson.
*/
#include "config.h" /* configure cares about HAVE_PROGRESSIVE_JPEG */
#include <glib.h> /* We want glib.h first because of some
@ -125,6 +142,7 @@
#include "libgimp/stdplugins-intl.h"
#include <signal.h>
#define SCALE_WIDTH 125
@ -368,6 +386,11 @@ run (char *name,
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
if (strcmp (name, "file_jpeg_load") == 0)
{
INIT_I18N();
@ -699,7 +722,7 @@ load_image (char *filename,
struct my_error_mgr jerr;
FILE *infile;
guchar *buf;
guchar *padded_buf = NULL;
guchar * volatile padded_buf = NULL;
guchar **rowbuf;
char *name;
int image_type;
@ -710,8 +733,8 @@ load_image (char *filename,
#ifdef GIMP_HAVE_PARASITES
JpegSaveVals local_save_vals;
Parasite *comment_parasite = NULL;
Parasite *vals_parasite = NULL;
Parasite * volatile comment_parasite = NULL;
Parasite * volatile vals_parasite = NULL;
#endif /* GIMP_HAVE_PARASITES */
@ -775,6 +798,7 @@ load_image (char *filename,
{
char *string = local_image_comments->str;
g_string_free (local_image_comments,FALSE);
local_image_comments = NULL;
comment_parasite = parasite_new ("gimp-comment", PARASITE_PERSISTENT,
strlen (string) + 1, string);
}

View File

@ -103,6 +103,23 @@
* changed.
*/
/*
* 22-DEC-99 - volatiles added
* - Austin Donnelly <austin@gimp.org>
*
* When gcc complains a variable may be clobbered by a longjmp or
* vfork, it means the following: setjmp() was called by the JPEG
* library for error recovery purposes, but gcc is keeping some
* variables in registers without updating the memory locations on the
* stack consistently. If JPEG error recovery is every invoked, the
* values of these variable will be inconsistent. This is almost
* always a bug, but not one that's commonly seen unless JPEG recovery
* code is exercised frequently. The correct solution is to tell gcc
* to keep the stack version of the affected variables up to date, by
* using the "volatile" keyword. Here endeth the lesson.
*/
#include "config.h" /* configure cares about HAVE_PROGRESSIVE_JPEG */
#include <glib.h> /* We want glib.h first because of some
@ -125,6 +142,7 @@
#include "libgimp/stdplugins-intl.h"
#include <signal.h>
#define SCALE_WIDTH 125
@ -368,6 +386,11 @@ run (char *name,
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
if (strcmp (name, "file_jpeg_load") == 0)
{
INIT_I18N();
@ -699,7 +722,7 @@ load_image (char *filename,
struct my_error_mgr jerr;
FILE *infile;
guchar *buf;
guchar *padded_buf = NULL;
guchar * volatile padded_buf = NULL;
guchar **rowbuf;
char *name;
int image_type;
@ -710,8 +733,8 @@ load_image (char *filename,
#ifdef GIMP_HAVE_PARASITES
JpegSaveVals local_save_vals;
Parasite *comment_parasite = NULL;
Parasite *vals_parasite = NULL;
Parasite * volatile comment_parasite = NULL;
Parasite * volatile vals_parasite = NULL;
#endif /* GIMP_HAVE_PARASITES */
@ -775,6 +798,7 @@ load_image (char *filename,
{
char *string = local_image_comments->str;
g_string_free (local_image_comments,FALSE);
local_image_comments = NULL;
comment_parasite = parasite_new ("gimp-comment", PARASITE_PERSISTENT,
strlen (string) + 1, string);
}