xref: /petsc/src/sys/classes/draw/interface/drawreg.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
1*5c6c1daeSBarry Smith 
2*5c6c1daeSBarry Smith /*
3*5c6c1daeSBarry Smith        Provides the registration process for PETSc PetscDraw routines
4*5c6c1daeSBarry Smith */
5*5c6c1daeSBarry Smith #include <petsc-private/drawimpl.h>  /*I "petscdraw.h" I*/
6*5c6c1daeSBarry Smith 
7*5c6c1daeSBarry Smith /*
8*5c6c1daeSBarry Smith    Contains the list of registered PetscDraw routines
9*5c6c1daeSBarry Smith */
10*5c6c1daeSBarry Smith PetscFList PetscDrawList              = 0;
11*5c6c1daeSBarry Smith 
12*5c6c1daeSBarry Smith #undef __FUNCT__
13*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawCreate"
14*5c6c1daeSBarry Smith /*@C
15*5c6c1daeSBarry Smith    PetscDrawCreate - Creates a graphics context.
16*5c6c1daeSBarry Smith 
17*5c6c1daeSBarry Smith    Collective on MPI_Comm
18*5c6c1daeSBarry Smith 
19*5c6c1daeSBarry Smith    Input Parameter:
20*5c6c1daeSBarry Smith +  comm - MPI communicator
21*5c6c1daeSBarry Smith .  display - X display when using X windows
22*5c6c1daeSBarry Smith .  title - optional title added to top of window
23*5c6c1daeSBarry Smith .  x,y - coordinates of lower left corner of window or PETSC_DECIDE
24*5c6c1daeSBarry Smith -  w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE,
25*5c6c1daeSBarry Smith           or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE
26*5c6c1daeSBarry Smith 
27*5c6c1daeSBarry Smith    Output Parameter:
28*5c6c1daeSBarry Smith .  draw - location to put the PetscDraw context
29*5c6c1daeSBarry Smith 
30*5c6c1daeSBarry Smith    Level: beginner
31*5c6c1daeSBarry Smith 
32*5c6c1daeSBarry Smith    Concepts: graphics^creating context
33*5c6c1daeSBarry Smith    Concepts: drawing^creating context
34*5c6c1daeSBarry Smith 
35*5c6c1daeSBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType()
36*5c6c1daeSBarry Smith @*/
37*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw)
38*5c6c1daeSBarry Smith {
39*5c6c1daeSBarry Smith   PetscDraw      draw;
40*5c6c1daeSBarry Smith   PetscErrorCode ierr;
41*5c6c1daeSBarry Smith   PetscReal      dpause;
42*5c6c1daeSBarry Smith   PetscBool      flag;
43*5c6c1daeSBarry Smith 
44*5c6c1daeSBarry Smith   PetscFunctionBegin;
45*5c6c1daeSBarry Smith #ifndef PETSC_USE_DYNAMIC_LIBRARIES
46*5c6c1daeSBarry Smith   ierr = PetscDrawInitializePackage(PETSC_NULL);CHKERRQ(ierr);
47*5c6c1daeSBarry Smith #endif
48*5c6c1daeSBarry Smith   *indraw = 0;
49*5c6c1daeSBarry Smith   ierr = PetscHeaderCreate(draw,_p_PetscDraw,struct _PetscDrawOps,PETSC_DRAW_CLASSID,-1,"Draw","Graphics","Draw",comm,PetscDrawDestroy,0);CHKERRQ(ierr);
50*5c6c1daeSBarry Smith   draw->data    = 0;
51*5c6c1daeSBarry Smith   ierr          = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr);
52*5c6c1daeSBarry Smith   ierr          = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr);
53*5c6c1daeSBarry Smith   draw->x       = x;
54*5c6c1daeSBarry Smith   draw->y       = y;
55*5c6c1daeSBarry Smith   draw->w       = w;
56*5c6c1daeSBarry Smith   draw->h       = h;
57*5c6c1daeSBarry Smith   draw->pause   = 0.0;
58*5c6c1daeSBarry Smith   draw->coor_xl = 0.0;
59*5c6c1daeSBarry Smith   draw->coor_xr = 1.0;
60*5c6c1daeSBarry Smith   draw->coor_yl = 0.0;
61*5c6c1daeSBarry Smith   draw->coor_yr = 1.0;
62*5c6c1daeSBarry Smith   draw->port_xl = 0.0;
63*5c6c1daeSBarry Smith   draw->port_xr = 1.0;
64*5c6c1daeSBarry Smith   draw->port_yl = 0.0;
65*5c6c1daeSBarry Smith   draw->port_yr = 1.0;
66*5c6c1daeSBarry Smith   draw->popup   = 0;
67*5c6c1daeSBarry Smith   ierr = PetscOptionsGetReal(PETSC_NULL,"-draw_pause",&dpause,&flag);CHKERRQ(ierr);
68*5c6c1daeSBarry Smith   if (flag) draw->pause = dpause;
69*5c6c1daeSBarry Smith   draw->savefilename  = PETSC_NULL;
70*5c6c1daeSBarry Smith   draw->savefilemovie = PETSC_FALSE;
71*5c6c1daeSBarry Smith   draw->savefilecount = -1;
72*5c6c1daeSBarry Smith   ierr = PetscDrawSetCurrentPoint(draw,.5,.9);CHKERRQ(ierr);
73*5c6c1daeSBarry Smith   draw->boundbox_xl  = .5;
74*5c6c1daeSBarry Smith   draw->boundbox_xr  = .5;
75*5c6c1daeSBarry Smith   draw->boundbox_yl  = .9;
76*5c6c1daeSBarry Smith   draw->boundbox_yr  = .9;
77*5c6c1daeSBarry Smith 
78*5c6c1daeSBarry Smith   *indraw       = draw;
79*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
80*5c6c1daeSBarry Smith }
81*5c6c1daeSBarry Smith 
82*5c6c1daeSBarry Smith #undef __FUNCT__
83*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetType"
84*5c6c1daeSBarry Smith /*@C
85*5c6c1daeSBarry Smith    PetscDrawSetType - Builds graphics object for a particular implementation
86*5c6c1daeSBarry Smith 
87*5c6c1daeSBarry Smith    Collective on PetscDraw
88*5c6c1daeSBarry Smith 
89*5c6c1daeSBarry Smith    Input Parameter:
90*5c6c1daeSBarry Smith +  draw      - the graphics context
91*5c6c1daeSBarry Smith -  type      - for example, PETSC_DRAW_X
92*5c6c1daeSBarry Smith 
93*5c6c1daeSBarry Smith    Options Database Command:
94*5c6c1daeSBarry Smith .  -draw_type  <type> - Sets the type; use -help for a list
95*5c6c1daeSBarry Smith     of available methods (for instance, x)
96*5c6c1daeSBarry Smith 
97*5c6c1daeSBarry Smith    Level: intermediate
98*5c6c1daeSBarry Smith 
99*5c6c1daeSBarry Smith    Notes:
100*5c6c1daeSBarry Smith    See "petsc/include/petscdraw.h" for available methods (for instance,
101*5c6c1daeSBarry Smith    PETSC_DRAW_X)
102*5c6c1daeSBarry Smith 
103*5c6c1daeSBarry Smith    Concepts: drawing^X windows
104*5c6c1daeSBarry Smith    Concepts: X windows^graphics
105*5c6c1daeSBarry Smith    Concepts: drawing^Microsoft Windows
106*5c6c1daeSBarry Smith 
107*5c6c1daeSBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy()
108*5c6c1daeSBarry Smith @*/
109*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetType(PetscDraw draw,PetscDrawType type)
110*5c6c1daeSBarry Smith {
111*5c6c1daeSBarry Smith   PetscErrorCode ierr,(*r)(PetscDraw);
112*5c6c1daeSBarry Smith   PetscBool       match;
113*5c6c1daeSBarry Smith   PetscBool       flg=PETSC_FALSE;
114*5c6c1daeSBarry Smith 
115*5c6c1daeSBarry Smith   PetscFunctionBegin;
116*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
117*5c6c1daeSBarry Smith   PetscValidCharPointer(type,2);
118*5c6c1daeSBarry Smith 
119*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,type,&match);CHKERRQ(ierr);
120*5c6c1daeSBarry Smith   if (match) PetscFunctionReturn(0);
121*5c6c1daeSBarry Smith 
122*5c6c1daeSBarry Smith   /*  User requests no graphics */
123*5c6c1daeSBarry Smith   ierr = PetscOptionsHasName(PETSC_NULL,"-nox",&flg);CHKERRQ(ierr);
124*5c6c1daeSBarry Smith 
125*5c6c1daeSBarry Smith   /*
126*5c6c1daeSBarry Smith      This is not ideal, but it allows codes to continue to run if X graphics
127*5c6c1daeSBarry Smith    was requested but is not installed on this machine. Mostly this is for
128*5c6c1daeSBarry Smith    testing.
129*5c6c1daeSBarry Smith    */
130*5c6c1daeSBarry Smith #if !defined(PETSC_HAVE_X)
131*5c6c1daeSBarry Smith   if (!flg) {
132*5c6c1daeSBarry Smith     ierr = PetscStrcmp(type,PETSC_DRAW_X,&match);CHKERRQ(ierr);
133*5c6c1daeSBarry Smith     if (match) {
134*5c6c1daeSBarry Smith       PetscBool  dontwarn = PETSC_TRUE;
135*5c6c1daeSBarry Smith       flg = PETSC_TRUE;
136*5c6c1daeSBarry Smith       ierr = PetscOptionsHasName(PETSC_NULL,"-nox_warning",&dontwarn);CHKERRQ(ierr);
137*5c6c1daeSBarry Smith       if (!dontwarn) {
138*5c6c1daeSBarry Smith         (*PetscErrorPrintf)("PETSc installed without X windows on this machine\nproceeding without graphics\n");
139*5c6c1daeSBarry Smith       }
140*5c6c1daeSBarry Smith     }
141*5c6c1daeSBarry Smith   }
142*5c6c1daeSBarry Smith #endif
143*5c6c1daeSBarry Smith   if (flg) {
144*5c6c1daeSBarry Smith     type  = PETSC_DRAW_NULL;
145*5c6c1daeSBarry Smith   }
146*5c6c1daeSBarry Smith 
147*5c6c1daeSBarry Smith   if (draw->data) {
148*5c6c1daeSBarry Smith     /* destroy the old private PetscDraw context */
149*5c6c1daeSBarry Smith     ierr       = (*draw->ops->destroy)(draw);CHKERRQ(ierr);
150*5c6c1daeSBarry Smith     draw->ops->destroy = PETSC_NULL;
151*5c6c1daeSBarry Smith     draw->data = 0;
152*5c6c1daeSBarry Smith   }
153*5c6c1daeSBarry Smith 
154*5c6c1daeSBarry Smith   ierr =  PetscFListFind(PetscDrawList,((PetscObject)draw)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr);
155*5c6c1daeSBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDraw type given: %s",type);
156*5c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)draw,type);CHKERRQ(ierr);
157*5c6c1daeSBarry Smith   draw->data        = 0;
158*5c6c1daeSBarry Smith   ierr = (*r)(draw);CHKERRQ(ierr);
159*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
160*5c6c1daeSBarry Smith }
161*5c6c1daeSBarry Smith 
162*5c6c1daeSBarry Smith #undef __FUNCT__
163*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawRegisterDestroy"
164*5c6c1daeSBarry Smith /*@C
165*5c6c1daeSBarry Smith    PetscDrawRegisterDestroy - Frees the list of PetscDraw methods that were
166*5c6c1daeSBarry Smith    registered by PetscDrawRegisterDynamic().
167*5c6c1daeSBarry Smith 
168*5c6c1daeSBarry Smith    Not Collective
169*5c6c1daeSBarry Smith 
170*5c6c1daeSBarry Smith    Level: developer
171*5c6c1daeSBarry Smith 
172*5c6c1daeSBarry Smith .seealso: PetscDrawRegisterDynamic(), PetscDrawRegisterAll()
173*5c6c1daeSBarry Smith @*/
174*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawRegisterDestroy(void)
175*5c6c1daeSBarry Smith {
176*5c6c1daeSBarry Smith   PetscErrorCode ierr;
177*5c6c1daeSBarry Smith 
178*5c6c1daeSBarry Smith   PetscFunctionBegin;
179*5c6c1daeSBarry Smith   ierr = PetscFListDestroy(&PetscDrawList);CHKERRQ(ierr);
180*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
181*5c6c1daeSBarry Smith }
182*5c6c1daeSBarry Smith 
183*5c6c1daeSBarry Smith #undef __FUNCT__
184*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawGetType"
185*5c6c1daeSBarry Smith /*@C
186*5c6c1daeSBarry Smith    PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object.
187*5c6c1daeSBarry Smith 
188*5c6c1daeSBarry Smith    Not Collective
189*5c6c1daeSBarry Smith 
190*5c6c1daeSBarry Smith    Input Parameter:
191*5c6c1daeSBarry Smith .  draw - Krylov context
192*5c6c1daeSBarry Smith 
193*5c6c1daeSBarry Smith    Output Parameters:
194*5c6c1daeSBarry Smith .  name - name of PetscDraw method
195*5c6c1daeSBarry Smith 
196*5c6c1daeSBarry Smith    Level: advanced
197*5c6c1daeSBarry Smith 
198*5c6c1daeSBarry Smith @*/
199*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetType(PetscDraw draw,PetscDrawType *type)
200*5c6c1daeSBarry Smith {
201*5c6c1daeSBarry Smith   PetscFunctionBegin;
202*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
203*5c6c1daeSBarry Smith   PetscValidPointer(type,2);
204*5c6c1daeSBarry Smith   *type = ((PetscObject)draw)->type_name;
205*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
206*5c6c1daeSBarry Smith }
207*5c6c1daeSBarry Smith 
208*5c6c1daeSBarry Smith #undef __FUNCT__
209*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawRegister"
210*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawRegister(const char *sname,const char *path,const char *name,PetscErrorCode (*function)(PetscDraw))
211*5c6c1daeSBarry Smith {
212*5c6c1daeSBarry Smith   PetscErrorCode ierr;
213*5c6c1daeSBarry Smith   char fullname[PETSC_MAX_PATH_LEN];
214*5c6c1daeSBarry Smith 
215*5c6c1daeSBarry Smith   PetscFunctionBegin;
216*5c6c1daeSBarry Smith   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
217*5c6c1daeSBarry Smith   ierr = PetscFListAdd(&PetscDrawList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
218*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
219*5c6c1daeSBarry Smith }
220*5c6c1daeSBarry Smith 
221*5c6c1daeSBarry Smith #undef __FUNCT__
222*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetFromOptions"
223*5c6c1daeSBarry Smith /*@
224*5c6c1daeSBarry Smith    PetscDrawSetFromOptions - Sets the graphics type from the options database.
225*5c6c1daeSBarry Smith       Defaults to a PETSc X windows graphics.
226*5c6c1daeSBarry Smith 
227*5c6c1daeSBarry Smith    Collective on PetscDraw
228*5c6c1daeSBarry Smith 
229*5c6c1daeSBarry Smith    Input Parameter:
230*5c6c1daeSBarry Smith .     draw - the graphics context
231*5c6c1daeSBarry Smith 
232*5c6c1daeSBarry Smith    Options Database Keys:
233*5c6c1daeSBarry Smith +   -nox - do not use X graphics (ignore graphics calls, but run program correctly)
234*5c6c1daeSBarry Smith .   -nox_warning - when X windows support is not installed this prevents the warning message
235*5c6c1daeSBarry Smith                    from being printed
236*5c6c1daeSBarry Smith .   -draw_save [optional filename] - (X windows only) saves each image before it is cleared to a file
237*5c6c1daeSBarry Smith -   -draw_save_movie - converts image files to a movie  at the end of the run. See PetscDrawSetSave()
238*5c6c1daeSBarry Smith 
239*5c6c1daeSBarry Smith    Level: intermediate
240*5c6c1daeSBarry Smith 
241*5c6c1daeSBarry Smith    Notes:
242*5c6c1daeSBarry Smith     Must be called after PetscDrawCreate() before the PetscDrawtor is used.
243*5c6c1daeSBarry Smith 
244*5c6c1daeSBarry Smith     Concepts: drawing^setting options
245*5c6c1daeSBarry Smith     Concepts: graphics^setting options
246*5c6c1daeSBarry Smith 
247*5c6c1daeSBarry Smith .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave()
248*5c6c1daeSBarry Smith 
249*5c6c1daeSBarry Smith @*/
250*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetFromOptions(PetscDraw draw)
251*5c6c1daeSBarry Smith {
252*5c6c1daeSBarry Smith   PetscErrorCode ierr;
253*5c6c1daeSBarry Smith   PetscBool      flg,nox;
254*5c6c1daeSBarry Smith   char           vtype[256];
255*5c6c1daeSBarry Smith   const char     *def;
256*5c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X)
257*5c6c1daeSBarry Smith   PetscBool      warn;
258*5c6c1daeSBarry Smith #endif
259*5c6c1daeSBarry Smith 
260*5c6c1daeSBarry Smith   PetscFunctionBegin;
261*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
262*5c6c1daeSBarry Smith 
263*5c6c1daeSBarry Smith   if (!PetscDrawList) {
264*5c6c1daeSBarry Smith     ierr = PetscDrawRegisterAll(PETSC_NULL);CHKERRQ(ierr);
265*5c6c1daeSBarry Smith   }
266*5c6c1daeSBarry Smith 
267*5c6c1daeSBarry Smith   if (((PetscObject)draw)->type_name) {
268*5c6c1daeSBarry Smith     def = ((PetscObject)draw)->type_name;
269*5c6c1daeSBarry Smith   } else {
270*5c6c1daeSBarry Smith     ierr = PetscOptionsHasName(PETSC_NULL,"-nox",&nox);CHKERRQ(ierr);
271*5c6c1daeSBarry Smith     def  = PETSC_DRAW_NULL;
272*5c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS)
273*5c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_WIN32;
274*5c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X)
275*5c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_X;
276*5c6c1daeSBarry Smith #elif defined(PETSC_HAVE_GLUT)
277*5c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_GLUT;
278*5c6c1daeSBarry Smith #elif defined(PETSC_HAVE_OPENGLES)
279*5c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_OPENGLES;
280*5c6c1daeSBarry Smith #else
281*5c6c1daeSBarry Smith     ierr = PetscOptionsHasName(PETSC_NULL,"-nox_warning",&warn);CHKERRQ(ierr);
282*5c6c1daeSBarry Smith     if (!nox && !warn) {
283*5c6c1daeSBarry Smith       (*PetscErrorPrintf)("PETSc installed without X windows, Microsoft Graphics, OpenGL ES, or GLUT/OpenGL on this machine\nproceeding without graphics\n");
284*5c6c1daeSBarry Smith     }
285*5c6c1daeSBarry Smith #endif
286*5c6c1daeSBarry Smith   }
287*5c6c1daeSBarry Smith   ierr = PetscObjectOptionsBegin((PetscObject)draw);CHKERRQ(ierr);
288*5c6c1daeSBarry Smith     ierr = PetscOptionsList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);CHKERRQ(ierr);
289*5c6c1daeSBarry Smith     if (flg) {
290*5c6c1daeSBarry Smith       ierr = PetscDrawSetType(draw,vtype);CHKERRQ(ierr);
291*5c6c1daeSBarry Smith     } else if (!((PetscObject)draw)->type_name) {
292*5c6c1daeSBarry Smith       ierr = PetscDrawSetType(draw,def);CHKERRQ(ierr);
293*5c6c1daeSBarry Smith     }
294*5c6c1daeSBarry Smith     ierr = PetscOptionsName("-nox","Run without graphics","None",&nox);CHKERRQ(ierr);
295*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_X)
296*5c6c1daeSBarry Smith     {
297*5c6c1daeSBarry Smith       char      filename[PETSC_MAX_PATH_LEN];
298*5c6c1daeSBarry Smith       PetscBool save,movie = PETSC_FALSE;
299*5c6c1daeSBarry Smith       ierr = PetscOptionsBool("-draw_save_movie","Make a movie from the images saved (X Windows only)","PetscDrawSetSave",movie,&movie,PETSC_NULL);CHKERRQ(ierr);
300*5c6c1daeSBarry Smith       ierr = PetscOptionsString("-draw_save","Save graphics to file (X Windows only)","PetscDrawSetSave",filename,filename,PETSC_MAX_PATH_LEN,&save);CHKERRQ(ierr);
301*5c6c1daeSBarry Smith       if (save) {
302*5c6c1daeSBarry Smith         ierr = PetscDrawSetSave(draw,filename,movie);CHKERRQ(ierr);
303*5c6c1daeSBarry Smith       }
304*5c6c1daeSBarry Smith     }
305*5c6c1daeSBarry Smith #endif
306*5c6c1daeSBarry Smith 
307*5c6c1daeSBarry Smith     /* process any options handlers added with PetscObjectAddOptionsHandler() */
308*5c6c1daeSBarry Smith     ierr = PetscObjectProcessOptionsHandlers((PetscObject)draw);CHKERRQ(ierr);
309*5c6c1daeSBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
310*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
311*5c6c1daeSBarry Smith }
312*5c6c1daeSBarry Smith 
313*5c6c1daeSBarry Smith #undef __FUNCT__
314*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetSave"
315*5c6c1daeSBarry Smith /*@C
316*5c6c1daeSBarry Smith    PetscDrawSave - Saves images produced in a PetscDraw into a file as a Gif file using AfterImage
317*5c6c1daeSBarry Smith 
318*5c6c1daeSBarry Smith    Collective on PetscDraw
319*5c6c1daeSBarry Smith 
320*5c6c1daeSBarry Smith    Input Parameter:
321*5c6c1daeSBarry Smith +  draw      - the graphics context
322*5c6c1daeSBarry Smith .  filename  - name of the file, if PETSC_NULL uses name of draw object
323*5c6c1daeSBarry Smith -  movie - produce a movie of all the images
324*5c6c1daeSBarry Smith 
325*5c6c1daeSBarry Smith    Options Database Command:
326*5c6c1daeSBarry Smith +  -draw_save  <filename>
327*5c6c1daeSBarry Smith -  -draw_save_movie
328*5c6c1daeSBarry Smith 
329*5c6c1daeSBarry Smith    Level: intermediate
330*5c6c1daeSBarry Smith 
331*5c6c1daeSBarry Smith    Concepts: X windows^graphics
332*5c6c1daeSBarry Smith 
333*5c6c1daeSBarry Smith    Notes: You should call this BEFORE calling PetscDrawClear() and creating your image.
334*5c6c1daeSBarry Smith 
335*5c6c1daeSBarry Smith    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
336*5c6c1daeSBarry Smith 
337*5c6c1daeSBarry Smith    If X windows generates an error message about X_CreateWindow() failing then Afterimage was installed without X windows. Reinstall Afterimage using the
338*5c6c1daeSBarry Smith    ./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
339*5c6c1daeSBarry Smith 
340*5c6c1daeSBarry Smith 
341*5c6c1daeSBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawSave()
342*5c6c1daeSBarry Smith @*/
343*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetSave(PetscDraw draw,const char *filename,PetscBool movie)
344*5c6c1daeSBarry Smith {
345*5c6c1daeSBarry Smith   PetscErrorCode ierr;
346*5c6c1daeSBarry Smith 
347*5c6c1daeSBarry Smith   PetscFunctionBegin;
348*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
349*5c6c1daeSBarry Smith   ierr = PetscFree(draw->savefilename);CHKERRQ(ierr);
350*5c6c1daeSBarry Smith   draw->savefilemovie = movie;
351*5c6c1daeSBarry Smith   if (filename && filename[0]) {
352*5c6c1daeSBarry Smith     ierr = PetscStrallocpy(filename,&draw->savefilename);CHKERRQ(ierr);
353*5c6c1daeSBarry Smith   } else {
354*5c6c1daeSBarry Smith     const char *name;
355*5c6c1daeSBarry Smith     ierr = PetscObjectGetName((PetscObject)draw,&name);CHKERRQ(ierr);
356*5c6c1daeSBarry Smith     ierr = PetscStrallocpy(name,&draw->savefilename);CHKERRQ(ierr);
357*5c6c1daeSBarry Smith   }
358*5c6c1daeSBarry Smith   if (draw->ops->setsave) {
359*5c6c1daeSBarry Smith     ierr = (*draw->ops->setsave)(draw,filename);CHKERRQ(ierr);
360*5c6c1daeSBarry Smith   }
361*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
362*5c6c1daeSBarry Smith }
363