46 #define ST_ALPHA(x) (((x) * 128 + 127) / 255) 49 #define INPUT_BUF_SIZE 4096 54 #define DBG(x) STB_SPDebugWrite x 70 struct jpeg_error_mgr pub;
71 jmp_buf setjmp_buffer;
77 struct jpeg_source_mgr pub;
81 BOOLEAN start_of_file;
93 static BOOLEAN JPGGetImageSize(U8BIT *image_data, U32BIT data_size, U16BIT *pixel_width,
94 U16BIT *pixel_height, U32BIT *row_bytes);
95 static BOOLEAN JPGConvertImage(U8BIT *image_data, U32BIT data_size, U8BIT *output_data);
97 static void my_error_exit( j_common_ptr cinfo );
98 static void jobs_stdio_src(j_decompress_ptr cinfo,
S_PSEUDO_FILE *infile);
99 static void init_source(j_decompress_ptr cinfo);
100 static boolean fill_input_buffer(j_decompress_ptr cinfo);
101 static void skip_input_data(j_decompress_ptr cinfo,
long num_bytes);
102 static void term_source(j_decompress_ptr cinfo);
119 U32BIT *output_data_size, U16BIT *pixel_width, U16BIT *pixel_height)
128 *output_data_size = 0;
130 if ((image_data != NULL) && (image_data_size > 0))
132 if (JPGGetImageSize(image_data, image_data_size, pixel_width, pixel_height, &rowbytes))
134 DBG((
"STB_IMGConvertJPEG: pixel_width=%u, pixel_height=%u, rowbytes=%lu",
135 *pixel_width, *pixel_height, rowbytes));
138 *output_data_size = rowbytes * *pixel_height;
141 if (*output_data != NULL)
143 retval = JPGConvertImage(image_data, image_data_size, *output_data);
146 DBG((
"STB_IMGConvertJPEG: Failed to decompress image"));
150 *output_data_size = 0;
172 static BOOLEAN JPGGetImageSize(U8BIT *image_data, U32BIT data_size, U16BIT *pixel_width,
173 U16BIT *pixel_height, U32BIT *row_bytes)
176 struct jpeg_decompress_struct cinfo;
180 FUNCTION_START(JPGGetImageSize);
184 if ((image_data != NULL) && (data_size > 0))
186 cinfo.err = jpeg_std_error(&jerr.pub);
187 jerr.pub.error_exit = my_error_exit;
189 if (setjmp(jerr.setjmp_buffer))
193 jpeg_destroy_decompress(&cinfo);
197 pseudo_file.data = image_data;
198 pseudo_file.posn = 0;
199 pseudo_file.left = data_size;
201 jpeg_create_decompress(&cinfo);
202 jobs_stdio_src( &cinfo, &pseudo_file );
204 jpeg_read_header(&cinfo, TRUE);
206 *pixel_width = cinfo.output_width;
207 *pixel_height = cinfo.output_height;
210 *row_bytes = cinfo.output_width *
sizeof(U16BIT);
212 *row_bytes = cinfo.output_width *
sizeof(U32BIT);
215 jpeg_destroy_decompress(&cinfo);
219 FUNCTION_FINISH(JPGGetImageSize);
231 static BOOLEAN JPGConvertImage(U8BIT *image_data, U32BIT data_size, U8BIT *output_data)
234 struct jpeg_decompress_struct cinfo;
239 U8BIT red, green, blue;
250 FUNCTION_START(JPGConvertImage);
254 if ((image_data != NULL) && (data_size > 0))
256 cinfo.err = jpeg_std_error(&jerr.pub);
257 jerr.pub.error_exit = my_error_exit;
259 if (setjmp(jerr.setjmp_buffer))
263 jpeg_destroy_decompress(&cinfo);
267 pseudo_file.data = image_data;
268 pseudo_file.posn = 0;
269 pseudo_file.left = data_size;
271 jpeg_create_decompress(&cinfo);
272 jobs_stdio_src( &cinfo, &pseudo_file );
274 jpeg_read_header(&cinfo, TRUE);
277 row_ptr =
STB_GetMemory(cinfo.output_width * cinfo.output_components);
280 jpeg_start_decompress(&cinfo);
283 dest_line = (U16BIT *)output_data;
285 dest_line = (U32BIT *)output_data;
289 while (cinfo.output_scanline < cinfo.output_height)
291 if (jpeg_read_scanlines(&cinfo, &row_ptr, 1) == 1)
293 if (cinfo.output_components == 3)
296 for (pixel = cinfo.output_width, dest = dest_line, src = row_ptr; pixel > 0;
297 dest++, src += 3, pixel--)
304 *dest = (*dest << 4) | (red >> 4);
305 *dest = (*dest << 4) | (green >> 4);
306 *dest = (*dest << 4) | (blue >> 4);
309 alpha = ST_ALPHA(0xff);
313 *dest = (alpha << 24) | (red << 16) | (green << 8) | blue;
320 jpeg_finish_decompress(&cinfo);
325 jpeg_destroy_decompress(&cinfo);
329 FUNCTION_FINISH(JPGConvertImage);
334 static void my_error_exit( j_common_ptr cinfo )
337 my_error_ptr myerr = (my_error_ptr) cinfo->err;
341 (*cinfo->err->output_message)(cinfo);
344 longjmp(myerr->setjmp_buffer, 1);
347 static void jobs_stdio_src(j_decompress_ptr cinfo,
S_PSEUDO_FILE *infile)
358 if (cinfo->src == NULL)
361 cinfo->src = (
struct jpeg_source_mgr *)(*cinfo->mem->alloc_small)((j_common_ptr)cinfo,
366 src->buffer = (JOCTET *)(*cinfo->mem->alloc_small)((j_common_ptr) cinfo,
367 JPOOL_PERMANENT, INPUT_BUF_SIZE *
sizeof(JOCTET));
371 src->pub.init_source = init_source;
372 src->pub.fill_input_buffer = fill_input_buffer;
373 src->pub.skip_input_data = skip_input_data;
374 src->pub.resync_to_restart = jpeg_resync_to_restart;
375 src->pub.term_source = term_source;
376 src->infile = infile;
377 src->pub.bytes_in_buffer = 0;
378 src->pub.next_input_byte = NULL;
381 static void init_source(j_decompress_ptr cinfo)
389 src->start_of_file = TRUE;
425 static boolean fill_input_buffer(j_decompress_ptr cinfo)
429 U32BIT nbytes = INPUT_BUF_SIZE;
431 if (pseudo_file->left < INPUT_BUF_SIZE)
433 nbytes = pseudo_file->left;
436 if (src->start_of_file)
439 ERREXIT(cinfo, JERR_INPUT_EMPTY);
441 WARNMS(cinfo, JWRN_JPEG_EOF);
443 src->buffer[0] = (JOCTET) 0xFF;
444 src->buffer[1] = (JOCTET) JPEG_EOI;
449 memcpy( src->buffer, pseudo_file->data + pseudo_file->posn, nbytes );
450 pseudo_file->posn += nbytes;
451 pseudo_file->left -= nbytes;
453 src->pub.next_input_byte = src->buffer;
454 src->pub.bytes_in_buffer = nbytes;
455 src->start_of_file = FALSE;
472 static void skip_input_data(j_decompress_ptr cinfo,
long num_bytes)
482 while (num_bytes > (
long) src->pub.bytes_in_buffer)
484 num_bytes -= (long) src->pub.bytes_in_buffer;
485 (
void) fill_input_buffer(cinfo);
490 src->pub.next_input_byte += (size_t) num_bytes;
491 src->pub.bytes_in_buffer -= (size_t) num_bytes;
513 static void term_source(j_decompress_ptr cinfo)
516 USE_UNWANTED_PARAM(cinfo);
void * STB_GetMemory(U32BIT bytes)
Attempts to allocate memory from the heap.
void STB_FreeMemory(void *addr)
Releases previously allocated heap memory.
Debug functions header file.
BOOLEAN STB_IMGConvertJPEG(U8BIT *image_data, U32BIT image_data_size, U8BIT **output_data, U32BIT *output_data_size, U16BIT *pixel_width, U16BIT *pixel_height)
Converts the given JPEG image data to a bitmap image that can be displayed on-screen, but no scaling is applied.
System Wide Global Technical Data Type Definitions.
Header file - Function prototypes for heap memory.