--- psiconv/trunk/program/psiconv/gen_image.c 2002/05/10 15:55:55 147 +++ psiconv/trunk/program/psiconv/gen_image.c 2004/01/18 19:58:12 187 @@ -20,26 +20,19 @@ #include "config.h" #include "psiconv/data.h" #include "gen.h" -#include #include "psiconv.h" +#include +#include #ifdef IMAGEMAGICK #include "magick-aux.h" #include +#endif #ifdef DMALLOC #include "dmalloc.h" #endif -static void set_filename(char *dest,const char *type, const char *name) -{ - int len; - strcpy(dest,type); - len = strlen(dest); - dest[len] = ':'; - strcpy(dest + len + 1,name); -} - /* This is ridiculously simple using ImageMagick. Without it, it would be quite somewhat harder - it will be left for later on. Note that we ignore any errors. Dangerous... */ @@ -65,76 +58,47 @@ } image = ConstituteImage(sec->xsize,sec->ysize,"RGB",FloatPixel,pixel,&exc); - if (! image) { + if (! image || (exc.severity != UndefinedException)) { MagickError(exc.severity,exc.reason,exc.description); + exit(1); } free(pixel); + DestroyExceptionInfo(&exc); + return image; } -#endif -static int psiconv_gen_image_clipart(const char *filename, psiconv_clipart_f f, - const char *dest) +static void image_to_list(psiconv_list list,Image *image,const char *dest) { -#if IMAGEMAGICK - psiconv_clipart_section section; - const MagickInfo *mi; ImageInfo *image_info; - Image *image = NULL; - Image *last_image = NULL; - Image *this_image, *images; ExceptionInfo exc; + size_t length; + char *data; int i; - unsigned int status; - + + strcpy(image->magick,dest); + image_info = CloneImageInfo(NULL); GetExceptionInfo(&exc); - if (!(mi = GetMagickInfo(dest,&exc))) - return -1; - - if ((psiconv_list_length(f->sections) < 1) || - ((psiconv_list_length(f->sections)) > 1 && ! (mi->adjoin))) -#endif - return -1; -#if IMAGEMAGICK - for (i = 0; i < psiconv_list_length(f->sections); i++) { - section = psiconv_list_get(f->sections,i); - this_image = get_paint_data_section(section->picture); - if (! image) { - image = this_image; - } else { - last_image->next=this_image; - this_image->previous=last_image; + data = ImageToBlob(image_info,image,&length,&exc); + if (!data || (exc.severity != UndefinedException)) { + MagickError(exc.severity,exc.reason,exc.description); + exit(1); + } + for (i = 0; i < length; i++) { + if (psiconv_list_add(list,data+i)) { + fprintf(stderr,"Out of memory error"); + exit(1); } - last_image = this_image; } - - image_info = CloneImageInfo(NULL); - set_filename(image->filename,dest,filename); - if (image->next) - images = CoalesceImages(image,&exc); - else - images = image; - if (! images) - CatchImageException(image); - - status = WriteImage(image_info,images); - if (!status) - CatchImageException(images); + DestroyExceptionInfo(&exc); DestroyImageInfo(image_info); - if (image != images) - DestroyImages(image); - DestroyImages(images); - return 0; -#endif } -static int psiconv_gen_image_mbm(const char *filename, psiconv_mbm_f f, - const char *dest) +static void gen_image_list(const psiconv_config config,psiconv_list list, + const psiconv_list sections, const char *dest) { - -#if IMAGEMAGICK psiconv_paint_data_section section; const MagickInfo *mi; ImageInfo *image_info; @@ -143,20 +107,25 @@ Image *this_image, *images; ExceptionInfo exc; int i; - unsigned int status; GetExceptionInfo(&exc); - if (!(mi = GetMagickInfo(dest,&exc))) - return -1; + mi = GetMagickInfo(dest,&exc); + if (!mi || (exc.severity != UndefinedException)) { + MagickError(exc.severity,exc.reason,exc.description); + exit(1); + } - if ((psiconv_list_length(f->sections) < 1) || - ((psiconv_list_length(f->sections)) > 1 && ! (mi->adjoin))) -#endif - return -1; -#if IMAGEMAGICK - - for (i = 0; i < psiconv_list_length(f->sections); i++) { - section = psiconv_list_get(f->sections,i); + if ((psiconv_list_length(sections) < 1) || + ((psiconv_list_length(sections)) > 1 && ! (mi->adjoin))) { + fprintf(stderr,"This image type supports only one image\n"); + exit(1); + } + + for (i = 0; i < psiconv_list_length(sections); i++) { + if (!(section = psiconv_list_get(sections,i))) { + fprintf(stderr,"Internal data structures corrupted\n"); + exit(1); + } this_image = get_paint_data_section(section); if (! image) { image = this_image; @@ -168,52 +137,79 @@ } image_info = CloneImageInfo(NULL); - set_filename(image->filename,dest,filename); - if (image->next) + if (image->next) { images = CoalesceImages(image,&exc); - else + if (!images || (exc.severity != UndefinedException)) { + MagickError(exc.severity,exc.reason,exc.description); + exit(1); + } + } else images = image; - if (! images) - CatchImageException(image); - status = WriteImage(image_info,images); - if (!status) - CatchImageException(images); + image_to_list(list,image,dest); + + DestroyExceptionInfo(&exc); DestroyImageInfo(image_info); if (image != images) DestroyImages(image); DestroyImages(images); - return 0; -#endif } -static void psiconv_gen_image_sketch(const char *filename, psiconv_sketch_f f, - const char *dest) +static void gen_image_clipart(const psiconv_config config,psiconv_list list, + const psiconv_clipart_f f, const char *dest) +{ + int i; + psiconv_list sections; + psiconv_clipart_section section; + + if (!(sections = psiconv_list_new(sizeof(*section->picture)))) { + fprintf(stderr,"Out of memory error\n"); + exit(1); + } + for (i = 0; i < psiconv_list_length(f->sections); i ++) { + if (!(section = psiconv_list_get(f->sections,i))) { + fprintf(stderr,"Internal data structures corrupted\n"); + exit(1); + } + if ((psiconv_list_add(sections,section->picture))) { + fprintf(stderr,"Out of memory error\n"); + exit(1); + } + } + gen_image_list(config,list,sections,dest); + psiconv_list_free(sections); +} + +static void gen_image_mbm(const psiconv_config config,psiconv_list list, + const psiconv_mbm_f f, const char *dest) +{ + gen_image_list(config,list,f->sections,dest); +} + + +static void gen_image_sketch(const psiconv_config config,psiconv_list list, + const psiconv_sketch_f f, const char *dest) { -#if IMAGEMAGICK - ImageInfo *image_info; Image *image; image = get_paint_data_section(f->sketch_sec->picture); - image_info = CloneImageInfo(NULL); - set_filename(image->filename,dest,filename); - WriteImage(image_info,image); - DestroyImageInfo(image_info); + image_to_list(list,image,dest); DestroyImage(image); -#endif } -static int psiconv_gen_image(const char * filename, const psiconv_file file, - const char *dest, - const psiconv_encoding encoding_type) - /* Here the encoding_type is a dummy */ + +static int gen_image(psiconv_config config, psiconv_list list, + const psiconv_file file, const char *dest, + const encoding encoding_type) { if (file->type == psiconv_mbm_file) - psiconv_gen_image_mbm(filename,(psiconv_mbm_f) file->file,dest); + gen_image_mbm(config,list,(psiconv_mbm_f) file->file,dest); else if (file->type == psiconv_clipart_file) - psiconv_gen_image_clipart(filename,(psiconv_clipart_f) file->file,dest); - else if (file->type == psiconv_sketch_file) { - psiconv_gen_image_sketch(filename,(psiconv_sketch_f) file->file,dest); + gen_image_clipart(config,list, + (psiconv_clipart_f) file->file,dest); + else + if (file->type == psiconv_sketch_file) { + gen_image_sketch(config, list,(psiconv_sketch_f) file->file,dest); } else return -1; return 0; @@ -221,10 +217,10 @@ void init_image(void) { - struct psiconv_fileformat_s ff; + struct fileformat_s ff; #if IMAGEMAGICK const MagickInfo *mi; - ff.output = psiconv_gen_image; + ff.output = gen_image; for (mi = GetMagickFileList(); mi ; mi = mi->next) { if (mi->encoder) { ff.name = strdup(mi->name);