void
JPEG_DECOMPRESS_MEM(rgba_8888)(
PCHAR
src_buf,
int
size,
PCHAR
dst_buf) {
struct
jpeg_decompress_struct cinfo;
struct
jpeg_error_mgr err;
JSAMPARRAY buffer;
cinfo.err = jpeg_std_error(&err);
jpeg_create_decompress(&cinfo);
jpeg_mem_src(&cinfo, src_buf, size);
jpeg_read_header(&cinfo, TRUE);
jpeg_start_decompress(&cinfo);
int
bmp_w = cinfo.output_width;
int
bmp_h = cinfo.output_height;
int
bmp_output_cmt = cinfo.output_components;
int
row_stride = bmp_w * bmp_output_cmt;
int
row_4_stride = bmp_w * 4;
buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE,
row_stride, 1);
int
y = 0;
PCHAR
p;
while
(cinfo.output_scanline < bmp_h) {
jpeg_read_scanlines(&cinfo, buffer, 1);
p = buffer[0];
int
w = 0;
int
i = 0;
for
(; w < row_4_stride; w += 4, i += 3) {
*(dst_buf + row_4_stride * y + w) = *(p + i);
*(dst_buf + row_4_stride * y + w + 1) = *(p + i + 1);
*(dst_buf + row_4_stride * y + w + 2) = *(p + i + 2);
*(dst_buf + row_4_stride * y + w + 3) = 0xff;
}
y++;
}
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
}