|
|
@@ -54,23 +54,22 @@ BEGIN_JUCE_NAMESPACE |
|
|
|
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
static void silentErrorCallback1 (j_common_ptr)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
struct JPEGDecodingFailure {};
|
|
|
|
|
|
|
|
static void silentErrorCallback2 (j_common_ptr, int)
|
|
|
|
static void fatalErrorHandler (j_common_ptr)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
throw JPEGDecodingFailure();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void silentErrorCallback3 (j_common_ptr, char*)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
static void silentErrorCallback1 (j_common_ptr) {}
|
|
|
|
static void silentErrorCallback2 (j_common_ptr, int) {}
|
|
|
|
static void silentErrorCallback3 (j_common_ptr, char*) {}
|
|
|
|
|
|
|
|
static void setupSilentErrorHandler (struct jpeg_error_mgr& err)
|
|
|
|
{
|
|
|
|
zerostruct (err);
|
|
|
|
|
|
|
|
err.error_exit = silentErrorCallback1;
|
|
|
|
err.error_exit = fatalErrorHandler;
|
|
|
|
err.emit_message = silentErrorCallback2;
|
|
|
|
err.output_message = silentErrorCallback1;
|
|
|
|
err.format_message = silentErrorCallback3;
|
|
|
@@ -124,47 +123,52 @@ Image* juce_loadJPEGImageFromStream (InputStream& in) throw() |
|
|
|
jpegDecompStruct.src->next_input_byte = (const unsigned char*) mb.getData();
|
|
|
|
jpegDecompStruct.src->bytes_in_buffer = mb.getSize();
|
|
|
|
|
|
|
|
jpeg_read_header (&jpegDecompStruct, TRUE);
|
|
|
|
try
|
|
|
|
{
|
|
|
|
jpeg_read_header (&jpegDecompStruct, TRUE);
|
|
|
|
|
|
|
|
jpeg_calc_output_dimensions (&jpegDecompStruct);
|
|
|
|
jpeg_calc_output_dimensions (&jpegDecompStruct);
|
|
|
|
|
|
|
|
const int width = jpegDecompStruct.output_width;
|
|
|
|
const int height = jpegDecompStruct.output_height;
|
|
|
|
const int width = jpegDecompStruct.output_width;
|
|
|
|
const int height = jpegDecompStruct.output_height;
|
|
|
|
|
|
|
|
jpegDecompStruct.out_color_space = JCS_RGB;
|
|
|
|
jpegDecompStruct.out_color_space = JCS_RGB;
|
|
|
|
|
|
|
|
JSAMPARRAY buffer
|
|
|
|
= (*jpegDecompStruct.mem->alloc_sarray) ((j_common_ptr) &jpegDecompStruct,
|
|
|
|
JPOOL_IMAGE,
|
|
|
|
width * 3, 1);
|
|
|
|
JSAMPARRAY buffer
|
|
|
|
= (*jpegDecompStruct.mem->alloc_sarray) ((j_common_ptr) &jpegDecompStruct,
|
|
|
|
JPOOL_IMAGE,
|
|
|
|
width * 3, 1);
|
|
|
|
|
|
|
|
if (jpeg_start_decompress (&jpegDecompStruct))
|
|
|
|
{
|
|
|
|
image = new Image (Image::RGB, width, height, false);
|
|
|
|
|
|
|
|
for (int y = 0; y < height; ++y)
|
|
|
|
if (jpeg_start_decompress (&jpegDecompStruct))
|
|
|
|
{
|
|
|
|
jpeg_read_scanlines (&jpegDecompStruct, buffer, 1);
|
|
|
|
|
|
|
|
int stride, pixelStride;
|
|
|
|
uint8* pixels = image->lockPixelDataReadWrite (0, y, width, 1, stride, pixelStride);
|
|
|
|
const uint8* src = *buffer;
|
|
|
|
uint8* dest = pixels;
|
|
|
|
image = new Image (Image::RGB, width, height, false);
|
|
|
|
|
|
|
|
for (int i = width; --i >= 0;)
|
|
|
|
for (int y = 0; y < height; ++y)
|
|
|
|
{
|
|
|
|
((PixelRGB*) dest)->setARGB (0, src[0], src[1], src[2]);
|
|
|
|
dest += pixelStride;
|
|
|
|
src += 3;
|
|
|
|
jpeg_read_scanlines (&jpegDecompStruct, buffer, 1);
|
|
|
|
|
|
|
|
int stride, pixelStride;
|
|
|
|
uint8* pixels = image->lockPixelDataReadWrite (0, y, width, 1, stride, pixelStride);
|
|
|
|
const uint8* src = *buffer;
|
|
|
|
uint8* dest = pixels;
|
|
|
|
|
|
|
|
for (int i = width; --i >= 0;)
|
|
|
|
{
|
|
|
|
((PixelRGB*) dest)->setARGB (0, src[0], src[1], src[2]);
|
|
|
|
dest += pixelStride;
|
|
|
|
src += 3;
|
|
|
|
}
|
|
|
|
|
|
|
|
image->releasePixelDataReadWrite (pixels);
|
|
|
|
}
|
|
|
|
|
|
|
|
image->releasePixelDataReadWrite (pixels);
|
|
|
|
jpeg_finish_decompress (&jpegDecompStruct);
|
|
|
|
}
|
|
|
|
|
|
|
|
jpeg_finish_decompress (&jpegDecompStruct);
|
|
|
|
jpeg_destroy_decompress (&jpegDecompStruct);
|
|
|
|
}
|
|
|
|
|
|
|
|
jpeg_destroy_decompress (&jpegDecompStruct);
|
|
|
|
catch (...)
|
|
|
|
{}
|
|
|
|
}
|
|
|
|
|
|
|
|
return image;
|
|
|
|