1*5b399a63SLisandro Dalcin #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 2*5b399a63SLisandro Dalcin 3*5b399a63SLisandro Dalcin #undef __FUNCT__ 4*5b399a63SLisandro Dalcin #define __FUNCT__ "PetscDrawSetSave" 5*5b399a63SLisandro Dalcin /*@C 6*5b399a63SLisandro Dalcin PetscDrawSetSave - Saves images produced in a PetscDraw into a file as a Gif file using AfterImage 7*5b399a63SLisandro Dalcin 8*5b399a63SLisandro Dalcin Collective on PetscDraw 9*5b399a63SLisandro Dalcin 10*5b399a63SLisandro Dalcin Input Parameter: 11*5b399a63SLisandro Dalcin + draw - the graphics context 12*5b399a63SLisandro 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 13*5b399a63SLisandro Dalcin - movie - produce a movie of all the images 14*5b399a63SLisandro Dalcin 15*5b399a63SLisandro Dalcin Options Database Command: 16*5b399a63SLisandro Dalcin + -draw_save <filename> - filename could be name.ext or .ext (where .ext determines the type of graphics file to save, for example .Gif) 17*5b399a63SLisandro Dalcin . -draw_save_movie 18*5b399a63SLisandro Dalcin . -draw_save_final_image [optional filename] - (X windows only) saves the final image displayed in a window 19*5b399a63SLisandro Dalcin . -draw_save_on_flush - saves an image on each flush in addition to each clear 20*5b399a63SLisandro 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 21*5b399a63SLisandro Dalcin 22*5b399a63SLisandro Dalcin Level: intermediate 23*5b399a63SLisandro Dalcin 24*5b399a63SLisandro Dalcin Concepts: X windows^graphics 25*5b399a63SLisandro Dalcin 26*5b399a63SLisandro Dalcin Notes: You should call this BEFORE creating your image and calling PetscDrawFlush(). 27*5b399a63SLisandro Dalcin 28*5b399a63SLisandro Dalcin Requires that PETSc be configured with the option --with-afterimage to save the images and ffmpeg must be in your path to make the movie 29*5b399a63SLisandro Dalcin 30*5b399a63SLisandro 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*5b399a63SLisandro Dalcin 32*5b399a63SLisandro Dalcin If X windows generates an error message about X_CreateWindow() failing then Afterimage was installed without X windows. Reinstall Afterimage using the 33*5b399a63SLisandro Dalcin ./configure flags --x-includes=/pathtoXincludes --x-libraries=/pathtoXlibraries For example under Mac OS X Mountain Lion --x-includes=/opt/X11/include -x-libraries=/opt/X11/lib 34*5b399a63SLisandro Dalcin 35*5b399a63SLisandro Dalcin 36*5b399a63SLisandro Dalcin .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawSetSaveFinalImage() 37*5b399a63SLisandro Dalcin @*/ 38*5b399a63SLisandro Dalcin PetscErrorCode PetscDrawSetSave(PetscDraw draw,const char *filename,PetscBool movie) 39*5b399a63SLisandro Dalcin { 40*5b399a63SLisandro Dalcin PetscErrorCode ierr; 41*5b399a63SLisandro Dalcin char *ext; 42*5b399a63SLisandro Dalcin 43*5b399a63SLisandro Dalcin PetscFunctionBegin; 44*5b399a63SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 45*5b399a63SLisandro Dalcin ierr = PetscFree(draw->savefilename);CHKERRQ(ierr); 46*5b399a63SLisandro Dalcin 47*5b399a63SLisandro Dalcin /* determine extension of filename */ 48*5b399a63SLisandro Dalcin if (filename && filename[0]) { 49*5b399a63SLisandro Dalcin ierr = PetscStrchr(filename,'.',&ext);CHKERRQ(ierr); 50*5b399a63SLisandro Dalcin if (!ext) SETERRQ1(PetscObjectComm((PetscObject)draw),PETSC_ERR_ARG_INCOMP,"Filename %s should end with graphics extension (for example .Gif)",filename); 51*5b399a63SLisandro Dalcin } else { 52*5b399a63SLisandro Dalcin ext = (char *)".Gif"; 53*5b399a63SLisandro Dalcin } 54*5b399a63SLisandro Dalcin if (ext == filename) filename = NULL; 55*5b399a63SLisandro Dalcin ierr = PetscStrallocpy(ext,&draw->savefilenameext);CHKERRQ(ierr); 56*5b399a63SLisandro Dalcin 57*5b399a63SLisandro Dalcin draw->savefilemovie = movie; 58*5b399a63SLisandro Dalcin if (filename && filename[0]) { 59*5b399a63SLisandro Dalcin size_t l1,l2; 60*5b399a63SLisandro Dalcin ierr = PetscStrlen(filename,&l1);CHKERRQ(ierr); 61*5b399a63SLisandro Dalcin ierr = PetscStrlen(ext,&l2);CHKERRQ(ierr); 62*5b399a63SLisandro Dalcin ierr = PetscMalloc1(l1-l2+1,&draw->savefilename);CHKERRQ(ierr); 63*5b399a63SLisandro Dalcin ierr = PetscStrncpy(draw->savefilename,filename,l1-l2+1);CHKERRQ(ierr); 64*5b399a63SLisandro Dalcin } else { 65*5b399a63SLisandro Dalcin const char *name; 66*5b399a63SLisandro Dalcin 67*5b399a63SLisandro Dalcin ierr = PetscObjectGetName((PetscObject)draw,&name);CHKERRQ(ierr); 68*5b399a63SLisandro Dalcin ierr = PetscStrallocpy(name,&draw->savefilename);CHKERRQ(ierr); 69*5b399a63SLisandro Dalcin } 70*5b399a63SLisandro Dalcin ierr = PetscInfo2(NULL,"Will save images to file %s%s\n",draw->savefilename,draw->savefilenameext);CHKERRQ(ierr); 71*5b399a63SLisandro Dalcin if (draw->ops->setsave) { 72*5b399a63SLisandro Dalcin ierr = (*draw->ops->setsave)(draw,draw->savefilename);CHKERRQ(ierr); 73*5b399a63SLisandro Dalcin } 74*5b399a63SLisandro Dalcin PetscFunctionReturn(0); 75*5b399a63SLisandro Dalcin } 76*5b399a63SLisandro Dalcin 77*5b399a63SLisandro Dalcin #undef __FUNCT__ 78*5b399a63SLisandro Dalcin #define __FUNCT__ "PetscDrawSetSaveFinalImage" 79*5b399a63SLisandro Dalcin /*@C 80*5b399a63SLisandro Dalcin PetscDrawSetSaveFinalImage - Saves the finale image produced in a PetscDraw into a file as a Gif file using AfterImage 81*5b399a63SLisandro Dalcin 82*5b399a63SLisandro Dalcin Collective on PetscDraw 83*5b399a63SLisandro Dalcin 84*5b399a63SLisandro Dalcin Input Parameter: 85*5b399a63SLisandro Dalcin + draw - the graphics context 86*5b399a63SLisandro Dalcin - filename - name of the file, if NULL uses name of draw object 87*5b399a63SLisandro Dalcin 88*5b399a63SLisandro Dalcin Options Database Command: 89*5b399a63SLisandro Dalcin . -draw_save_final_image <filename> 90*5b399a63SLisandro Dalcin 91*5b399a63SLisandro Dalcin Level: intermediate 92*5b399a63SLisandro Dalcin 93*5b399a63SLisandro Dalcin Concepts: X windows^graphics 94*5b399a63SLisandro Dalcin 95*5b399a63SLisandro Dalcin Notes: You should call this BEFORE creating your image and calling PetscDrawFlush(). 96*5b399a63SLisandro Dalcin 97*5b399a63SLisandro Dalcin Requires that PETSc be configured with the option --with-afterimage to save the images and ffmpeg must be in your path to make the movie 98*5b399a63SLisandro Dalcin 99*5b399a63SLisandro Dalcin If X windows generates an error message about X_CreateWindow() failing then Afterimage was installed without X windows. Reinstall Afterimage using the 100*5b399a63SLisandro Dalcin ./configure flags --x-includes=/pathtoXincludes --x-libraries=/pathtoXlibraries For example under Mac OS X Mountain Lion --x-includes=/opt/X11/include -x-libraries=/opt/X11/lib 101*5b399a63SLisandro Dalcin 102*5b399a63SLisandro Dalcin 103*5b399a63SLisandro Dalcin .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawSetSave() 104*5b399a63SLisandro Dalcin @*/ 105*5b399a63SLisandro Dalcin PetscErrorCode PetscDrawSetSaveFinalImage(PetscDraw draw,const char *filename) 106*5b399a63SLisandro Dalcin { 107*5b399a63SLisandro Dalcin PetscErrorCode ierr; 108*5b399a63SLisandro Dalcin 109*5b399a63SLisandro Dalcin PetscFunctionBegin; 110*5b399a63SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 111*5b399a63SLisandro Dalcin ierr = PetscFree(draw->savefinalfilename);CHKERRQ(ierr); 112*5b399a63SLisandro Dalcin 113*5b399a63SLisandro Dalcin if (filename && filename[0]) { 114*5b399a63SLisandro Dalcin ierr = PetscStrallocpy(filename,&draw->savefinalfilename);CHKERRQ(ierr); 115*5b399a63SLisandro Dalcin } else { 116*5b399a63SLisandro Dalcin const char *name; 117*5b399a63SLisandro Dalcin ierr = PetscObjectGetName((PetscObject)draw,&name);CHKERRQ(ierr); 118*5b399a63SLisandro Dalcin ierr = PetscStrallocpy(name,&draw->savefinalfilename);CHKERRQ(ierr); 119*5b399a63SLisandro Dalcin } 120*5b399a63SLisandro Dalcin PetscFunctionReturn(0); 121*5b399a63SLisandro Dalcin } 122*5b399a63SLisandro Dalcin 123*5b399a63SLisandro Dalcin #undef __FUNCT__ 124*5b399a63SLisandro Dalcin #define __FUNCT__ "PetscDrawSave" 125*5b399a63SLisandro Dalcin /*@ 126*5b399a63SLisandro Dalcin PetscDrawSave - Saves a drawn image 127*5b399a63SLisandro Dalcin 128*5b399a63SLisandro Dalcin Collective on PetscDraw 129*5b399a63SLisandro Dalcin 130*5b399a63SLisandro Dalcin Input Parameters: 131*5b399a63SLisandro Dalcin . draw - the drawing context 132*5b399a63SLisandro Dalcin 133*5b399a63SLisandro Dalcin Level: advanced 134*5b399a63SLisandro Dalcin 135*5b399a63SLisandro Dalcin Notes: this is not normally called by the user, it is called by PetscDrawFlush() to save a sequence of images. 136*5b399a63SLisandro Dalcin 137*5b399a63SLisandro Dalcin .seealso: PetscDrawSetSave() 138*5b399a63SLisandro Dalcin 139*5b399a63SLisandro Dalcin @*/ 140*5b399a63SLisandro Dalcin PetscErrorCode PetscDrawSave(PetscDraw draw) 141*5b399a63SLisandro Dalcin { 142*5b399a63SLisandro Dalcin PetscErrorCode ierr; 143*5b399a63SLisandro Dalcin 144*5b399a63SLisandro Dalcin PetscFunctionBegin; 145*5b399a63SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 146*5b399a63SLisandro Dalcin if (draw->ops->save) { 147*5b399a63SLisandro Dalcin ierr = (*draw->ops->save)(draw);CHKERRQ(ierr); 148*5b399a63SLisandro Dalcin } 149*5b399a63SLisandro Dalcin PetscFunctionReturn(0); 150*5b399a63SLisandro Dalcin } 151