diff --git a/src/osgPlugins/jpeg/GNUmakefile b/src/osgPlugins/jpeg/GNUmakefile index 19a317b3a..b0a0a5557 100644 --- a/src/osgPlugins/jpeg/GNUmakefile +++ b/src/osgPlugins/jpeg/GNUmakefile @@ -4,9 +4,7 @@ include $(TOPDIR)/Make/makedefs CXXFILES =\ ReaderWriterJPEG.cpp\ -ifneq ($(OS),HP-UX) -INC += -I/usr/local/include/ -else +ifeq ($(OS),HP-UX) INC += $(JPEG_INCLUDE) endif diff --git a/src/osgPlugins/jpeg/ReaderWriterJPEG.cpp b/src/osgPlugins/jpeg/ReaderWriterJPEG.cpp index a6633102f..3c1f22b0c 100644 --- a/src/osgPlugins/jpeg/ReaderWriterJPEG.cpp +++ b/src/osgPlugins/jpeg/ReaderWriterJPEG.cpp @@ -59,48 +59,10 @@ extern "C" static int jpegerror = ERR_NO_ERROR; -int -simage_jpeg_error(char * buffer, int buflen) -{ - switch (jpegerror) - { - case ERR_OPEN: - strncpy(buffer, "JPEG loader: Error opening file", buflen); - break; - case ERR_MEM: - strncpy(buffer, "JPEG loader: Out of memory error", buflen); - break; - case ERR_JPEGLIB: - strncpy(buffer, "JPEG loader: Illegal jpeg file", buflen); - break; - } - return jpegerror; -} - - -struct my_error_mgr -{ - struct jpeg_error_mgr pub; /* "public" fields */ - - jmp_buf setjmp_buffer; /* for return to caller */ -}; - -typedef struct my_error_mgr * my_error_ptr; - static void my_error_exit (j_common_ptr cinfo) { - /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */ - my_error_ptr myerr = (my_error_ptr) cinfo->err; - - /* Always display the message. */ - /* We could postpone this until after returning, if we chose. */ - /*(*cinfo->err->output_message) (cinfo);*/ - - /* FIXME: get error messahe from jpeglib */ - - /* Return control to the setjmp point */ - longjmp(myerr->setjmp_buffer, 1); + throw cinfo; } @@ -144,7 +106,8 @@ int *numComponents_ret) * Note that this struct must live as long as the main JPEG parameter * struct, to avoid dangling-pointer problems. */ - struct my_error_mgr jerr; + struct jpeg_error_mgr jerr; + /* More stuff */ FILE * infile; /* source file */ JSAMPARRAY rowbuffer; /* Output row buffer */ @@ -166,136 +129,144 @@ int *numComponents_ret) /* Step 1: allocate and initialize JPEG decompression object */ - /* We set up the normal JPEG error routines, then override error_exit. */ - cinfo.err = jpeg_std_error(&jerr.pub); - jerr.pub.error_exit = my_error_exit; - /* Establish the setjmp return context for my_error_exit to use. */ - if (setjmp(jerr.setjmp_buffer)) - { - /* If we get here, the JPEG code has signaled an error. - * We need to clean up the JPEG object, close the input file, and return. - */ - jpegerror = ERR_JPEGLIB; - jpeg_destroy_decompress(&cinfo); - fclose(infile); - //if (buffer) delete [] buffer; - return NULL; - } - // used to be before setjump above, but have moved to after to avoid compile warnings. unsigned char *buffer = NULL; - /* Now we can initialize the JPEG decompression object. */ - jpeg_create_decompress(&cinfo); + /* We set up the normal JPEG error routines, then override error_exit. */ + cinfo.err = jpeg_std_error(&jerr); + jerr.error_exit = my_error_exit; + + try { + - /* Step 2: specify data source (eg, a file) */ + /* Now we can initialize the JPEG decompression object. */ + jpeg_create_decompress(&cinfo); - jpeg_stdio_src(&cinfo, infile); + /* Step 2: specify data source (eg, a file) */ - /* Step 3: read file parameters with jpeg_read_header() */ + jpeg_stdio_src(&cinfo, infile); - (void) jpeg_read_header(&cinfo, TRUE); - /* We can ignore the return value from jpeg_read_header since - * (a) suspension is not possible with the stdio data source, and - * (b) we passed TRUE to reject a tables-only JPEG file as an error. - * See libjpeg.doc for more info. - */ + /* Step 3: read file parameters with jpeg_read_header() */ - /* Step 4: set parameters for decompression */ - /* In this example, we don't need to change any of the defaults set by - * jpeg_read_header(), so we do nothing here. - */ + (void) jpeg_read_header(&cinfo, TRUE); + /* We can ignore the return value from jpeg_read_header since + * (a) suspension is not possible with the stdio data source, and + * (b) we passed TRUE to reject a tables-only JPEG file as an error. + * See libjpeg.doc for more info. + */ - /* Step 5: Start decompressor */ - if (cinfo.jpeg_color_space == JCS_GRAYSCALE) - { - format = 1; - cinfo.out_color_space = JCS_GRAYSCALE; + /* Step 4: set parameters for decompression */ + /* In this example, we don't need to change any of the defaults set by + * jpeg_read_header(), so we do nothing here. + */ + + /* Step 5: Start decompressor */ + if (cinfo.jpeg_color_space == JCS_GRAYSCALE) + { + format = 1; + cinfo.out_color_space = JCS_GRAYSCALE; + } + else /* use rgb */ + { + format = 3; + cinfo.out_color_space = JCS_RGB; + } + + (void) jpeg_start_decompress(&cinfo); + /* We can ignore the return value since suspension is not possible + * with the stdio data source. + */ + + /* We may need to do some setup of our own at this point before reading + * the data. After jpeg_start_decompress() we have the correct scaled + * output image dimensions available, as well as the output colormap + * if we asked for color quantization. + * In this example, we need to make an output work buffer of the right size. + */ + /* JSAMPLEs per row in output buffer */ + row_stride = cinfo.output_width * cinfo.output_components; + /* Make a one-row-high sample array that will go away when done with image */ + rowbuffer = (*cinfo.mem->alloc_sarray) + ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); + width = cinfo.output_width; + height = cinfo.output_height; + buffer = currPtr = new unsigned char [width*height*cinfo.output_components]; + + /* Step 6: while (scan lines remain to be read) */ + /* jpeg_read_scanlines(...); */ + + /* Here we use the library's state variable cinfo.output_scanline as the + * loop counter, so that we don't have to keep track ourselves. + */ + + /* flip image upside down */ + if (buffer) + { + currPtr = buffer + row_stride * (cinfo.output_height-1); + + while (cinfo.output_scanline < cinfo.output_height) + { + /* jpeg_read_scanlines expects an array of pointers to scanlines. + * Here the array is only one element long, but you could ask for + * more than one scanline at a time if that's more convenient. + */ + (void) jpeg_read_scanlines(&cinfo, rowbuffer, 1); + /* Assume put_scanline_someplace wants a pointer and sample count. */ + currPtr = copyScanline(currPtr, rowbuffer[0], row_stride); + } + } + /* Step 7: Finish decompression */ + + (void) jpeg_finish_decompress(&cinfo); + /* We can ignore the return value since suspension is not possible + * with the stdio data source. + */ + + /* Step 8: Release JPEG decompression object */ + + /* This is an important step since it will release a good deal of memory. */ + jpeg_destroy_decompress(&cinfo); + + /* After finish_decompress, we can close the input file. + * Here we postpone it until after no more JPEG errors are possible, + * so as to simplify the setjmp error logic above. (Actually, I don't + * think that jpeg_destroy can do an error exit, but why assume anything...) + */ + fclose(infile); + + /* At this point you may want to check to see whether any corrupt-data + * warnings occurred (test whether jerr.pub.num_warnings is nonzero). + */ + + /* And we're done! */ + if (buffer) + { + *width_ret = width; + *height_ret = height; + *numComponents_ret = format; + } + else + { + jpegerror = ERR_MEM; + } + return buffer; } - else /* use rgb */ + catch (j_common_ptr) { - format = 3; - cinfo.out_color_space = JCS_RGB; + + std::cout << " Here we are"<alloc_sarray) - ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); - width = cinfo.output_width; - height = cinfo.output_height; - buffer = currPtr = new unsigned char [width*height*cinfo.output_components]; - - /* Step 6: while (scan lines remain to be read) */ - /* jpeg_read_scanlines(...); */ - - /* Here we use the library's state variable cinfo.output_scanline as the - * loop counter, so that we don't have to keep track ourselves. - */ - - /* flip image upside down */ - if (buffer) - { - currPtr = buffer + row_stride * (cinfo.output_height-1); - - while (cinfo.output_scanline < cinfo.output_height) - { - /* jpeg_read_scanlines expects an array of pointers to scanlines. - * Here the array is only one element long, but you could ask for - * more than one scanline at a time if that's more convenient. - */ - (void) jpeg_read_scanlines(&cinfo, rowbuffer, 1); - /* Assume put_scanline_someplace wants a pointer and sample count. */ - currPtr = copyScanline(currPtr, rowbuffer[0], row_stride); - } - } - /* Step 7: Finish decompression */ - - (void) jpeg_finish_decompress(&cinfo); - /* We can ignore the return value since suspension is not possible - * with the stdio data source. - */ - - /* Step 8: Release JPEG decompression object */ - - /* This is an important step since it will release a good deal of memory. */ - jpeg_destroy_decompress(&cinfo); - - /* After finish_decompress, we can close the input file. - * Here we postpone it until after no more JPEG errors are possible, - * so as to simplify the setjmp error logic above. (Actually, I don't - * think that jpeg_destroy can do an error exit, but why assume anything...) - */ - fclose(infile); - - /* At this point you may want to check to see whether any corrupt-data - * warnings occurred (test whether jerr.pub.num_warnings is nonzero). - */ - - /* And we're done! */ - if (buffer) - { - *width_ret = width; - *height_ret = height; - *numComponents_ret = format; - } - else - { - jpegerror = ERR_MEM; - } - return buffer; } @@ -318,7 +289,17 @@ class ReaderWriterJPEG : public osgDB::ReaderWriter imageData = simage_jpeg_load(fileName.c_str(),&width_ret,&height_ret,&numComponents_ret); - if (imageData==NULL) return ReadResult::FILE_NOT_HANDLED; + if (imageData==NULL) + { + switch (jpegerror) + { + case ERR_OPEN: return ReadResult("JPEG loader: Error opening file"); + case ERR_MEM: return ReadResult("JPEG loader: Out of memory error"); + case ERR_JPEGLIB: return ReadResult("JPEG loader: Illegal jpeg file"); + } + return ReadResult::FILE_NOT_HANDLED; + } + int s = width_ret; int t = height_ret;