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