--- psiconv/trunk/program/psiconv/gen_image.c 2000/10/04 19:02:04 52 +++ psiconv/trunk/program/psiconv/gen_image.c 2000/10/21 00:49:13 53 @@ -27,6 +27,15 @@ #include "magick-aux.h" #include +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... */ @@ -36,9 +45,9 @@ Image *image; float *pixel, *p, *red, *green, *blue; int x,y; - ExceptionInfo *exc; + ExceptionInfo exc; - GetExceptionInfo(exc); + GetExceptionInfo(&exc); red = sec->red; green = sec->green; blue = sec->blue; @@ -50,26 +59,30 @@ *p++ = *blue++; } } - image = ConstituteImage(sec->xsize,sec->ysize,"RGB",FloatPixel,pixel,exc); + image = ConstituteImage(sec->xsize,sec->ysize,"RGB",FloatPixel,pixel,&exc); + if (! image) { + MagickError(exc.severity,exc.message,exc.qualifier); + } free(pixel); - DestroyExceptionInfo(exc); return image; } #endif -static int psiconv_gen_image_clipart(FILE *of, psiconv_clipart_f f, +static int psiconv_gen_image_clipart(const char *filename, psiconv_clipart_f f, const char *dest) { #if IMAGEMAGICK psiconv_clipart_section section; MagickInfo *mi = GetMagickInfo(dest); - ImageInfo image_info; + ImageInfo *image_info; Image *image = NULL; Image *last_image = NULL; - Image *this_image; + Image *this_image, *images; + ExceptionInfo exc; int i; + unsigned int status; if ((psiconv_list_length(f->sections) < 1) || ((psiconv_list_length(f->sections)) > 1 && ! (mi->adjoin))) @@ -81,34 +94,43 @@ this_image = get_paint_data_section(section->picture); if (! image) { image = this_image; - last_image = image; } else { last_image->next=this_image; this_image->previous=last_image; - this_image->scene=i; - last_image=this_image; } + last_image = this_image; } - GetImageInfo(&image_info); - image_info.file = of; - strcpy(image->magick, dest); - image_info.adjoin=1; - WriteImage(&image_info,image); + GetExceptionInfo(&exc); + image_info = CloneImageInfo(NULL); + set_filename(image->filename,dest,filename); + images = CoalesceImages(image,&exc); + if (! images) + CatchImageException(image); + + status = WriteImage(image_info,images); + if (!status) + CatchImageException(images); + DestroyImageInfo(image_info); + DestroyImages(image); + DestroyImages(images); return 0; #endif } -static int psiconv_gen_image_mbm(FILE *of, psiconv_mbm_f f, const char *dest) +static int psiconv_gen_image_mbm(const char *filename, psiconv_mbm_f f, + const char *dest) { #if IMAGEMAGICK psiconv_paint_data_section section; MagickInfo *mi = GetMagickInfo(dest); - ImageInfo image_info; + ImageInfo *image_info; Image *image = NULL; Image *last_image = NULL; - Image *this_image; + Image *this_image, *images; + ExceptionInfo exc; int i; + unsigned int status; if ((psiconv_list_length(f->sections) < 1) || ((psiconv_list_length(f->sections)) > 1 && ! (mi->adjoin))) @@ -120,51 +142,59 @@ this_image = get_paint_data_section(section); if (! image) { image = this_image; - last_image = image; + this_image->scene=1; } else { last_image->next=this_image; this_image->previous=last_image; - this_image->scene=i; - last_image=this_image; } + last_image = this_image; } - GetImageInfo(&image_info); - image_info.file = of; - strcpy(image->magick, dest); - image_info.adjoin=1; - WriteImage(&image_info,image); + GetExceptionInfo(&exc); + image_info = CloneImageInfo(NULL); + set_filename(image->filename,dest,filename); + images = CoalesceImages(image,&exc); + if (! images) + CatchImageException(image); + + status = WriteImage(image_info,images); + if (!status) + CatchImageException(images); + DestroyImageInfo(image_info); + DestroyImages(image); + DestroyImages(images); return 0; #endif } -static void psiconv_gen_image_sketch(FILE *of, psiconv_sketch_f f, +static void psiconv_gen_image_sketch(const char *filename, psiconv_sketch_f f, const char *dest) { #if IMAGEMAGICK - ImageInfo image_info; + ImageInfo *image_info; Image *image; image = get_paint_data_section(f->sketch_sec->picture); - GetImageInfo(&image_info); - image_info.file = of; - strcpy(image->magick, dest); - WriteImage(&image_info,image); + image_info = CloneImageInfo(NULL); + set_filename(image->filename,dest,filename); + WriteImage(image_info,image); + DestroyImageInfo(image_info); + DestroyImage(image); #endif } -static int psiconv_gen_image(FILE * of, const psiconv_file file, +static int psiconv_gen_image(const char * filename, const psiconv_file file, const char *dest) { if (file->type == psiconv_mbm_file) - return psiconv_gen_image_mbm(of,(psiconv_mbm_f) file->file,dest); + psiconv_gen_image_mbm(filename,(psiconv_mbm_f) file->file,dest); if (file->type == psiconv_clipart_file) - return psiconv_gen_image_clipart(of,(psiconv_clipart_f) file->file,dest); + psiconv_gen_image_clipart(filename,(psiconv_clipart_f) file->file,dest); else if (file->type == psiconv_sketch_file) { - psiconv_gen_image_sketch(of,(psiconv_sketch_f) file->file,dest); - return 0; + psiconv_gen_image_sketch(filename,(psiconv_sketch_f) file->file,dest); } else return -1; + return 0; } void init_image(void)