From bb7b1ae3d2102a3d9c8491d3e0ebfe54f5d0d17b Mon Sep 17 00:00:00 2001 From: Manish Singh Date: Wed, 29 Apr 1998 10:48:02 +0000 Subject: [PATCH] Updates from Adam -Yosh --- ChangeLog | 6 ++ plug-ins/animationplay/animationplay.c | 9 +- plug-ins/common/animationplay.c | 9 +- plug-ins/common/gif.c | 10 +- plug-ins/common/psd.c | 133 ++++++++++++++++--------- plug-ins/gif/gif.c | 10 +- plug-ins/psd/psd.c | 133 ++++++++++++++++--------- 7 files changed, 212 insertions(+), 98 deletions(-) diff --git a/ChangeLog b/ChangeLog index 543d1bd974..41e4657f8e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Wed Apr 29 03:46:44 PDT 1998 Manish Singh + + * plug-ins/animationplay/animationplay.c + * plug-ins/gif/gif.c + * plug-ins/psd/psd.c: updates from Adam + Wed Apr 29 01:43:30 PDT 1998 Manish Singh * app/text_tool.c: don't die on corrupted fonts. Give some diff --git a/plug-ins/animationplay/animationplay.c b/plug-ins/animationplay/animationplay.c index 2ad174aa4d..2e127e91db 100644 --- a/plug-ins/animationplay/animationplay.c +++ b/plug-ins/animationplay/animationplay.c @@ -1,5 +1,5 @@ /* - * Animation Playback plug-in version 0.94.0 + * Animation Playback plug-in version 0.94.2 * * Adam D. Moss : 1997-98 : adam@gimp.org : adam@foxbox.org * @@ -11,6 +11,9 @@ /* * REVISION HISTORY: * + * 98.04.28 : version 0.94.2 + * Fixed a time-parsing bug. + * * 98.04.05 : version 0.94.0 * Improved performance and removed flicker when shaped. * Shaped mode also works with RGB* images now. @@ -246,6 +249,8 @@ parse_ms_tag (char *str) length = strlen(str); +find_another_bra: + while ((offset */ /* @@ -23,6 +23,10 @@ /* * REVISION HISTORY * + * + * 98/04/28 + * 2.00.02 - Fixed a bug with (ms) tag parsing. + * * 98/03/16 * 2.00.01 - Fixed a long-standing bug when loading GIFs which layer * opaque frames onto transparent ones. @@ -1492,6 +1496,8 @@ parse_ms_tag (char *str) length = strlen(str); +find_another_bra: + while ((offset @@ -25,7 +25,7 @@ * * 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. + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* @@ -36,6 +36,11 @@ /* * Revision history: * + * 98.04.28 / v1.9.9.9 / Adam D. Moss + * Fixed the correct channel interlacing of 'raw' flat images. + * Thanks to Christian Kirsch and Jay Cox for spotting this. + * Changed some of the I/O routines. + * * 98.04.26 / v1.9.9.8 / Adam D. Moss * Implemented Aux-channels for layered files. Got rid * of nonsense. Improved Layer Mask padding. @@ -173,7 +178,7 @@ typedef struct PsdLayer gboolean protecttrans; gboolean visible; - gchar* name; + guchar* name; gint32 lm_x; gint32 lm_y; @@ -212,7 +217,7 @@ static PSDimage psd_image; static struct { - gchar signature[4]; + guchar signature[4]; gushort version; guchar reserved[6]; gushort channels; @@ -248,9 +253,9 @@ static const gchar *prog_name = "PSD"; static void unpack_pb_channel(FILE *fd, guchar *dst, gint32 unpackedlen, guint32 *offset); -static void decode(long clen, long uclen, gchar *src, guchar *dst, int step); +static void decode(long clen, long uclen, gchar *src, gchar *dst, int step); static void packbitsdecode(long *clenp, long uclen, - gchar *src, guchar *dst, int step); + gchar *src, gchar *dst, int step); static void cmyk2rgb(guchar *src, guchar *destp, long width, long height, int alpha); static void cmykp2rgb(guchar *src, guchar *destp, @@ -260,12 +265,14 @@ static guchar getguchar(FILE *fd, gchar *why); static gshort getgshort(FILE *fd, gchar *why); static glong getglong(FILE *fd, gchar *why); static void xfread(FILE *fd, void *buf, long len, gchar *why); +static void xfread_interlaced(FILE *fd, guchar *buf, long len, gchar *why, + gint step); static void *xmalloc(size_t n); static void read_whole_file(FILE *fd); static void reshuffle_cmap(guchar *map256); -static gchar *getpascalstring(FILE *fd, gchar *why); -void throwchunk(size_t n, FILE * fd, gchar *why); -void dumpchunk(size_t n, FILE * fd, gchar *why); +static guchar *getpascalstring(FILE *fd, guchar *why); +void throwchunk(size_t n, FILE * fd, guchar *why); +void dumpchunk(size_t n, FILE * fd, guchar *why); MAIN() @@ -1383,11 +1390,9 @@ load_image(char *name) { FILE *fd; gboolean want_aux; - char *name_buf; - unsigned char *cmykbuf; + char *name_buf, *cmykbuf; static int number = 1; - char *temp; - guchar *dest; + unsigned char *dest, *temp; long channels, nguchars; psd_imagetype imagetype; int cmyk = 0, step = 1; @@ -1787,13 +1792,16 @@ load_image(char *name) if (!cmyk) { gimp_progress_update ((double)0.50); - xfread(fd, dest, PSDheader.imgdatalen, "image data"); + xfread_interlaced(fd, dest, PSDheader.imgdatalen, + "raw image data", step); } else { gimp_progress_update ((double)0.25); cmykbuf = xmalloc(PSDheader.imgdatalen); - xfread(fd, cmykbuf, PSDheader.imgdatalen, "image data"); + xfread_interlaced(fd, cmykbuf, PSDheader.imgdatalen, + "raw cmyk image data", step); + gimp_progress_update ((double)0.50); cmykp2rgb(cmykbuf, dest, PSDheader.columns, PSDheader.rows, step > 4); @@ -1807,7 +1815,8 @@ load_image(char *name) extract_channels(dest, channels, step, image_ID, PSDheader.columns, PSDheader.rows); - goto finish_up; + + goto finish_up; /* Haha! Look! A goto! */ } else { @@ -1818,7 +1827,7 @@ load_image(char *name) if (psd_type_to_gimp_type(imagetype)==INDEXEDA_IMAGE) { - printf("@@@@ Didn't know about this.\n"); + printf("@@@@ Didn't know that this could happen...\n"); for (iter=0; iterwidth*drawable->height; iter++) { dest[iter*2+1] = 255; @@ -1867,7 +1876,7 @@ load_image(char *name) static void -decode(long clen, long uclen, char * src, guchar * dst, int step) +decode(long clen, long uclen, char * src, char * dst, int step) { gint i, j; gint32 l; @@ -1896,7 +1905,7 @@ decode(long clen, long uclen, char * src, guchar * dst, int step) * Decode a PackBits data stream. */ static void -packbitsdecode(long * clenp, long uclen, char * src, guchar * dst, int step) +packbitsdecode(long * clenp, long uclen, char * src, char * dst, int step) { gint n, b; gint32 clen = *clenp; @@ -2026,7 +2035,7 @@ cmykp2rgb(unsigned char * src, unsigned char * dst, int r, g, b, k; int i, j; long n; - guchar *rp, *gp, *bp, *kp, *ap; + char *rp, *gp, *bp, *kp, *ap; n = width * height; rp = src; @@ -2084,7 +2093,7 @@ cmyk_to_rgb(gint *c, gint *m, gint *y, gint *k) void -dumpchunk(size_t n, FILE * fd, gchar *why) +dumpchunk(size_t n, FILE * fd, guchar *why) { guint32 i; @@ -2100,9 +2109,9 @@ dumpchunk(size_t n, FILE * fd, gchar *why) void -throwchunk(size_t n, FILE * fd, gchar *why) +throwchunk(size_t n, FILE * fd, guchar *why) { - gchar *tmpchunk; + guchar *tmpchunk; if (n==0) { @@ -2128,10 +2137,10 @@ getchunk(size_t n, FILE * fd, char *why) #endif -static gchar * -getpascalstring(FILE *fd, gchar *why) +static guchar * +getpascalstring(FILE *fd, guchar *why) { - gchar *tmpchunk; + guchar *tmpchunk; guchar len; xfread(fd, &len, 1, why); @@ -2154,9 +2163,16 @@ getpascalstring(FILE *fd, gchar *why) static guchar getguchar(FILE *fd, char *why) { - guchar tmp; + gint tmp; - xfread(fd, &tmp, 1, why); + tmp = fgetc(fd); + + if (tmp == EOF) + { + printf("%s: unexpected EOF while reading '%s' chunk\n", + prog_name, why); + gimp_quit(); + } return(tmp); } @@ -2168,8 +2184,8 @@ getgshort(FILE *fd, char *why) gushort w; guchar b1, b2; - xfread(fd, &b1, 1, why); - xfread(fd, &b2, 1, why); + b1 = getguchar(fd, why); + b2 = getguchar(fd, why); w = (b1*256) + b2; @@ -2180,27 +2196,54 @@ getgshort(FILE *fd, char *why) static glong getglong(FILE *fd, char * why) { - unsigned char s1, s2, s3, s4; - gulong w; + unsigned char s1, s2, s3, s4; + gulong w; - xfread(fd, &s1, 1, why); - xfread(fd, &s2, 1, why); - xfread(fd, &s3, 1, why); - xfread(fd, &s4, 1, why); - - w = (s1*256*256*256) + (s2*256*256) + (s3*256) + s4; - - return (glong) w; + s1 = getguchar(fd, why); + s2 = getguchar(fd, why); + s3 = getguchar(fd, why); + s4 = getguchar(fd, why); + + w = (s1*256*256*256) + (s2*256*256) + (s3*256) + s4; + + return (glong) w; } static void -xfread(FILE * fd, void * buf, long len, char * why) +xfread(FILE * fd, void * buf, long len, char* why) { - if (fread(buf, len, 1, fd) == 0) { - printf("%s: unexpected EOF while reading '%s' chunk\n", - prog_name, why); - gimp_quit(); + if (fread(buf, len, 1, fd) == 0) + { + printf("%s: unexpected EOF while reading '%s' chunk\n", + prog_name, why); + gimp_quit(); + } +} + + +static void +xfread_interlaced(FILE* fd, guchar* buf, long len, gchar* why, gint step) +{ + guchar* dest; + gint pix, pos, bpplane; + + bpplane = len/step; + + if (len%step != 0) + { + printf("PSD: Stern warning: data size is not a factor of step size.\n"); + } + + for (pix=0; pix */ /* @@ -23,6 +23,10 @@ /* * REVISION HISTORY * + * + * 98/04/28 + * 2.00.02 - Fixed a bug with (ms) tag parsing. + * * 98/03/16 * 2.00.01 - Fixed a long-standing bug when loading GIFs which layer * opaque frames onto transparent ones. @@ -1492,6 +1496,8 @@ parse_ms_tag (char *str) length = strlen(str); +find_another_bra: + while ((offset @@ -25,7 +25,7 @@ * * 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. + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* @@ -36,6 +36,11 @@ /* * Revision history: * + * 98.04.28 / v1.9.9.9 / Adam D. Moss + * Fixed the correct channel interlacing of 'raw' flat images. + * Thanks to Christian Kirsch and Jay Cox for spotting this. + * Changed some of the I/O routines. + * * 98.04.26 / v1.9.9.8 / Adam D. Moss * Implemented Aux-channels for layered files. Got rid * of nonsense. Improved Layer Mask padding. @@ -173,7 +178,7 @@ typedef struct PsdLayer gboolean protecttrans; gboolean visible; - gchar* name; + guchar* name; gint32 lm_x; gint32 lm_y; @@ -212,7 +217,7 @@ static PSDimage psd_image; static struct { - gchar signature[4]; + guchar signature[4]; gushort version; guchar reserved[6]; gushort channels; @@ -248,9 +253,9 @@ static const gchar *prog_name = "PSD"; static void unpack_pb_channel(FILE *fd, guchar *dst, gint32 unpackedlen, guint32 *offset); -static void decode(long clen, long uclen, gchar *src, guchar *dst, int step); +static void decode(long clen, long uclen, gchar *src, gchar *dst, int step); static void packbitsdecode(long *clenp, long uclen, - gchar *src, guchar *dst, int step); + gchar *src, gchar *dst, int step); static void cmyk2rgb(guchar *src, guchar *destp, long width, long height, int alpha); static void cmykp2rgb(guchar *src, guchar *destp, @@ -260,12 +265,14 @@ static guchar getguchar(FILE *fd, gchar *why); static gshort getgshort(FILE *fd, gchar *why); static glong getglong(FILE *fd, gchar *why); static void xfread(FILE *fd, void *buf, long len, gchar *why); +static void xfread_interlaced(FILE *fd, guchar *buf, long len, gchar *why, + gint step); static void *xmalloc(size_t n); static void read_whole_file(FILE *fd); static void reshuffle_cmap(guchar *map256); -static gchar *getpascalstring(FILE *fd, gchar *why); -void throwchunk(size_t n, FILE * fd, gchar *why); -void dumpchunk(size_t n, FILE * fd, gchar *why); +static guchar *getpascalstring(FILE *fd, guchar *why); +void throwchunk(size_t n, FILE * fd, guchar *why); +void dumpchunk(size_t n, FILE * fd, guchar *why); MAIN() @@ -1383,11 +1390,9 @@ load_image(char *name) { FILE *fd; gboolean want_aux; - char *name_buf; - unsigned char *cmykbuf; + char *name_buf, *cmykbuf; static int number = 1; - char *temp; - guchar *dest; + unsigned char *dest, *temp; long channels, nguchars; psd_imagetype imagetype; int cmyk = 0, step = 1; @@ -1787,13 +1792,16 @@ load_image(char *name) if (!cmyk) { gimp_progress_update ((double)0.50); - xfread(fd, dest, PSDheader.imgdatalen, "image data"); + xfread_interlaced(fd, dest, PSDheader.imgdatalen, + "raw image data", step); } else { gimp_progress_update ((double)0.25); cmykbuf = xmalloc(PSDheader.imgdatalen); - xfread(fd, cmykbuf, PSDheader.imgdatalen, "image data"); + xfread_interlaced(fd, cmykbuf, PSDheader.imgdatalen, + "raw cmyk image data", step); + gimp_progress_update ((double)0.50); cmykp2rgb(cmykbuf, dest, PSDheader.columns, PSDheader.rows, step > 4); @@ -1807,7 +1815,8 @@ load_image(char *name) extract_channels(dest, channels, step, image_ID, PSDheader.columns, PSDheader.rows); - goto finish_up; + + goto finish_up; /* Haha! Look! A goto! */ } else { @@ -1818,7 +1827,7 @@ load_image(char *name) if (psd_type_to_gimp_type(imagetype)==INDEXEDA_IMAGE) { - printf("@@@@ Didn't know about this.\n"); + printf("@@@@ Didn't know that this could happen...\n"); for (iter=0; iterwidth*drawable->height; iter++) { dest[iter*2+1] = 255; @@ -1867,7 +1876,7 @@ load_image(char *name) static void -decode(long clen, long uclen, char * src, guchar * dst, int step) +decode(long clen, long uclen, char * src, char * dst, int step) { gint i, j; gint32 l; @@ -1896,7 +1905,7 @@ decode(long clen, long uclen, char * src, guchar * dst, int step) * Decode a PackBits data stream. */ static void -packbitsdecode(long * clenp, long uclen, char * src, guchar * dst, int step) +packbitsdecode(long * clenp, long uclen, char * src, char * dst, int step) { gint n, b; gint32 clen = *clenp; @@ -2026,7 +2035,7 @@ cmykp2rgb(unsigned char * src, unsigned char * dst, int r, g, b, k; int i, j; long n; - guchar *rp, *gp, *bp, *kp, *ap; + char *rp, *gp, *bp, *kp, *ap; n = width * height; rp = src; @@ -2084,7 +2093,7 @@ cmyk_to_rgb(gint *c, gint *m, gint *y, gint *k) void -dumpchunk(size_t n, FILE * fd, gchar *why) +dumpchunk(size_t n, FILE * fd, guchar *why) { guint32 i; @@ -2100,9 +2109,9 @@ dumpchunk(size_t n, FILE * fd, gchar *why) void -throwchunk(size_t n, FILE * fd, gchar *why) +throwchunk(size_t n, FILE * fd, guchar *why) { - gchar *tmpchunk; + guchar *tmpchunk; if (n==0) { @@ -2128,10 +2137,10 @@ getchunk(size_t n, FILE * fd, char *why) #endif -static gchar * -getpascalstring(FILE *fd, gchar *why) +static guchar * +getpascalstring(FILE *fd, guchar *why) { - gchar *tmpchunk; + guchar *tmpchunk; guchar len; xfread(fd, &len, 1, why); @@ -2154,9 +2163,16 @@ getpascalstring(FILE *fd, gchar *why) static guchar getguchar(FILE *fd, char *why) { - guchar tmp; + gint tmp; - xfread(fd, &tmp, 1, why); + tmp = fgetc(fd); + + if (tmp == EOF) + { + printf("%s: unexpected EOF while reading '%s' chunk\n", + prog_name, why); + gimp_quit(); + } return(tmp); } @@ -2168,8 +2184,8 @@ getgshort(FILE *fd, char *why) gushort w; guchar b1, b2; - xfread(fd, &b1, 1, why); - xfread(fd, &b2, 1, why); + b1 = getguchar(fd, why); + b2 = getguchar(fd, why); w = (b1*256) + b2; @@ -2180,27 +2196,54 @@ getgshort(FILE *fd, char *why) static glong getglong(FILE *fd, char * why) { - unsigned char s1, s2, s3, s4; - gulong w; + unsigned char s1, s2, s3, s4; + gulong w; - xfread(fd, &s1, 1, why); - xfread(fd, &s2, 1, why); - xfread(fd, &s3, 1, why); - xfread(fd, &s4, 1, why); - - w = (s1*256*256*256) + (s2*256*256) + (s3*256) + s4; - - return (glong) w; + s1 = getguchar(fd, why); + s2 = getguchar(fd, why); + s3 = getguchar(fd, why); + s4 = getguchar(fd, why); + + w = (s1*256*256*256) + (s2*256*256) + (s3*256) + s4; + + return (glong) w; } static void -xfread(FILE * fd, void * buf, long len, char * why) +xfread(FILE * fd, void * buf, long len, char* why) { - if (fread(buf, len, 1, fd) == 0) { - printf("%s: unexpected EOF while reading '%s' chunk\n", - prog_name, why); - gimp_quit(); + if (fread(buf, len, 1, fd) == 0) + { + printf("%s: unexpected EOF while reading '%s' chunk\n", + prog_name, why); + gimp_quit(); + } +} + + +static void +xfread_interlaced(FILE* fd, guchar* buf, long len, gchar* why, gint step) +{ + guchar* dest; + gint pix, pos, bpplane; + + bpplane = len/step; + + if (len%step != 0) + { + printf("PSD: Stern warning: data size is not a factor of step size.\n"); + } + + for (pix=0; pix