From 275f6e26fb609b4957bd7804f751c07d8b3f1a8a Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 29 Dec 2001 01:55:32 +0000 Subject: [PATCH] *** empty log message *** --- CHANGES | 4 ++++ IMG_jpg.c | 33 ++++++++++++++++++++++++++++++--- configure.in | 6 +++--- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index b8d0cd85..debb755e 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,8 @@ +1.2.2: +Mattias Engdegård - Fri Dec 28 17:54:31 PST 2001 + * Worked around exit() in the jpeg image library + 1.2.1: Mattias Engdegård - Tue Nov 20 08:08:53 PST 2001 * Fixed transparency in the GIF loading code diff --git a/IMG_jpg.c b/IMG_jpg.c index 7c884518..c33e6ea7 100644 --- a/IMG_jpg.c +++ b/IMG_jpg.c @@ -26,6 +26,7 @@ #include #include +#include #include "SDL_image.h" @@ -171,16 +172,42 @@ static void jpeg_SDL_RW_src (j_decompress_ptr cinfo, SDL_RWops *ctx) src->pub.next_input_byte = NULL; /* until buffer loaded */ } +struct my_error_mgr { + struct jpeg_error_mgr errmgr; + jmp_buf escape; +}; + +static void my_error_exit(j_common_ptr cinfo) +{ + struct my_error_mgr *err = (struct my_error_mgr *)cinfo->err; + longjmp(err->escape, 1); +} + +static void output_no_message(j_common_ptr cinfo) +{ + /* do nothing */ +} + /* Load a JPEG type image from an SDL datasource */ SDL_Surface *IMG_LoadJPG_RW(SDL_RWops *src) { - struct jpeg_error_mgr errmgr; struct jpeg_decompress_struct cinfo; JSAMPROW rowptr[1]; - SDL_Surface *surface; + SDL_Surface *volatile surface = NULL; + struct my_error_mgr jerr; /* Create a decompression structure and load the JPEG header */ - cinfo.err = jpeg_std_error(&errmgr); + cinfo.err = jpeg_std_error(&jerr.errmgr); + jerr.errmgr.error_exit = my_error_exit; + jerr.errmgr.output_message = output_no_message; + if(setjmp(jerr.escape)) { + /* If we get here, libjpeg found an error */ + jpeg_destroy_decompress(&cinfo); + IMG_SetError("JPEG loading error"); + SDL_FreeSurface(surface); + return NULL; + } + jpeg_create_decompress(&cinfo); jpeg_SDL_RW_src(&cinfo, src); jpeg_read_header(&cinfo, TRUE); diff --git a/configure.in b/configure.in index 84e407e5..94990f01 100644 --- a/configure.in +++ b/configure.in @@ -13,9 +13,9 @@ dnl Set various version strings - taken gratefully from the GTk sources MAJOR_VERSION=1 MINOR_VERSION=2 -MICRO_VERSION=1 -INTERFACE_AGE=0 -BINARY_AGE=1 +MICRO_VERSION=2 +INTERFACE_AGE=1 +BINARY_AGE=2 VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION AC_SUBST(MAJOR_VERSION)