1 #include "evas_common.h"
2 #include "evas_private.h"
8 int evas_image_save_file_jpeg(RGBA_Image *im, const char *file, const char *key, int quality, int compress);
10 Evas_Image_Save_Func evas_image_save_jpeg_func =
12 evas_image_save_file_jpeg
15 struct _JPEG_error_mgr
17 struct jpeg_error_mgr pub;
18 jmp_buf setjmp_buffer;
20 typedef struct _JPEG_error_mgr *emptr;
22 static void _JPEGFatalErrorHandler(j_common_ptr cinfo);
24 _JPEGFatalErrorHandler(j_common_ptr cinfo)
28 errmgr = (emptr) cinfo->err;
29 longjmp(errmgr->setjmp_buffer, 1);
33 static void _JPEGErrorHandler(j_common_ptr cinfo);
35 _JPEGErrorHandler(j_common_ptr cinfo)
39 errmgr = (emptr) cinfo->err;
43 static void _JPEGErrorHandler2(j_common_ptr cinfo, int msg_level);
45 _JPEGErrorHandler2(j_common_ptr cinfo, int msg_level)
49 errmgr = (emptr) cinfo->err;
55 save_image_jpeg(RGBA_Image *im, const char *file, int quality)
57 struct _JPEG_error_mgr jerr;
58 struct jpeg_compress_struct cinfo;
66 if (!im || !im->image.data || !file)
69 buf = alloca(im->cache_entry.w * 3 * sizeof(DATA8));
70 f = fopen(file, "wb");
75 jerr.pub.error_exit = _JPEGFatalErrorHandler;
76 jerr.pub.emit_message = _JPEGErrorHandler2;
77 jerr.pub.output_message = _JPEGErrorHandler;
78 cinfo.err = jpeg_std_error(&(jerr.pub));
79 if (sigsetjmp(jerr.setjmp_buffer, 1))
81 jpeg_destroy_compress(&cinfo);
85 jpeg_create_compress(&cinfo);
86 jpeg_stdio_dest(&cinfo, f);
87 cinfo.image_width = im->cache_entry.w;
88 cinfo.image_height = im->cache_entry.h;
89 cinfo.input_components = 3;
90 cinfo.in_color_space = JCS_RGB;
91 jpeg_set_defaults(&cinfo);
92 jpeg_set_quality(&cinfo, quality, TRUE);
93 jpeg_start_compress(&cinfo, TRUE);
95 while (cinfo.next_scanline < cinfo.image_height)
97 for (j = 0, i = 0; i < im->cache_entry.w; i++)
99 buf[j++] = ((*ptr) >> 16) & 0xff;
100 buf[j++] = ((*ptr) >> 8) & 0xff;
101 buf[j++] = ((*ptr)) & 0xff;
104 jbuf = (JSAMPROW *) (&buf);
105 jpeg_write_scanlines(&cinfo, jbuf, 1);
108 jpeg_finish_compress(&cinfo);
109 jpeg_destroy_compress(&cinfo);
114 int evas_image_save_file_jpeg(RGBA_Image *im, const char *file, const char *key, int quality, int compress)
116 return save_image_jpeg(im, file, quality);
120 module_open(Evas_Module *em)
123 em->functions = (void *)(&evas_image_save_jpeg_func);
133 EAPI Evas_Module_Api evas_modapi =
135 EVAS_MODULE_API_VERSION,
136 EVAS_MODULE_TYPE_IMAGE_SAVER,