diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2004-01-25 20:39:35 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2004-01-25 20:39:35 +0000 |
commit | b49f18f8911155b3d7d0c3bb61bdf3527f7839c1 (patch) | |
tree | 3df0e32ace7553f9a6079d27257bda832479c0b6 /riscos | |
parent | 986b650983f4c8ad3919153d13b9782f738d00fb (diff) | |
download | netsurf-b49f18f8911155b3d7d0c3bb61bdf3527f7839c1.tar.gz netsurf-b49f18f8911155b3d7d0c3bb61bdf3527f7839c1.tar.bz2 |
[project @ 2004-01-25 20:39:35 by jmb]
Override jpeglib's error handling.
svn path=/import/netsurf/; revision=504
Diffstat (limited to 'riscos')
-rw-r--r-- | riscos/jpeg.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/riscos/jpeg.c b/riscos/jpeg.c index a7b320603..086218e17 100644 --- a/riscos/jpeg.c +++ b/riscos/jpeg.c @@ -10,6 +10,7 @@ #include <string.h> #include <stdio.h> #include <stdlib.h> +#include <setjmp.h> #include "libjpeg/jpeglib.h" #include "oslib/colourtrans.h" #include "oslib/jpeg.h" @@ -83,6 +84,24 @@ static void jpeg_memory_src(j_decompress_ptr cinfo, char *ptr, unsigned long len src->bytes_in_buffer = length; } +/* Error handling stuff. + This prevents jpeglib calling exit() on a fatal error */ +struct nsjpeg_error_mgr { + struct jpeg_error_mgr pub; + jmp_buf setjmp_buffer; +}; + +typedef struct nsjpeg_error_mgr * nsjpeg_err_ptr; + +METHODDEF (void) nsjpeg_error_exit (j_common_ptr cinfo) { + + nsjpeg_err_ptr myerr = (nsjpeg_err_ptr)cinfo->err; + + (*cinfo->err->output_message) (cinfo); + + longjmp(myerr->setjmp_buffer, 1); +} + /** maps colours to 256 mode colour numbers */ static os_colour_number colour_table[4096]; @@ -127,7 +146,7 @@ void nsjpeg_process_data(struct content *c, char *data, unsigned long size) int nsjpeg_convert(struct content *c, unsigned int width, unsigned int height) { struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; + struct nsjpeg_error_mgr jerr; unsigned int line_size; unsigned char *dstcur; @@ -153,9 +172,12 @@ int nsjpeg_convert(struct content *c, unsigned int width, unsigned int height) } LOG(("beginning conversion")); - /* TODO - provide our own error handling. - jpeglib calls exit() on fatal error, which is a bit moose */ - cinfo.err = jpeg_std_error(&jerr); + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = nsjpeg_error_exit; + if (setjmp(jerr.setjmp_buffer)) { + jpeg_destroy_decompress(&cinfo); + return 1; + } jpeg_create_decompress(&cinfo); jpeg_memory_src(&cinfo, c->data.jpeg.data, c->data.jpeg.length); jpeg_read_header(&cinfo, TRUE); |