#include /*I "petscsys.h" I*/ PETSC_EXTERN PetscErrorCode PetscDrawImageSave(const char[],const char[],unsigned char[][3],unsigned int,unsigned int,const unsigned char[]); PETSC_EXTERN PetscErrorCode PetscDrawMovieSave(const char[],PetscInt,const char[],PetscInt,const char[]); PETSC_EXTERN PetscErrorCode PetscDrawImageCheckFormat(const char *[]); PETSC_EXTERN PetscErrorCode PetscDrawMovieCheckFormat(const char *[]); /* Code to write images in PPM format */ #undef __FUNCT__ #define __FUNCT__ "PetscDrawImageSavePPM" PETSC_EXTERN PetscErrorCode PetscDrawImageSavePPM(const char filename[],unsigned char palette[][3],unsigned int w,unsigned int h,const unsigned char pixels[]) { int fd; char header[32]; size_t hdrlen; unsigned char *rgb; PetscErrorCode ierr; PetscFunctionBegin; PetscValidCharPointer(filename,1); if (palette) PetscValidCharPointer(palette,2); PetscValidCharPointer(pixels,5); /* map pixels to RGB colors */ if (palette) { int k,p,n = (int)(w*h); const unsigned char *colordef; ierr = PetscMalloc1(3*w*h,&rgb);CHKERRQ(ierr); for (k=p=0; k #if defined(PNG_SETJMP_SUPPORTED) # ifndef png_jmpbuf # define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) # endif #endif #undef __FUNCT__ #define __FUNCT__ "PetscDrawImageSavePNG" PETSC_EXTERN PetscErrorCode PetscDrawImageSavePNG(const char filename[],unsigned char palette[][3],unsigned int w,unsigned int h,const unsigned char pixels[]) { FILE *fp; png_struct *png_ptr; png_info *info_ptr; unsigned int row, stride = palette ? w : 3*w; PetscErrorCode ierr; PetscFunctionBegin; PetscValidCharPointer(filename,1); if (palette) PetscValidCharPointer(palette,2); PetscValidCharPointer(pixels,5); /* open file and create libpng structures */ ierr = PetscFOpen(PETSC_COMM_SELF,filename,"wb",&fp);CHKERRQ(ierr); png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL); if (!png_ptr) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Cannot create PNG context"); info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Cannot create PNG context"); /* setup libpng error handling */ #if defined(PNG_SETJMP_SUPPORTED) if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_write_struct(&png_ptr,&info_ptr); (void)PetscFClose(PETSC_COMM_SELF,fp); SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error writing PNG file %s",filename); } #endif /* setup PNG image metadata */ png_init_io(png_ptr, fp); png_set_IHDR(png_ptr, info_ptr, w, h, /*depth*/8, palette ? PNG_COLOR_TYPE_PALETTE : PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); if (palette) png_set_PLTE(png_ptr, info_ptr, (png_color*)palette, 256); /* write PNG image header and data */ png_write_info(png_ptr, info_ptr); for (row = 0; row < h; row++) png_write_row(png_ptr, pixels + row*stride); png_write_end(png_ptr, NULL); /* destroy libpng structures and close file */ png_destroy_write_struct(&png_ptr, &info_ptr); ierr = PetscFClose(PETSC_COMM_SELF,fp);CHKERRQ(ierr); PetscFunctionReturn(0); } static PetscErrorCode PetscDrawImageSave_PNG(const char filename[],unsigned char palette[][3],unsigned int w,unsigned int h,const unsigned char pixels[]) { return PetscDrawImageSavePNG(filename,palette,w,h,pixels); } #endif/*!PETSC_HAVE_LIBPNG*/ /* Code to write images in GIF format */ #if defined(PETSC_HAVE_GIFLIB) #include #if !defined(GIFLIB_MAJOR) || GIFLIB_MAJOR < 5 #define GifMakeMapObject MakeMapObject #define GifFreeMapObject FreeMapObject #define EGifOpenFileName(n,b,err) EGifOpenFileName(n,b) #define EGifOpenFileHandle(h,err) EGifOpenFileName(h) #define EGifCloseFile(f,err) EGifCloseFile(f) #endif #undef __FUNCT__ #define __FUNCT__ "PetscDrawImageSaveGIF" PETSC_EXTERN PetscErrorCode PetscDrawImageSaveGIF(const char filename[],unsigned char palette[][3],unsigned int w,unsigned int h,const unsigned char pixels[]) { int Row, Error; int Width = (int)w; int Height = (int)h; int ColorRes = 8; int ColorCount = 256; ColorMapObject *GifCMap = NULL; GifFileType *GifFile = NULL; # define SETERRGIF(msg) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,msg", GIF file: %s",filename) # define CHKERRGIF(msg) do {if (Error != GIF_OK) SETERRGIF(msg);} while(0) PetscFunctionBegin; PetscValidCharPointer(filename,1); PetscValidCharPointer(palette,2); PetscValidCharPointer(pixels,5); GifCMap = GifMakeMapObject(ColorCount, (GifColorType*)palette); if (!GifCMap) SETERRGIF("Allocating colormap"); GifFile = EGifOpenFileName(filename, 0, NULL); if (!GifFile) SETERRGIF("Opening"); Error = EGifPutScreenDesc(GifFile, Width, Height, ColorRes, 0, GifCMap); CHKERRGIF("Writing screen descriptor"); Error = EGifPutImageDesc(GifFile, 0, 0, Width, Height, 0, NULL); CHKERRGIF("Writing image descriptor"); for (Row = 0; Row < Height; Row++) { Error = EGifPutLine(GifFile, (GifPixelType*)pixels + Row*Width, Width); CHKERRGIF("Writing image pixels"); } Error = EGifCloseFile(GifFile, NULL); CHKERRGIF("Closing"); GifFreeMapObject(GifCMap); GifCMap = NULL; # undef SETERRGIF # undef CHKERRGIF PetscFunctionReturn(0); } static PetscErrorCode PetscDrawImageSave_GIF(const char filename[],unsigned char palette[][3],unsigned int w,unsigned int h,const unsigned char pixels[]) { return PetscDrawImageSaveGIF(filename,palette,w,h,pixels); } #endif/*!PETSC_HAVE_GIFLIB*/ /* Code to write images in JPEG format */ #if defined(PETSC_HAVE_LIBJPEG) #include #if defined(PETSC_HAVE_SETJMP_H) #include static jmp_buf petsc_jpeg_jumpbuf; static void petsc_jpeg_error_longjmp (j_common_ptr cinfo) { (void)cinfo; longjmp(petsc_jpeg_jumpbuf,1); } #endif #undef __FUNCT__ #define __FUNCT__ "PetscDrawImageSaveJPG" PETSC_EXTERN PetscErrorCode PetscDrawImageSaveJPG(const char filename[],unsigned char palette[][3],unsigned int w,unsigned int h,const unsigned char pixels[]) { unsigned char *rgbpixels; FILE *fp; struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; PetscErrorCode ierr; PetscFunctionBegin; PetscValidCharPointer(filename,1); if (palette) PetscValidCharPointer(palette,2); PetscValidCharPointer(pixels,5); /* map pixels to RGB colors */ if (palette) { int k,p,n = (int)(w*h); const unsigned char *colordef; ierr = PetscMalloc1(3*w*h,&rgbpixels);CHKERRQ(ierr); for (k=p=0; k 0 && !imgif) { /* ffmpeg seems to have trouble with non-animated GIF input */ ierr = PetscSNPrintf(framerate,sizeof(framerate)," -framerate %d",(int)fps);CHKERRQ(ierr); ierr = PetscStrcat(ffmpeg,framerate);CHKERRQ(ierr); } ierr = PetscSNPrintf(input,sizeof(input),"%s/%s_%%d%s",basename,basename,imext);CHKERRQ(ierr); ierr = PetscSNPrintf(output,sizeof(output),"%s%s",basename,mvext);CHKERRQ(ierr); if (imgif) { ierr = PetscStrcat(ffmpeg," -f concat");CHKERRQ(ierr); ierr = PetscSNPrintf(input,sizeof(input),"%s/%s.filelist",basename,basename);CHKERRQ(ierr); ierr = PetscFOpen(PETSC_COMM_SELF,input,"w",&fd);CHKERRQ(ierr); ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"# ffmpeg%s -f concat -i \"%s.filelist\" \"%s\"\n",framerate,basename,output);CHKERRQ(ierr); for (i=0; i