xref: /petsc/src/sys/classes/draw/interface/dsave.c (revision 71ed57bffcea9baf3f8f4292918aeee927f15d62)
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