15b399a63SLisandro Dalcin #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 25b399a63SLisandro Dalcin 35b399a63SLisandro Dalcin #undef __FUNCT__ 45b399a63SLisandro Dalcin #define __FUNCT__ "PetscDrawSetSave" 55b399a63SLisandro Dalcin /*@C 65b399a63SLisandro Dalcin PetscDrawSetSave - Saves images produced in a PetscDraw into a file as a Gif file using AfterImage 75b399a63SLisandro Dalcin 85b399a63SLisandro Dalcin Collective on PetscDraw 95b399a63SLisandro Dalcin 105b399a63SLisandro Dalcin Input Parameter: 115b399a63SLisandro Dalcin + draw - the graphics context 125b399a63SLisandro Dalcin . filename - name of the file, if .ext then uses name of draw object plus .ext using .ext to determine the image type, if NULL use .Gif image type 135b399a63SLisandro Dalcin - movie - produce a movie of all the images 145b399a63SLisandro Dalcin 155b399a63SLisandro Dalcin Options Database Command: 165b399a63SLisandro Dalcin + -draw_save <filename> - filename could be name.ext or .ext (where .ext determines the type of graphics file to save, for example .Gif) 175b399a63SLisandro Dalcin . -draw_save_movie 185b399a63SLisandro Dalcin . -draw_save_final_image [optional filename] - (X windows only) saves the final image displayed in a window 195b399a63SLisandro 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_%d 205b399a63SLisandro Dalcin 215b399a63SLisandro Dalcin Level: intermediate 225b399a63SLisandro Dalcin 235b399a63SLisandro Dalcin Concepts: X windows^graphics 245b399a63SLisandro Dalcin 255b399a63SLisandro Dalcin Notes: You should call this BEFORE creating your image and calling PetscDrawFlush(). 265b399a63SLisandro Dalcin 27*71ed57bfSLisandro Dalcin The ffmpeg utility must be in your path to make the movie. 285b399a63SLisandro Dalcin 29*71ed57bfSLisandro Dalcin It is recommended that PETSc be configured with the option --with-afterimage to save the images. Otherwise, PETSc will write uncompressed, binary PPM files. 305b399a63SLisandro Dalcin The .ext formats that are supported depend on what formats AfterImage was configured with; on the Apple Mac both .Gif and .Jpeg are supported. 31*71ed57bfSLisandro Dalcin If X windows generates an error message about X_CreateWindow() failing then Afterimage was installed without X windows. 32*71ed57bfSLisandro Dalcin Reinstall Afterimage using the following configure flags: 33*71ed57bfSLisandro Dalcin ./configure flags --x-includes=/pathtoXincludes --x-libraries=/pathtoXlibraries 34*71ed57bfSLisandro Dalcin For example under Mac OS X Mountain Lion --x-includes=/opt/X11/include -x-libraries=/opt/X11/lib 355b399a63SLisandro Dalcin 365b399a63SLisandro Dalcin .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawSetSaveFinalImage() 375b399a63SLisandro Dalcin @*/ 385b399a63SLisandro Dalcin PetscErrorCode PetscDrawSetSave(PetscDraw draw,const char *filename,PetscBool movie) 395b399a63SLisandro Dalcin { 40*71ed57bfSLisandro Dalcin const char *name = NULL; 41*71ed57bfSLisandro Dalcin const char *ext = NULL; 42*71ed57bfSLisandro Dalcin char buf[PETSC_MAX_PATH_LEN]; 435b399a63SLisandro Dalcin PetscErrorCode ierr; 445b399a63SLisandro Dalcin 455b399a63SLisandro Dalcin PetscFunctionBegin; 465b399a63SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 47*71ed57bfSLisandro Dalcin if (filename) PetscValidCharPointer(filename,2); 485b399a63SLisandro Dalcin 49*71ed57bfSLisandro Dalcin /* determine filename and extension */ 505b399a63SLisandro Dalcin if (filename && filename[0]) { 51*71ed57bfSLisandro Dalcin ierr = PetscStrchr(filename,'.',(char **)&ext);CHKERRQ(ierr); 52*71ed57bfSLisandro Dalcin if (!ext) name = filename; 53*71ed57bfSLisandro Dalcin else if (ext != filename) { 54*71ed57bfSLisandro Dalcin size_t l1 = 0,l2 = 0; 555b399a63SLisandro Dalcin ierr = PetscStrlen(filename,&l1);CHKERRQ(ierr); 565b399a63SLisandro Dalcin ierr = PetscStrlen(ext,&l2);CHKERRQ(ierr); 57*71ed57bfSLisandro Dalcin ierr = PetscMemzero(buf,sizeof(buf));CHKERRQ(ierr); 58*71ed57bfSLisandro Dalcin ierr = PetscStrncpy(buf,filename,l1-l2+1);CHKERRQ(ierr); 59*71ed57bfSLisandro Dalcin name = buf; 605b399a63SLisandro Dalcin } 61*71ed57bfSLisandro Dalcin } 62*71ed57bfSLisandro Dalcin if (!name) {ierr = PetscObjectGetName((PetscObject)draw,&name);CHKERRQ(ierr);} 63*71ed57bfSLisandro Dalcin #if defined(PETSC_HAVE_AFTERIMAGE) 64*71ed57bfSLisandro Dalcin if (!ext) ext = ".Gif"; 65*71ed57bfSLisandro Dalcin #else 66*71ed57bfSLisandro Dalcin if (!ext) ext = ".ppm"; 67*71ed57bfSLisandro Dalcin else { 68*71ed57bfSLisandro Dalcin PetscBool match; 69*71ed57bfSLisandro Dalcin ierr = PetscStrcasecmp(ext,".ppm",&match);CHKERRQ(ierr); 70*71ed57bfSLisandro Dalcin if (!match) SETERRQ1(PetscObjectComm((PetscObject)draw),PETSC_ERR_SUP,"Image extension %s not supported, use .ppm",ext); 71*71ed57bfSLisandro Dalcin } 72*71ed57bfSLisandro Dalcin #endif 73*71ed57bfSLisandro Dalcin 74*71ed57bfSLisandro Dalcin ierr = PetscFree(draw->savefilename);CHKERRQ(ierr); 75*71ed57bfSLisandro Dalcin ierr = PetscFree(draw->savefilenameext);CHKERRQ(ierr); 76*71ed57bfSLisandro Dalcin ierr = PetscStrallocpy(name,&draw->savefilename);CHKERRQ(ierr); 77*71ed57bfSLisandro Dalcin ierr = PetscStrallocpy(ext,&draw->savefilenameext);CHKERRQ(ierr); 78*71ed57bfSLisandro Dalcin draw->savefilemovie = movie; 795b399a63SLisandro Dalcin if (draw->ops->setsave) { 805b399a63SLisandro Dalcin ierr = (*draw->ops->setsave)(draw,draw->savefilename);CHKERRQ(ierr); 815b399a63SLisandro Dalcin } 82*71ed57bfSLisandro Dalcin 83*71ed57bfSLisandro Dalcin if (draw->savesinglefile) { 84*71ed57bfSLisandro Dalcin ierr = PetscInfo2(NULL,"Will save image to file %s%s\n",draw->savefilename,draw->savefilenameext);CHKERRQ(ierr); 85*71ed57bfSLisandro Dalcin } else { 86*71ed57bfSLisandro Dalcin ierr = PetscInfo3(NULL,"Will save images to file %s/%s_*.%s\n",draw->savefilename,draw->savefilename,draw->savefilenameext);CHKERRQ(ierr); 87*71ed57bfSLisandro Dalcin } 88*71ed57bfSLisandro Dalcin if (draw->savefilemovie) { 89*71ed57bfSLisandro Dalcin ierr = PetscInfo1(NULL,"Will save movie to file %s.m4v\n",draw->savefilename);CHKERRQ(ierr); 90*71ed57bfSLisandro Dalcin } 915b399a63SLisandro Dalcin PetscFunctionReturn(0); 925b399a63SLisandro Dalcin } 935b399a63SLisandro Dalcin 945b399a63SLisandro Dalcin #undef __FUNCT__ 955b399a63SLisandro Dalcin #define __FUNCT__ "PetscDrawSetSaveFinalImage" 965b399a63SLisandro Dalcin /*@C 975b399a63SLisandro Dalcin PetscDrawSetSaveFinalImage - Saves the finale image produced in a PetscDraw into a file as a Gif file using AfterImage 985b399a63SLisandro Dalcin 995b399a63SLisandro Dalcin Collective on PetscDraw 1005b399a63SLisandro Dalcin 1015b399a63SLisandro Dalcin Input Parameter: 1025b399a63SLisandro Dalcin + draw - the graphics context 1035b399a63SLisandro Dalcin - filename - name of the file, if NULL uses name of draw object 1045b399a63SLisandro Dalcin 1055b399a63SLisandro Dalcin Options Database Command: 1065b399a63SLisandro Dalcin . -draw_save_final_image <filename> 1075b399a63SLisandro Dalcin 1085b399a63SLisandro Dalcin Level: intermediate 1095b399a63SLisandro Dalcin 1105b399a63SLisandro Dalcin Concepts: X windows^graphics 1115b399a63SLisandro Dalcin 1125b399a63SLisandro Dalcin Notes: You should call this BEFORE creating your image and calling PetscDrawFlush(). 1135b399a63SLisandro Dalcin 114*71ed57bfSLisandro Dalcin It is recommended that PETSc be configured with the option --with-afterimage to save the images. 115*71ed57bfSLisandro Dalcin If X windows generates an error message about X_CreateWindow() failing then Afterimage was installed without X windows. 116*71ed57bfSLisandro Dalcin Reinstall Afterimage using the following configure flags: 117*71ed57bfSLisandro Dalcin ./configure flags --x-includes=/pathtoXincludes --x-libraries=/pathtoXlibraries 118*71ed57bfSLisandro Dalcin For example under Mac OS X Mountain Lion: --x-includes=/opt/X11/include -x-libraries=/opt/X11/lib 1195b399a63SLisandro Dalcin 1205b399a63SLisandro Dalcin .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawSetSave() 1215b399a63SLisandro Dalcin @*/ 1225b399a63SLisandro Dalcin PetscErrorCode PetscDrawSetSaveFinalImage(PetscDraw draw,const char *filename) 1235b399a63SLisandro Dalcin { 1245b399a63SLisandro Dalcin PetscErrorCode ierr; 1255b399a63SLisandro Dalcin 1265b399a63SLisandro Dalcin PetscFunctionBegin; 1275b399a63SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 1285b399a63SLisandro Dalcin 129*71ed57bfSLisandro Dalcin ierr = PetscFree(draw->savefinalfilename);CHKERRQ(ierr); 1305b399a63SLisandro Dalcin if (filename && filename[0]) { 1315b399a63SLisandro Dalcin ierr = PetscStrallocpy(filename,&draw->savefinalfilename);CHKERRQ(ierr); 1325b399a63SLisandro Dalcin } else { 1335b399a63SLisandro Dalcin const char *name; 1345b399a63SLisandro Dalcin ierr = PetscObjectGetName((PetscObject)draw,&name);CHKERRQ(ierr); 1355b399a63SLisandro Dalcin ierr = PetscStrallocpy(name,&draw->savefinalfilename);CHKERRQ(ierr); 1365b399a63SLisandro Dalcin } 1375b399a63SLisandro Dalcin PetscFunctionReturn(0); 1385b399a63SLisandro Dalcin } 1395b399a63SLisandro Dalcin 1405b399a63SLisandro Dalcin #undef __FUNCT__ 1415b399a63SLisandro Dalcin #define __FUNCT__ "PetscDrawSave" 1425b399a63SLisandro Dalcin /*@ 1435b399a63SLisandro Dalcin PetscDrawSave - Saves a drawn image 1445b399a63SLisandro Dalcin 1455b399a63SLisandro Dalcin Collective on PetscDraw 1465b399a63SLisandro Dalcin 1475b399a63SLisandro Dalcin Input Parameters: 1485b399a63SLisandro Dalcin . draw - the drawing context 1495b399a63SLisandro Dalcin 1505b399a63SLisandro Dalcin Level: advanced 1515b399a63SLisandro Dalcin 1525b399a63SLisandro Dalcin Notes: this is not normally called by the user, it is called by PetscDrawFlush() to save a sequence of images. 1535b399a63SLisandro Dalcin 1545b399a63SLisandro Dalcin .seealso: PetscDrawSetSave() 1555b399a63SLisandro Dalcin 1565b399a63SLisandro Dalcin @*/ 1575b399a63SLisandro Dalcin PetscErrorCode PetscDrawSave(PetscDraw draw) 1585b399a63SLisandro Dalcin { 1595b399a63SLisandro Dalcin PetscErrorCode ierr; 1605b399a63SLisandro Dalcin 1615b399a63SLisandro Dalcin PetscFunctionBegin; 1625b399a63SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 1635b399a63SLisandro Dalcin if (draw->ops->save) { 1645b399a63SLisandro Dalcin ierr = (*draw->ops->save)(draw);CHKERRQ(ierr); 1655b399a63SLisandro Dalcin } 1665b399a63SLisandro Dalcin PetscFunctionReturn(0); 1675b399a63SLisandro Dalcin } 168