15b399a63SLisandro Dalcin #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 25b399a63SLisandro Dalcin 38067a7d5SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscDrawImageSave(const char[],const char[],unsigned char[][3],unsigned int,unsigned int,const unsigned char[]); 449c04938SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscDrawMovieSave(const char[],PetscInt,const char[],PetscInt,const char[]); 58067a7d5SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscDrawImageCheckFormat(const char *[]); 68067a7d5SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscDrawMovieCheckFormat(const char *[]); 78067a7d5SLisandro Dalcin 88067a7d5SLisandro Dalcin #if defined(PETSC_HAVE_SAWS) 98067a7d5SLisandro Dalcin static PetscErrorCode PetscDrawSave_SAWs(PetscDraw); 108067a7d5SLisandro Dalcin #endif 118067a7d5SLisandro Dalcin 125b399a63SLisandro Dalcin /*@C 138067a7d5SLisandro Dalcin PetscDrawSetSave - Saves images produced in a PetscDraw into a file 145b399a63SLisandro Dalcin 155b399a63SLisandro Dalcin Collective on PetscDraw 165b399a63SLisandro Dalcin 17*d8d19677SJose E. Roman Input Parameters: 185b399a63SLisandro Dalcin + draw - the graphics context 1949c04938SLisandro Dalcin - filename - name of the file, if .ext then uses name of draw object plus .ext using .ext to determine the image type 205b399a63SLisandro Dalcin 215b399a63SLisandro Dalcin Options Database Command: 228067a7d5SLisandro Dalcin + -draw_save <filename> - filename could be name.ext or .ext (where .ext determines the type of graphics file to save, for example .png) 238067a7d5SLisandro Dalcin . -draw_save_final_image [optional filename] - saves the final image displayed in a window 248067a7d5SLisandro Dalcin - -draw_save_single_file - saves each new image in the same file, normally each new image is saved in a new file with filename/filename_%d.ext 255b399a63SLisandro Dalcin 265b399a63SLisandro Dalcin Level: intermediate 275b399a63SLisandro Dalcin 2895452b02SPatrick Sanan Notes: 2995452b02SPatrick Sanan You should call this BEFORE creating your image and calling PetscDrawSave(). 308067a7d5SLisandro Dalcin The supported image types are .png, .gif, .jpg, and .ppm (PETSc chooses the default in that order). 318067a7d5SLisandro Dalcin Support for .png images requires configure --with-libpng. 328067a7d5SLisandro Dalcin Support for .gif images requires configure --with-giflib. 338067a7d5SLisandro Dalcin Support for .jpg images requires configure --with-libjpeg. 348067a7d5SLisandro Dalcin Support for .ppm images is built-in. The PPM format has no compression (640x480 pixels ~ 900 KiB). 355b399a63SLisandro Dalcin 365b399a63SLisandro Dalcin .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawSetSaveFinalImage() 375b399a63SLisandro Dalcin @*/ 3849c04938SLisandro Dalcin PetscErrorCode PetscDrawSetSave(PetscDraw draw,const char filename[]) 395b399a63SLisandro Dalcin { 408067a7d5SLisandro Dalcin const char *savename = NULL; 418067a7d5SLisandro Dalcin const char *imageext = NULL; 4271ed57bfSLisandro Dalcin char buf[PETSC_MAX_PATH_LEN]; 435b399a63SLisandro Dalcin PetscErrorCode ierr; 445b399a63SLisandro Dalcin 455b399a63SLisandro Dalcin PetscFunctionBegin; 465b399a63SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 4771ed57bfSLisandro Dalcin if (filename) PetscValidCharPointer(filename,2); 485b399a63SLisandro Dalcin 498067a7d5SLisandro Dalcin /* determine save filename and image extension */ 505b399a63SLisandro Dalcin if (filename && filename[0]) { 518067a7d5SLisandro Dalcin ierr = PetscStrchr(filename,'.',(char **)&imageext);CHKERRQ(ierr); 528067a7d5SLisandro Dalcin if (!imageext) savename = filename; 538067a7d5SLisandro Dalcin else if (imageext != filename) { 5471ed57bfSLisandro Dalcin size_t l1 = 0,l2 = 0; 555b399a63SLisandro Dalcin ierr = PetscStrlen(filename,&l1);CHKERRQ(ierr); 568067a7d5SLisandro Dalcin ierr = PetscStrlen(imageext,&l2);CHKERRQ(ierr); 5771ed57bfSLisandro Dalcin ierr = PetscStrncpy(buf,filename,l1-l2+1);CHKERRQ(ierr); 588067a7d5SLisandro Dalcin savename = buf; 595b399a63SLisandro Dalcin } 6071ed57bfSLisandro Dalcin } 6171ed57bfSLisandro Dalcin 628067a7d5SLisandro Dalcin if (!savename) {ierr = PetscObjectGetName((PetscObject)draw,&savename);CHKERRQ(ierr);} 638067a7d5SLisandro Dalcin ierr = PetscDrawImageCheckFormat(&imageext);CHKERRQ(ierr); 648067a7d5SLisandro Dalcin 658067a7d5SLisandro Dalcin draw->savefilecount = 0; 668067a7d5SLisandro Dalcin ierr = PetscFree(draw->savefilename);CHKERRQ(ierr); 678067a7d5SLisandro Dalcin ierr = PetscFree(draw->saveimageext);CHKERRQ(ierr); 688067a7d5SLisandro Dalcin ierr = PetscStrallocpy(savename,&draw->savefilename);CHKERRQ(ierr); 698067a7d5SLisandro Dalcin ierr = PetscStrallocpy(imageext,&draw->saveimageext);CHKERRQ(ierr); 7049c04938SLisandro Dalcin 7149c04938SLisandro Dalcin if (draw->savesinglefile) { 7249c04938SLisandro Dalcin ierr = PetscInfo2(NULL,"Will save image to file %s%s\n",draw->savefilename,draw->saveimageext);CHKERRQ(ierr); 7349c04938SLisandro Dalcin } else { 7449c04938SLisandro Dalcin ierr = PetscInfo3(NULL,"Will save images to file %s/%s_%%d%s\n",draw->savefilename,draw->savefilename,draw->saveimageext);CHKERRQ(ierr); 7549c04938SLisandro Dalcin } 7649c04938SLisandro Dalcin PetscFunctionReturn(0); 7749c04938SLisandro Dalcin } 7849c04938SLisandro Dalcin 7949c04938SLisandro Dalcin /*@C 8049c04938SLisandro Dalcin PetscDrawSetSaveMovie - Saves a movie produced from a PetscDraw into a file 8149c04938SLisandro Dalcin 8249c04938SLisandro Dalcin Collective on PetscDraw 8349c04938SLisandro Dalcin 84*d8d19677SJose E. Roman Input Parameters: 8549c04938SLisandro Dalcin + draw - the graphics context 8649c04938SLisandro Dalcin - movieext - optional extension defining the movie format 8749c04938SLisandro Dalcin 8849c04938SLisandro Dalcin Options Database Command: 8949c04938SLisandro Dalcin . -draw_save_movie <.ext> - saves a movie with extension .ext 9049c04938SLisandro Dalcin 9149c04938SLisandro Dalcin Level: intermediate 9249c04938SLisandro Dalcin 9395452b02SPatrick Sanan Notes: 9495452b02SPatrick Sanan You should call this AFTER calling PetscDrawSetSave() and BEFORE creating your image with PetscDrawSave(). 9549c04938SLisandro Dalcin The ffmpeg utility must be in your path to make the movie. 9649c04938SLisandro Dalcin 9749c04938SLisandro Dalcin .seealso: PetscDrawSetSave(), PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy() 9849c04938SLisandro Dalcin @*/ 9949c04938SLisandro Dalcin PetscErrorCode PetscDrawSetSaveMovie(PetscDraw draw,const char movieext[]) 10049c04938SLisandro Dalcin { 10149c04938SLisandro Dalcin 10249c04938SLisandro Dalcin PetscErrorCode ierr; 10349c04938SLisandro Dalcin 10449c04938SLisandro Dalcin PetscFunctionBegin; 10549c04938SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 10649c04938SLisandro Dalcin if (movieext) PetscValidCharPointer(movieext,2); 10749c04938SLisandro Dalcin 10849c04938SLisandro Dalcin if (!draw->savefilename) {ierr = PetscDrawSetSave(draw,"");CHKERRQ(ierr);} 10949c04938SLisandro Dalcin ierr = PetscDrawMovieCheckFormat(&movieext);CHKERRQ(ierr); 1108067a7d5SLisandro Dalcin ierr = PetscStrallocpy(movieext,&draw->savemovieext);CHKERRQ(ierr); 11149c04938SLisandro Dalcin draw->savesinglefile = PETSC_FALSE; /* otherwise we cannot generage movies */ 11249c04938SLisandro Dalcin 11349c04938SLisandro Dalcin ierr = PetscInfo2(NULL,"Will save movie to file %s%s\n",draw->savefilename,draw->savemovieext);CHKERRQ(ierr); 1145b399a63SLisandro Dalcin PetscFunctionReturn(0); 1155b399a63SLisandro Dalcin } 1165b399a63SLisandro Dalcin 1175b399a63SLisandro Dalcin /*@C 1188067a7d5SLisandro Dalcin PetscDrawSetSaveFinalImage - Saves the final image produced in a PetscDraw into a file 1195b399a63SLisandro Dalcin 1205b399a63SLisandro Dalcin Collective on PetscDraw 1215b399a63SLisandro Dalcin 122*d8d19677SJose E. Roman Input Parameters: 1235b399a63SLisandro Dalcin + draw - the graphics context 1248067a7d5SLisandro Dalcin - filename - name of the file, if NULL or empty uses name set with PetscDrawSetSave() or name of draw object 1255b399a63SLisandro Dalcin 1265b399a63SLisandro Dalcin Options Database Command: 1278067a7d5SLisandro Dalcin . -draw_save_final_image <filename> - filename could be name.ext or .ext (where .ext determines the type of graphics file to save, for example .png) 1285b399a63SLisandro Dalcin 1295b399a63SLisandro Dalcin Level: intermediate 1305b399a63SLisandro Dalcin 13195452b02SPatrick Sanan Notes: 13295452b02SPatrick Sanan You should call this BEFORE creating your image and calling PetscDrawSave(). 1338067a7d5SLisandro Dalcin The supported image types are .png, .gif, and .ppm (PETSc chooses the default in that order). 1348067a7d5SLisandro Dalcin Support for .png images requires configure --with-libpng. 1358067a7d5SLisandro Dalcin Support for .gif images requires configure --with-giflib. 1368067a7d5SLisandro Dalcin Support for .jpg images requires configure --with-libjpeg. 1378067a7d5SLisandro Dalcin Support for .ppm images is built-in. The PPM format has no compression (640x480 pixels ~ 900 KiB). 1385b399a63SLisandro Dalcin 13949c04938SLisandro Dalcin .seealso: PetscDrawSetSave(), PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy() 1405b399a63SLisandro Dalcin @*/ 1418067a7d5SLisandro Dalcin PetscErrorCode PetscDrawSetSaveFinalImage(PetscDraw draw,const char filename[]) 1425b399a63SLisandro Dalcin { 1438067a7d5SLisandro Dalcin char buf[PETSC_MAX_PATH_LEN]; 1445b399a63SLisandro Dalcin PetscErrorCode ierr; 1455b399a63SLisandro Dalcin 1465b399a63SLisandro Dalcin PetscFunctionBegin; 1475b399a63SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 1488067a7d5SLisandro Dalcin if (!filename || !filename[0]) { 1498067a7d5SLisandro Dalcin if (!draw->savefilename) { 1508067a7d5SLisandro Dalcin ierr = PetscObjectGetName((PetscObject)draw,&filename);CHKERRQ(ierr); 1515b399a63SLisandro Dalcin } else { 1528067a7d5SLisandro Dalcin ierr = PetscSNPrintf(buf,sizeof(buf),"%s%s",draw->savefilename,draw->saveimageext);CHKERRQ(ierr); 1538067a7d5SLisandro Dalcin filename = buf; 1545b399a63SLisandro Dalcin } 1558067a7d5SLisandro Dalcin } 1568067a7d5SLisandro Dalcin ierr = PetscFree(draw->savefinalfilename);CHKERRQ(ierr); 1578067a7d5SLisandro Dalcin ierr = PetscStrallocpy(filename,&draw->savefinalfilename);CHKERRQ(ierr); 1585b399a63SLisandro Dalcin PetscFunctionReturn(0); 1595b399a63SLisandro Dalcin } 1605b399a63SLisandro Dalcin 1615b399a63SLisandro Dalcin /*@ 1625b399a63SLisandro Dalcin PetscDrawSave - Saves a drawn image 1635b399a63SLisandro Dalcin 1645b399a63SLisandro Dalcin Collective on PetscDraw 1655b399a63SLisandro Dalcin 1665b399a63SLisandro Dalcin Input Parameters: 1675b399a63SLisandro Dalcin . draw - the drawing context 1685b399a63SLisandro Dalcin 1695b399a63SLisandro Dalcin Level: advanced 1705b399a63SLisandro Dalcin 17195452b02SPatrick Sanan Notes: 17295452b02SPatrick Sanan this is not normally called by the user. 1735b399a63SLisandro Dalcin 1745b399a63SLisandro Dalcin .seealso: PetscDrawSetSave() 1755b399a63SLisandro Dalcin 1765b399a63SLisandro Dalcin @*/ 1775b399a63SLisandro Dalcin PetscErrorCode PetscDrawSave(PetscDraw draw) 1785b399a63SLisandro Dalcin { 17949c04938SLisandro Dalcin PetscInt saveindex; 1808067a7d5SLisandro Dalcin char basename[PETSC_MAX_PATH_LEN]; 1818067a7d5SLisandro Dalcin unsigned char palette[256][3]; 1828067a7d5SLisandro Dalcin unsigned int w,h; 1838067a7d5SLisandro Dalcin unsigned char *pixels = NULL; 1848067a7d5SLisandro Dalcin PetscMPIInt rank; 1855b399a63SLisandro Dalcin PetscErrorCode ierr; 1865b399a63SLisandro Dalcin 1875b399a63SLisandro Dalcin PetscFunctionBegin; 1885b399a63SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 18949c04938SLisandro Dalcin if (!draw->ops->save && !draw->ops->getimage) PetscFunctionReturn(0); 1908067a7d5SLisandro Dalcin if (draw->ops->save) {ierr = (*draw->ops->save)(draw);CHKERRQ(ierr); goto finally;} 19149c04938SLisandro Dalcin if (!draw->savefilename || !draw->saveimageext) PetscFunctionReturn(0); 192ffc4695bSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRMPI(ierr); 1938067a7d5SLisandro Dalcin 19449c04938SLisandro Dalcin saveindex = draw->savefilecount++; 1958067a7d5SLisandro Dalcin 19649c04938SLisandro Dalcin if (!rank && !saveindex) { 1978067a7d5SLisandro Dalcin char path[PETSC_MAX_PATH_LEN]; 1988067a7d5SLisandro Dalcin if (draw->savesinglefile) { 1998067a7d5SLisandro Dalcin ierr = PetscSNPrintf(path,sizeof(path),"%s%s",draw->savefilename,draw->saveimageext);CHKERRQ(ierr); 2008067a7d5SLisandro Dalcin (void)remove(path); 2018067a7d5SLisandro Dalcin } else { 2028067a7d5SLisandro Dalcin ierr = PetscSNPrintf(path,sizeof(path),"%s",draw->savefilename);CHKERRQ(ierr); 2038067a7d5SLisandro Dalcin ierr = PetscRMTree(path);CHKERRQ(ierr); 2048067a7d5SLisandro Dalcin ierr = PetscMkdir(path);CHKERRQ(ierr); 2058067a7d5SLisandro Dalcin } 2068067a7d5SLisandro Dalcin if (draw->savemovieext) { 2078067a7d5SLisandro Dalcin ierr = PetscSNPrintf(path,sizeof(path),"%s%s",draw->savefilename,draw->savemovieext);CHKERRQ(ierr); 2088067a7d5SLisandro Dalcin (void)remove(path); 2098067a7d5SLisandro Dalcin } 2108067a7d5SLisandro Dalcin } 2118067a7d5SLisandro Dalcin if (draw->savesinglefile) { 2128067a7d5SLisandro Dalcin ierr = PetscSNPrintf(basename,sizeof(basename),"%s",draw->savefilename);CHKERRQ(ierr); 2138067a7d5SLisandro Dalcin } else { 21480603804SMatthew G. Knepley char *basefilename; 21580603804SMatthew G. Knepley 21680603804SMatthew G. Knepley ierr = PetscStrrchr(draw->savefilename, '/', (char **) &basefilename);CHKERRQ(ierr); 21780603804SMatthew G. Knepley if (basefilename != draw->savefilename) { 21880603804SMatthew G. Knepley ierr = PetscSNPrintf(basename,sizeof(basename),"%s_%d",draw->savefilename,(int)saveindex);CHKERRQ(ierr); 21980603804SMatthew G. Knepley } else { 22049c04938SLisandro Dalcin ierr = PetscSNPrintf(basename,sizeof(basename),"%s/%s_%d",draw->savefilename,draw->savefilename,(int)saveindex);CHKERRQ(ierr); 2218067a7d5SLisandro Dalcin } 22280603804SMatthew G. Knepley } 2238067a7d5SLisandro Dalcin 2248067a7d5SLisandro Dalcin /* this call is collective, only the first process gets the image data */ 2258067a7d5SLisandro Dalcin ierr = (*draw->ops->getimage)(draw,palette,&w,&h,&pixels);CHKERRQ(ierr); 2268067a7d5SLisandro Dalcin /* only the first process handles the saving business */ 2278067a7d5SLisandro Dalcin if (!rank) {ierr = PetscDrawImageSave(basename,draw->saveimageext,palette,w,h,pixels);CHKERRQ(ierr);} 2288067a7d5SLisandro Dalcin ierr = PetscFree(pixels);CHKERRQ(ierr); 229ffc4695bSBarry Smith ierr = MPI_Barrier(PetscObjectComm((PetscObject)draw));CHKERRMPI(ierr); 2308067a7d5SLisandro Dalcin 2318067a7d5SLisandro Dalcin finally: 2328067a7d5SLisandro Dalcin #if defined(PETSC_HAVE_SAWS) 2338067a7d5SLisandro Dalcin ierr = PetscDrawSave_SAWs(draw);CHKERRQ(ierr); 2348067a7d5SLisandro Dalcin #endif 2358067a7d5SLisandro Dalcin PetscFunctionReturn(0); 2368067a7d5SLisandro Dalcin } 2378067a7d5SLisandro Dalcin 23849c04938SLisandro Dalcin /*@ 23949c04938SLisandro Dalcin PetscDrawSaveMovie - Saves a movie from previously saved images 24049c04938SLisandro Dalcin 24149c04938SLisandro Dalcin Collective on PetscDraw 24249c04938SLisandro Dalcin 24349c04938SLisandro Dalcin Input Parameters: 24449c04938SLisandro Dalcin . draw - the drawing context 24549c04938SLisandro Dalcin 24649c04938SLisandro Dalcin Level: advanced 24749c04938SLisandro Dalcin 24895452b02SPatrick Sanan Notes: 24995452b02SPatrick Sanan this is not normally called by the user. 25049c04938SLisandro Dalcin The ffmpeg utility must be in your path to make the movie. 25149c04938SLisandro Dalcin 25249c04938SLisandro Dalcin .seealso: PetscDrawSetSave(), PetscDrawSetSaveMovie() 25349c04938SLisandro Dalcin 25449c04938SLisandro Dalcin @*/ 25549c04938SLisandro Dalcin PetscErrorCode PetscDrawSaveMovie(PetscDraw draw) 25649c04938SLisandro Dalcin { 25749c04938SLisandro Dalcin PetscMPIInt rank; 25849c04938SLisandro Dalcin PetscErrorCode ierr; 25949c04938SLisandro Dalcin 26049c04938SLisandro Dalcin PetscFunctionBegin; 26149c04938SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 26249c04938SLisandro Dalcin if (!draw->ops->save && !draw->ops->getimage) PetscFunctionReturn(0); 26349c04938SLisandro Dalcin if (!draw->savefilename || !draw->savemovieext || draw->savesinglefile) PetscFunctionReturn(0); 264ffc4695bSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRMPI(ierr); 26549c04938SLisandro Dalcin { 26649c04938SLisandro Dalcin const char *fname = draw->savefilename; 26749c04938SLisandro Dalcin const char *imext = draw->saveimageext; 26849c04938SLisandro Dalcin const char *mvext = draw->savemovieext; 26949c04938SLisandro Dalcin if (!rank) {ierr = PetscDrawMovieSave(fname,draw->savefilecount,imext,draw->savemoviefps,mvext);CHKERRQ(ierr);} 270ffc4695bSBarry Smith ierr = MPI_Barrier(PetscObjectComm((PetscObject)draw));CHKERRMPI(ierr); 27149c04938SLisandro Dalcin } 27249c04938SLisandro Dalcin PetscFunctionReturn(0); 27349c04938SLisandro Dalcin } 27449c04938SLisandro Dalcin 2758067a7d5SLisandro Dalcin #if defined(PETSC_HAVE_SAWS) 2768067a7d5SLisandro Dalcin #include <petscviewersaws.h> 2778067a7d5SLisandro Dalcin /* 2788067a7d5SLisandro Dalcin The PetscImageList object and functions are used to maintain a list of file images 2798067a7d5SLisandro Dalcin that can be displayed by the SAWs webserver. 2808067a7d5SLisandro Dalcin */ 2818067a7d5SLisandro Dalcin typedef struct _P_PetscImageList *PetscImageList; 2828067a7d5SLisandro Dalcin struct _P_PetscImageList { 2838067a7d5SLisandro Dalcin PetscImageList next; 2848067a7d5SLisandro Dalcin char *filename; 2858067a7d5SLisandro Dalcin char *ext; 2868067a7d5SLisandro Dalcin PetscInt count; 2878067a7d5SLisandro Dalcin } ; 2888067a7d5SLisandro Dalcin 2898067a7d5SLisandro Dalcin static PetscImageList SAWs_images = NULL; 2908067a7d5SLisandro Dalcin 2918067a7d5SLisandro Dalcin static PetscErrorCode PetscImageListDestroy(void) 2928067a7d5SLisandro Dalcin { 2938067a7d5SLisandro Dalcin PetscErrorCode ierr; 2948067a7d5SLisandro Dalcin PetscImageList image = SAWs_images; 2958067a7d5SLisandro Dalcin 2968067a7d5SLisandro Dalcin PetscFunctionBegin; 2978067a7d5SLisandro Dalcin while (image) { 2988067a7d5SLisandro Dalcin PetscImageList next = image->next; 2998067a7d5SLisandro Dalcin ierr = PetscFree(image->filename);CHKERRQ(ierr); 3008067a7d5SLisandro Dalcin ierr = PetscFree(image->ext);CHKERRQ(ierr); 3018067a7d5SLisandro Dalcin ierr = PetscFree(image);CHKERRQ(ierr); 3028067a7d5SLisandro Dalcin image = next; 3035b399a63SLisandro Dalcin } 3045b399a63SLisandro Dalcin PetscFunctionReturn(0); 3055b399a63SLisandro Dalcin } 3068067a7d5SLisandro Dalcin 3078067a7d5SLisandro Dalcin static PetscErrorCode PetscImageListAdd(const char filename[],const char ext[],PetscInt count) 3088067a7d5SLisandro Dalcin { 3098067a7d5SLisandro Dalcin PetscErrorCode ierr; 3108067a7d5SLisandro Dalcin PetscImageList image,oimage = SAWs_images; 3118067a7d5SLisandro Dalcin PetscBool flg; 3128067a7d5SLisandro Dalcin 3138067a7d5SLisandro Dalcin PetscFunctionBegin; 3148067a7d5SLisandro Dalcin if (oimage) { 3158067a7d5SLisandro Dalcin ierr = PetscStrcmp(filename,oimage->filename,&flg);CHKERRQ(ierr); 3168067a7d5SLisandro Dalcin if (flg) { 3178067a7d5SLisandro Dalcin oimage->count = count; 3188067a7d5SLisandro Dalcin PetscFunctionReturn(0); 3198067a7d5SLisandro Dalcin } 3208067a7d5SLisandro Dalcin while (oimage->next) { 3218067a7d5SLisandro Dalcin oimage = oimage->next; 3228067a7d5SLisandro Dalcin ierr = PetscStrcmp(filename,oimage->filename,&flg);CHKERRQ(ierr); 3238067a7d5SLisandro Dalcin if (flg) { 3248067a7d5SLisandro Dalcin oimage->count = count; 3258067a7d5SLisandro Dalcin PetscFunctionReturn(0); 3268067a7d5SLisandro Dalcin } 3278067a7d5SLisandro Dalcin } 3288067a7d5SLisandro Dalcin ierr = PetscNew(&image);CHKERRQ(ierr); 3298067a7d5SLisandro Dalcin oimage->next = image; 3308067a7d5SLisandro Dalcin } else { 3318067a7d5SLisandro Dalcin ierr = PetscRegisterFinalize(PetscImageListDestroy);CHKERRQ(ierr); 3328067a7d5SLisandro Dalcin ierr = PetscNew(&image);CHKERRQ(ierr); 3338067a7d5SLisandro Dalcin SAWs_images = image; 3348067a7d5SLisandro Dalcin } 3358067a7d5SLisandro Dalcin ierr = PetscStrallocpy(filename,&image->filename);CHKERRQ(ierr); 3368067a7d5SLisandro Dalcin ierr = PetscStrallocpy(ext,&image->ext);CHKERRQ(ierr); 3378067a7d5SLisandro Dalcin image->count = count; 3388067a7d5SLisandro Dalcin PetscFunctionReturn(0); 3398067a7d5SLisandro Dalcin } 3408067a7d5SLisandro Dalcin 3418067a7d5SLisandro Dalcin static PetscErrorCode PetscDrawSave_SAWs(PetscDraw draw) 3428067a7d5SLisandro Dalcin { 3438067a7d5SLisandro Dalcin PetscImageList image; 3448067a7d5SLisandro Dalcin char body[4096]; 3458067a7d5SLisandro Dalcin size_t len = 0; 3468067a7d5SLisandro Dalcin PetscErrorCode ierr; 3478067a7d5SLisandro Dalcin 3488067a7d5SLisandro Dalcin PetscFunctionBegin; 34949c04938SLisandro Dalcin if (!draw->savefilename || !draw->saveimageext) PetscFunctionReturn(0); 3508067a7d5SLisandro Dalcin ierr = PetscImageListAdd(draw->savefilename,draw->saveimageext,draw->savefilecount-1);CHKERRQ(ierr); 3518067a7d5SLisandro Dalcin image = SAWs_images; 3528067a7d5SLisandro Dalcin while (image) { 3538067a7d5SLisandro Dalcin const char *name = image->filename; 3548067a7d5SLisandro Dalcin const char *ext = image->ext; 3558067a7d5SLisandro Dalcin if (draw->savesinglefile) { 3568067a7d5SLisandro Dalcin ierr = PetscSNPrintf(body+len,4086-len,"<img src=\"%s%s\" alt=\"None\">",name,ext);CHKERRQ(ierr); 3578067a7d5SLisandro Dalcin } else { 3588067a7d5SLisandro Dalcin ierr = PetscSNPrintf(body+len,4086-len,"<img src=\"%s/%s_%d%s\" alt=\"None\">",name,name,image->count,ext);CHKERRQ(ierr); 3598067a7d5SLisandro Dalcin } 3608067a7d5SLisandro Dalcin ierr = PetscStrlen(body,&len);CHKERRQ(ierr); 3618067a7d5SLisandro Dalcin image = image->next; 3628067a7d5SLisandro Dalcin } 363a126751eSBarry Smith ierr = PetscStrlcat(body,"<br>\n",sizeof(body));CHKERRQ(ierr); 3648067a7d5SLisandro Dalcin if (draw->savefilecount > 0) PetscStackCallSAWs(SAWs_Pop_Body,("index.html",1)); 3658067a7d5SLisandro Dalcin PetscStackCallSAWs(SAWs_Push_Body,("index.html",1,body)); 3668067a7d5SLisandro Dalcin PetscFunctionReturn(0); 3678067a7d5SLisandro Dalcin } 3688067a7d5SLisandro Dalcin 3698067a7d5SLisandro Dalcin #endif 370