Enlightenment CVS committal Author : doursse Project : e17 Module : libs/evas
Dir : e17/libs/evas/src/lib/engines/common Modified Files: evas_image_save.c Log Message: and now the savers... =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/evas/src/lib/engines/common/evas_image_save.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- evas_image_save.c 6 Jan 2006 23:13:16 -0000 1.3 +++ evas_image_save.c 15 Jan 2006 10:35:02 -0000 1.4 @@ -1,300 +1,50 @@ #include "config.h" #include "evas_options.h" -#define SWAP32(x) (x) = ((((x) & 0x000000ff ) << 24) | (((x) & 0x0000ff00 ) << 8) | (((x) & 0x00ff0000 ) >> 8) | (((x) & 0xff000000 ) >> 24)) - -#ifdef BUILD_LOADER_PNG -#include <png.h> -#include <setjmp.h> -#define PNG_BYTES_TO_CHECK 4 -#endif - -#ifdef BUILD_LOADER_JPEG -#include <stdio.h> -#include <jpeglib.h> -#include <setjmp.h> -#endif - -#ifdef BUILD_LOADER_EET -#include <Eet.h> -#endif - -#ifdef BUILD_LOADER_EDB -#include <Edb.h> -#include <zlib.h> -#endif - -#ifdef BUILD_LOADER_TEMPLATE -#include <Template.h> -#endif - #include "evas_common.h" #include "evas_private.h" -#ifdef BUILD_LOADER_PNG -static int -save_image_png(RGBA_Image *im, const char *file, int compress, int interlace) -{ - FILE *f; - png_structp png_ptr; - png_infop info_ptr; - DATA32 *ptr; - int x, y, j; - png_bytep row_ptr, data = NULL; - png_color_8 sig_bit; - int quality = 75, compression = 3, num_passes = 1, pass; - - f = fopen(file, "wb"); - if (!f) return 0; - - png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!png_ptr) - { - fclose(f); - return 0; - } - info_ptr = png_create_info_struct(png_ptr); - if (info_ptr == NULL) - { - fclose(f); - png_destroy_write_struct(&png_ptr, (png_infopp) NULL); - return 0; - } - if (setjmp(png_ptr->jmpbuf)) - { - fclose(f); - png_destroy_write_struct(&png_ptr, (png_infopp) & info_ptr); - png_destroy_info_struct(png_ptr, (png_infopp) & info_ptr); - return 0; - } - - if (interlace) - { -#ifdef PNG_WRITE_INTERLACING_SUPPORTED - png_ptr->interlaced = PNG_INTERLACE_ADAM7; - num_passes = png_set_interlace_handling(png_ptr); -#endif - } - - png_init_io(png_ptr, f); - - if (im->flags & RGBA_IMAGE_HAS_ALPHA) - { - png_set_IHDR(png_ptr, info_ptr, im->image->w, im->image->h, 8, - PNG_COLOR_TYPE_RGB_ALPHA, png_ptr->interlaced, - PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); -#ifdef WORDS_BIGENDIAN - png_set_swap_alpha(png_ptr); -#else - png_set_bgr(png_ptr); -#endif - } - else - { - png_set_IHDR(png_ptr, info_ptr, im->image->w, im->image->h, 8, - PNG_COLOR_TYPE_RGB, png_ptr->interlaced, - PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); - data = alloca(im->image->w * 3 * sizeof(char)); - } - sig_bit.red = 8; - sig_bit.green = 8; - sig_bit.blue = 8; - sig_bit.alpha = 8; - png_set_sBIT(png_ptr, info_ptr, &sig_bit); - - png_set_compression_level(png_ptr, compress); - png_write_info(png_ptr, info_ptr); - png_set_shift(png_ptr, &sig_bit); - png_set_packing(png_ptr); - - for (pass = 0; pass < num_passes; pass++) - { - ptr = im->image->data; - - for (y = 0; y < im->image->h; y++) - { - if (im->flags & RGBA_IMAGE_HAS_ALPHA) - row_ptr = (png_bytep) ptr; - else - { - for (j = 0, x = 0; x < im->image->w; x++) - { - data[j++] = (ptr[x] >> 16) & 0xff; - data[j++] = (ptr[x] >> 8) & 0xff; - data[j++] = (ptr[x]) & 0xff; - } - row_ptr = (png_bytep) data; - } - png_write_rows(png_ptr, &row_ptr, 1); - ptr += im->image->w; - } - } - png_write_end(png_ptr, info_ptr); - png_destroy_write_struct(&png_ptr, (png_infopp) & info_ptr); - png_destroy_info_struct(png_ptr, (png_infopp) & info_ptr); - - fclose(f); - return 1; -} -#endif - -#ifdef BUILD_LOADER_JPEG -struct _JPEG_error_mgr -{ - struct jpeg_error_mgr pub; - jmp_buf setjmp_buffer; -}; -typedef struct _JPEG_error_mgr *emptr; - -static void _JPEGFatalErrorHandler(j_common_ptr cinfo); -static void -_JPEGFatalErrorHandler(j_common_ptr cinfo) -{ - emptr errmgr; - - errmgr = (emptr) cinfo->err; - longjmp(errmgr->setjmp_buffer, 1); - return; -} - -static void _JPEGErrorHandler(j_common_ptr cinfo); -static void -_JPEGErrorHandler(j_common_ptr cinfo) -{ - emptr errmgr; - - errmgr = (emptr) cinfo->err; - return; -} - -static void _JPEGErrorHandler2(j_common_ptr cinfo, int msg_level); -static void -_JPEGErrorHandler2(j_common_ptr cinfo, int msg_level) -{ - emptr errmgr; - - errmgr = (emptr) cinfo->err; - return; - msg_level = 0; -} - -static int -save_image_jpeg(RGBA_Image *im, const char *file, int quality) -{ - struct _JPEG_error_mgr jerr; - struct jpeg_compress_struct cinfo; - FILE *f; - DATA8 *buf; - DATA32 *ptr; - JSAMPROW *jbuf; - int y = 0; - int i, j; - - buf = alloca(im->image->w * 3 * sizeof(DATA8)); - f = fopen(file, "wb"); - if (!f) - { - return 0; - } - jerr.pub.error_exit = _JPEGFatalErrorHandler; - jerr.pub.emit_message = _JPEGErrorHandler2; - jerr.pub.output_message = _JPEGErrorHandler; - cinfo.err = jpeg_std_error(&(jerr.pub)); - if (sigsetjmp(jerr.setjmp_buffer, 1)) - { - jpeg_destroy_compress(&cinfo); - fclose(f); - return 0; - } - jpeg_create_compress(&cinfo); - jpeg_stdio_dest(&cinfo, f); - cinfo.image_width = im->image->w; - cinfo.image_height = im->image->h; - cinfo.input_components = 3; - cinfo.in_color_space = JCS_RGB; - jpeg_set_defaults(&cinfo); - jpeg_set_quality(&cinfo, quality, TRUE); - jpeg_start_compress(&cinfo, TRUE); - ptr = im->image->data; - while (cinfo.next_scanline < cinfo.image_height) - { - for (j = 0, i = 0; i < im->image->w; i++) - { - buf[j++] = ((*ptr) >> 16) & 0xff; - buf[j++] = ((*ptr) >> 8) & 0xff; - buf[j++] = ((*ptr)) & 0xff; - ptr++; - } - jbuf = (JSAMPROW *) (&buf); - jpeg_write_scanlines(&cinfo, jbuf, 1); - y++; - } - jpeg_finish_compress(&cinfo); - jpeg_destroy_compress(&cinfo); - fclose(f); - return 1; -} -#endif - -#ifdef BUILD_LOADER_EET -static int -save_image_eet(RGBA_Image *im, const char *file, const char *key, int quality, int compress) -{ - Eet_File *ef; - int alpha = 0, lossy = 0, ok = 0; - ef = eet_open((char *)file, EET_FILE_MODE_READ_WRITE); - if (!ef) ef = eet_open((char *)file, EET_FILE_MODE_WRITE); - if (!ef) return 0; - if ((quality <= 100) || (compress < 0)) lossy = 1; - if (im->flags & RGBA_IMAGE_HAS_ALPHA) alpha = 1; - ok = eet_data_image_write(ef, (char *)key, im->image->data, - im->image->w, im->image->h, alpha, compress, - quality, lossy); - eet_close(ef); - return ok; -} -#endif - -#ifdef BUILD_LOADER_EDB -static int -save_image_edb(RGBA_Image *im, const char *file, const char *key, int quality, int compress) -{ - return 0; -} -#endif - -#ifdef BUILD_LOADER_TEMPLATE -#endif +extern Evas_List *evas_modules; int evas_common_save_image_to_file(RGBA_Image *im, const char *file, const char *key, int quality, int compress) { + Evas_Image_Save_Func *evas_image_save_func = NULL; char *p; + char *saver = NULL; p = strrchr(file, '.'); if (p) { p++; -#ifdef BUILD_LOADER_PNG if (!strcasecmp(p, "png")) - return save_image_png(im, file, compress, 0); -#endif -#ifdef BUILD_LOADER_JPEG - if ((!strcasecmp(p, "jpg")) || - (!strcasecmp(p, "jpeg")) || + saver = "png"; + if ((!strcasecmp(p, "jpg")) || (!strcasecmp(p, "jpeg")) || (!strcasecmp(p, "jfif"))) - return save_image_jpeg(im, file, quality); -#endif -#ifdef BUILD_LOADER_EET - if (!strcasecmp(p, "eet")) - return save_image_eet(im, file, key, quality, compress); -#endif -#ifdef BUILD_LOADER_EDB + saver = "jpeg"; + if ((!strcasecmp(p, "eet")) || (!strcasecmp(p, "edj")) || + (!strcasecmp(p, "eap"))) + saver = "eet"; if (!strcasecmp(p, "edb")) - return save_image_edb(im, file, key, quality, compress); -#endif + saver = "edb"; + } + printf ("Saver %s\n", saver); + if (saver) + { + Evas_Module *em; + + em = evas_module_find_type(EVAS_MODULE_TYPE_IMAGE_SAVER, saver); + if (em) + { + printf ("saver found %d\n", em->loaded); + if (evas_module_load(em)) + { + evas_image_save_func = em->functions; + return evas_image_save_func->image_save(im, file, key, quality, compress); + } + } } return 0; } ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs