18 struct jpeg_error_mgr pub;
20 jmp_buf setjmp_buffer;
26my_error_exit(j_common_ptr cinfo)
29 my_error_ptr myerr = (my_error_ptr)cinfo->err;
33 (*cinfo->err->output_message) (cinfo);
36 longjmp(myerr->setjmp_buffer, 1);
39static jpgData *_load_JPEG(
struct jpeg_decompress_struct *cinfo,
int mode)
49 jpeg_start_decompress(cinfo);
52 textureSize = cinfo->output_width*cinfo->output_height*cinfo->out_color_components;
54 if( (mode == JPG_WIDTH_FIX) && (cinfo->output_width % 4) )
55 jpg->width = cinfo->output_width - (cinfo->output_width % 4);
57 jpg->width = cinfo->output_width;
59 jpg->height = cinfo->output_height;
60 jpg->bpp = cinfo->out_color_components * 8;
61 jpg->buffer = malloc(textureSize);
63 unsigned int row_stride = textureSize/cinfo->output_height;
64 unsigned char *row_pointer = (
unsigned char *)jpg->buffer;
65 while (cinfo->output_scanline < cinfo->output_height) {
66 jpeg_read_scanlines(cinfo, (JSAMPARRAY)&row_pointer, 1);
67 row_pointer += row_stride;
70 jpeg_finish_decompress(cinfo);
75jpgData *jpgFromRAW(
void *data,
int size,
int mode)
78 struct jpeg_decompress_struct cinfo;
81 cinfo.err = jpeg_std_error(&jerr.pub);
82 jerr.pub.error_exit = my_error_exit;
83 if (setjmp(jerr.setjmp_buffer)) {
84 jpeg_destroy_decompress(&cinfo);
85 printf(
"jpgFromRAW: error during processing file\n");
88 jpeg_create_decompress(&cinfo);
89 jpeg_mem_src(&cinfo, (
void *)data, size);
90 jpeg_read_header(&cinfo, TRUE);
92 ret = _load_JPEG(&cinfo, mode);
94 jpeg_destroy_decompress(&cinfo);
99jpgData *jpgFromFilename(
const char *filename,
int mode)
107 fd = open(filename, O_RDONLY, 0);
109 printf(
"jpgOpen: error opening '%s'\n", filename);
113 size = lseek(fd, 0, SEEK_END);
114 lseek(fd, 0, SEEK_SET);
118 printf(
"jpgOpen: NOT enought memory\n");
123 ret = read(fd, data, size);
125 printf(
"jpgOpen: Error reading content\n");
132 jpg = jpgFromRAW(data, size, mode);
138jpgData *jpgFromFILE(FILE *in_file,
int mode)
141 struct jpeg_decompress_struct cinfo;
144 cinfo.err = jpeg_std_error(&jerr.pub);
145 jerr.pub.error_exit = my_error_exit;
146 if (setjmp(jerr.setjmp_buffer)) {
147 jpeg_destroy_decompress(&cinfo);
148 printf(
"jpgOpenFILE: error during processing file\n");
151 jpeg_create_decompress(&cinfo);
152 jpeg_stdio_src(&cinfo, in_file);
153 jpeg_read_header(&cinfo, TRUE);
155 jpg = _load_JPEG(&cinfo, mode);
157 jpeg_destroy_decompress(&cinfo);
162void jpgFileFromJpgData(
const char *filename,
int quality,
jpgData *jpg) {
163 struct jpeg_compress_struct cinfo;
167 cinfo.err = jpeg_std_error(&jerr.pub);
168 jerr.pub.error_exit = my_error_exit;
169 if (setjmp(jerr.setjmp_buffer)) {
170 jpeg_destroy_compress(&cinfo);
171 printf(
"jpgOpenFILE: error during processing file\n");
174 jpeg_create_compress(&cinfo);
176 if ((outfile = fopen(filename,
"wb")) == NULL) {
177 fprintf(stderr,
"can't open %s\n", filename);
181 jpeg_stdio_dest(&cinfo, outfile);
183 cinfo.image_width = jpg->width;
184 cinfo.image_height = jpg->height;
185 cinfo.input_components = jpg->bpp/8;
186 cinfo.in_color_space = JCS_RGB;
188 jpeg_set_defaults(&cinfo);
189 jpeg_set_quality(&cinfo, quality, TRUE);
192 jpeg_start_compress(&cinfo, TRUE);
194 unsigned int row_stride = jpg->width * 3;
195 unsigned char *row_pointer = (
unsigned char *)jpg->buffer;
196 while (cinfo.next_scanline < cinfo.image_height) {
197 jpeg_write_scanlines(&cinfo, (JSAMPARRAY)&row_pointer, 1);
198 row_pointer += row_stride;
201 jpeg_finish_compress(&cinfo);
204 jpeg_destroy_compress(&cinfo);